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