DelayedTemplateParsing.cpp revision 651f13cea278ec967336033dd032faef0e9fc2ec
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}} expected-note {{previous definition is here}} 14 void foo4() { } // expected-error {{class member cannot be redeclared}} expected-error {{redefinition of 'foo4'}} 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