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