1 // RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -verify -std=c++11 %s 2 3 template <class T> 4 class A { foo()5 void foo() { 6 undeclared(); 7 } 8 void foo2(); 9 }; 10 11 template <class T> 12 class B { foo4()13 void foo4() { } // expected-note {{previous definition is here}} foo4()14 void foo4() { } // expected-error {{class member cannot be redeclared}} foo5()15 void foo5() { } // expected-note {{previous definition is here}} 16 foo3()17 friend void foo3() { 18 undeclared(); 19 } 20 }; 21 22 23 template <class T> foo5()24void B<T>::foo5() { // expected-error {{redefinition of 'foo5'}} 25 } 26 27 template <class T> foo2()28void A<T>::foo2() { 29 undeclared(); 30 } 31 32 33 template <class T> foo3()34void foo3() { 35 undeclared(); 36 } 37 38 template void A<int>::foo2(); 39 40 undeclared()41void undeclared() 42 { 43 44 } 45 foo5()46template <class T> void foo5() {} //expected-note {{previous definition is here}} foo5()47template <class T> void foo5() {} // expected-error {{redefinition of 'foo5'}} 48 49 50 51 namespace Inner_Outer_same_template_param_name { 52 53 template <class T> 54 class Outmost { 55 public: 56 template <class T> 57 class Inner { 58 public: f()59 void f() { 60 T* var; 61 } 62 }; 63 }; 64 65 } 66 67 68 namespace PR11931 { 69 70 template <typename RunType> 71 struct BindState; 72 73 template<> 74 struct BindState<void(void*)> { RunPR11931::BindState75 static void Run() { } 76 }; 77 78 class Callback { 79 public: 80 typedef void RunType(); 81 82 template <typename RunType> Callback(BindState<RunType> bind_state)83 Callback(BindState<RunType> bind_state) { 84 BindState<RunType>::Run(); 85 } 86 }; 87 88 Bind()89Callback Bind() { 90 return Callback(BindState<void(void*)>()); 91 } 92 93 } 94 95 namespace rdar11700604 { 96 template<typename T> void foo() = delete; 97 98 struct X { 99 X() = default; 100 101 template<typename T> void foo() = delete; 102 }; 103 } 104 105 namespace PR17334 { 106 107 template <typename = void> struct ArrayRef { ArrayRefPR17334::ArrayRef108 constexpr ArrayRef() {} 109 }; CreateConstInBoundsGEP2_32()110template <typename = void> void CreateConstInBoundsGEP2_32() { 111 ArrayRef<> IdxList; 112 } LLVMBuildStructGEP()113void LLVMBuildStructGEP() { CreateConstInBoundsGEP2_32(); } 114 115 } 116 117 namespace PR17661 { 118 template <typename T> Fun(T A)119constexpr T Fun(T A) { return T(0); } 120 121 constexpr int Var = Fun(20); 122 } 123 124 template <typename T> invalidTrailingRetType()125auto invalidTrailingRetType() -> Bogus {} // expected-error {{unknown type name 'Bogus'}} 126 127 namespace PR19613 { 128 129 struct HeapTypeConfig { 130 static void from_bitset(); 131 }; 132 133 template <class Config> 134 struct TypeImpl { 135 struct BitsetType; 136 AnyPR19613::TypeImpl137 static void Any() { 138 BitsetType::New(); 139 } 140 }; 141 142 template<class Config> 143 struct TypeImpl<Config>::BitsetType { NewPR19613::TypeImpl::BitsetType144 static void New() { 145 Config::from_bitset(); 146 } 147 }; 148 f()149static void f() { 150 TypeImpl<HeapTypeConfig>::Any(); 151 } 152 153 template<typename A> struct S { 154 template<typename B> struct T; 155 }; 156 template<typename A> template<typename B> struct S<A>::T { 157 template<typename C, typename D> struct U; 158 template<typename C> struct U<C, C> { fPR19613::S::T::U159 template<typename E> static int f() { 160 return sizeof(A) + sizeof(B) + sizeof(C) + sizeof(E); 161 } 162 }; 163 }; 164 g()165static void g() { 166 S<int>::T<int>::U<int,int>::f<int>(); 167 } 168 169 template<typename T> struct SS { 170 template<typename U> struct X; 171 template<typename U> struct X<U*>; 172 }; 173 template<typename T> template<typename U> struct SS<T>::X<U*> { fPR19613::SS::X174 static int f() { 175 return sizeof(T) + sizeof(U); 176 } 177 }; 178 h()179static void h() { 180 SS<int>::X<int*>::f(); 181 } 182 183 } 184