xref: /aosp_15_r20/external/clang/test/SemaCXX/PR11358.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -verify
2*67e74705SXin Li // PR11358
3*67e74705SXin Li 
4*67e74705SXin Li namespace test1 {
5*67e74705SXin Li   template<typename T>
6*67e74705SXin Li   struct container {
7*67e74705SXin Li     class iterator {};
begintest1::container8*67e74705SXin Li     iterator begin() { return iterator(); }
9*67e74705SXin Li   };
10*67e74705SXin Li 
11*67e74705SXin Li   template<typename T>
12*67e74705SXin Li   struct Test {
13*67e74705SXin Li     typedef container<T> Container;
testtest1::Test14*67e74705SXin Li     void test() {
15*67e74705SXin Li       Container::iterator i = c.begin(); // expected-error{{missing 'typename'}}
16*67e74705SXin Li     }
17*67e74705SXin Li     Container c;
18*67e74705SXin Li   };
19*67e74705SXin Li }
20*67e74705SXin Li 
21*67e74705SXin Li namespace test2 {
22*67e74705SXin Li   template <typename Key, typename Value>
23*67e74705SXin Li   class hash_map {
24*67e74705SXin Li     class const_iterator { void operator++(); };
25*67e74705SXin Li     const_iterator begin() const;
26*67e74705SXin Li     const_iterator end() const;
27*67e74705SXin Li   };
28*67e74705SXin Li 
29*67e74705SXin Li   template <typename KeyType, typename ValueType>
MapTest(hash_map<KeyType,ValueType> map)30*67e74705SXin Li   void MapTest(hash_map<KeyType, ValueType> map) {
31*67e74705SXin Li     for (hash_map<KeyType, ValueType>::const_iterator it = map.begin(); // expected-error{{missing 'typename'}}
32*67e74705SXin Li          it != map.end(); it++) {
33*67e74705SXin Li     }
34*67e74705SXin Li   }
35*67e74705SXin Li }
36*67e74705SXin Li 
37*67e74705SXin Li namespace test3 {
38*67e74705SXin Li   template<typename T>
39*67e74705SXin Li   struct container {
40*67e74705SXin Li     class iterator {};
41*67e74705SXin Li   };
42*67e74705SXin Li 
43*67e74705SXin Li   template<typename T>
44*67e74705SXin Li   struct Test {
45*67e74705SXin Li     typedef container<T> Container;
testtest3::Test46*67e74705SXin Li     void test() {
47*67e74705SXin Li       Container::iterator const i; // expected-error{{missing 'typename'}}
48*67e74705SXin Li     }
49*67e74705SXin Li     Container c;
50*67e74705SXin Li   };
51*67e74705SXin Li }
52