1443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky// RUN: %clang_cc1 %s -verify
2443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky// PR11358
3443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky
4443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewyckynamespace test1 {
5443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  template<typename T>
6443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  struct container {
7443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    class iterator {};
8443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    iterator begin() { return iterator(); }
9443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  };
10443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky
11443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  template<typename T>
12443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  struct Test {
13443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    typedef container<T> Container;
14443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    void test() {
15443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky      Container::iterator i = c.begin(); // expected-error{{missing 'typename'}}
16443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    }
17443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    Container c;
18443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  };
19443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky}
20443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky
21443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewyckynamespace test2 {
22443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  template <typename Key, typename Value>
23443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  class hash_map {
24443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    class const_iterator { void operator++(); };
25443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    const_iterator begin() const;
26443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    const_iterator end() const;
27443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  };
28443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky
29443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  template <typename KeyType, typename ValueType>
30443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  void MapTest(hash_map<KeyType, ValueType> map) {
31443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    for (hash_map<KeyType, ValueType>::const_iterator it = map.begin(); // expected-error{{missing 'typename'}}
32443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky         it != map.end(); it++) {
33443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    }
34443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  }
35443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky}
36443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky
37443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewyckynamespace test3 {
38443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  template<typename T>
39443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  struct container {
40443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    class iterator {};
41443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  };
42443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky
43443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  template<typename T>
44443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  struct Test {
45443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    typedef container<T> Container;
46443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    void test() {
47443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky      Container::iterator const i; // expected-error{{missing 'typename'}}
48443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    }
49443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky    Container c;
50443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky  };
51443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky}
52