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