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