|  | // RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -verify -std=c++11 %s | 
|  |  | 
|  | template <class T> | 
|  | class A { | 
|  | void foo() { | 
|  | undeclared(); | 
|  | } | 
|  | void foo2(); | 
|  | }; | 
|  |  | 
|  | template <class T> | 
|  | class B { | 
|  | void foo4() { } // expected-note {{previous definition is here}} | 
|  | void foo4() { } // expected-error {{class member cannot be redeclared}} | 
|  | void foo5() { } // expected-note {{previous definition is here}} | 
|  |  | 
|  | friend void foo3() { | 
|  | undeclared(); | 
|  | } | 
|  | }; | 
|  |  | 
|  |  | 
|  | template <class T> | 
|  | void B<T>::foo5() { // expected-error {{redefinition of 'foo5'}} | 
|  | } | 
|  |  | 
|  | template <class T> | 
|  | void A<T>::foo2() { | 
|  | undeclared(); | 
|  | } | 
|  |  | 
|  |  | 
|  | template <class T> | 
|  | void foo3() { | 
|  | undeclared(); | 
|  | } | 
|  |  | 
|  | template void A<int>::foo2(); | 
|  |  | 
|  |  | 
|  | void undeclared() | 
|  | { | 
|  |  | 
|  | } | 
|  |  | 
|  | template <class T> void foo5() {} //expected-note {{previous definition is here}} | 
|  | template <class T> void foo5() {} // expected-error {{redefinition of 'foo5'}} | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | namespace PR11931 { | 
|  |  | 
|  | template <typename RunType> | 
|  | struct BindState; | 
|  |  | 
|  | template<> | 
|  | struct BindState<void(void*)> { | 
|  | static void Run() { } | 
|  | }; | 
|  |  | 
|  | class Callback { | 
|  | public: | 
|  | typedef void RunType(); | 
|  |  | 
|  | template <typename RunType> | 
|  | Callback(BindState<RunType> bind_state) { | 
|  | BindState<RunType>::Run(); | 
|  | } | 
|  | }; | 
|  |  | 
|  |  | 
|  | Callback Bind() { | 
|  | return Callback(BindState<void(void*)>()); | 
|  | } | 
|  |  | 
|  | } | 
|  |  | 
|  | namespace rdar11700604 { | 
|  | template<typename T> void foo() = delete; | 
|  |  | 
|  | struct X { | 
|  | X() = default; | 
|  |  | 
|  | template<typename T> void foo() = delete; | 
|  | }; | 
|  | } | 
|  |  | 
|  | namespace PR17334 { | 
|  |  | 
|  | template <typename = void> struct ArrayRef { | 
|  | constexpr ArrayRef() {} | 
|  | }; | 
|  | template <typename = void> void CreateConstInBoundsGEP2_32() { | 
|  | ArrayRef<> IdxList; | 
|  | } | 
|  | void LLVMBuildStructGEP() { CreateConstInBoundsGEP2_32(); } | 
|  |  | 
|  | } | 
|  |  | 
|  | namespace PR17661 { | 
|  | template <typename T> | 
|  | constexpr T Fun(T A) { return T(0); } | 
|  |  | 
|  | constexpr int Var = Fun(20); | 
|  | } | 
|  |  | 
|  | template <typename T> | 
|  | auto invalidTrailingRetType() -> Bogus {} // expected-error {{unknown type name 'Bogus'}} | 
|  |  | 
|  | namespace PR19613 { | 
|  |  | 
|  | struct HeapTypeConfig { | 
|  | static void from_bitset(); | 
|  | }; | 
|  |  | 
|  | template <class Config> | 
|  | struct TypeImpl  { | 
|  | struct BitsetType; | 
|  |  | 
|  | static void Any() { | 
|  | BitsetType::New(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | template<class Config> | 
|  | struct TypeImpl<Config>::BitsetType { | 
|  | static void New() { | 
|  | Config::from_bitset(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | static void f() { | 
|  | TypeImpl<HeapTypeConfig>::Any(); | 
|  | } | 
|  |  | 
|  | template<typename A> struct S { | 
|  | template<typename B> struct T; | 
|  | }; | 
|  | template<typename A> template<typename B> struct S<A>::T { | 
|  | template<typename C, typename D> struct U; | 
|  | template<typename C> struct U<C, C> { | 
|  | template<typename E> static int f() { | 
|  | return sizeof(A) + sizeof(B) + sizeof(C) + sizeof(E); | 
|  | } | 
|  | }; | 
|  | }; | 
|  |  | 
|  | static void g() { | 
|  | S<int>::T<int>::U<int,int>::f<int>(); | 
|  | } | 
|  |  | 
|  | template<typename T> struct SS { | 
|  | template<typename U> struct X; | 
|  | template<typename U> struct X<U*>; | 
|  | }; | 
|  | template<typename T> template<typename U> struct SS<T>::X<U*> { | 
|  | static int f() { | 
|  | return sizeof(T) + sizeof(U); | 
|  | } | 
|  | }; | 
|  |  | 
|  | static void h() { | 
|  | SS<int>::X<int*>::f(); | 
|  | } | 
|  |  | 
|  | } | 
|  |  | 
|  | struct PR38460 { | 
|  | template <typename> | 
|  | struct T { | 
|  | static void foo() { | 
|  | struct U { | 
|  | void dummy() { | 
|  | use_delayed_identifier(); | 
|  | } | 
|  | }; | 
|  | } | 
|  | }; | 
|  | }; | 
|  | void use_delayed_identifier(); | 
|  | void trigger_PR38460() { | 
|  | PR38460::T<int>::foo(); | 
|  | } | 
|  |  | 
|  | template <typename> struct PR38460_2 { | 
|  | struct p { | 
|  | struct G { | 
|  | bool operator()(int) {} | 
|  | }; | 
|  | }; | 
|  | static void as() { | 
|  | typename p::G g; | 
|  | g(0); | 
|  | } | 
|  | }; | 
|  | template struct PR38460_2<int>; |