1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s 3 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 4 5 // Clang used to crash trying to recover while adding 'this->' before Work(x); 6 7 template <typename> struct A { 8 static void Work(int); // expected-note{{must qualify identifier}} 9 }; 10 11 template <typename T> struct B : public A<T> { BB12 template <typename T2> B(T2 x) { 13 Work(x); // expected-error{{use of undeclared identifier}} 14 } 15 }; 16 Test()17void Test() { 18 B<int> b(0); // expected-note{{in instantiation of function template}} 19 } 20 21 22 // Don't crash here. 23 namespace PR16134 { 24 template <class P> struct S // expected-error {{expected ';'}} 25 template <> static S<Q>::f() // expected-error +{{}} 26 } 27 28 namespace PR16225 { 29 template <typename T> void f(); g(C *)30 template <typename C> void g(C*) { 31 struct LocalStruct : UnknownBase<Mumble, C> { }; // expected-error {{unknown template name 'UnknownBase'}} \ 32 // expected-error {{use of undeclared identifier 'Mumble'}} 33 f<LocalStruct>(); 34 #if __cplusplus <= 199711L 35 // expected-warning@-2 {{template argument uses local type 'LocalStruct'}} 36 #endif 37 } 38 struct S; h()39 void h() { 40 g<S>(0); 41 #if __cplusplus <= 199711L 42 // expected-note@-2 {{in instantiation of function template specialization}} 43 #endif 44 } 45 } 46 47 namespace test1 { 48 template <typename> class ArraySlice {}; 49 class Foo; 50 class NonTemplateClass { 51 void MemberFunction(ArraySlice<Foo>, int); 52 template <class T> void MemberFuncTemplate(ArraySlice<T>, int); 53 }; MemberFunction(ArraySlice<Foo> resource_data,int now)54 void NonTemplateClass::MemberFunction(ArraySlice<Foo> resource_data, 55 int now) { 56 // expected-note@+1 {{in instantiation of function template specialization 'test1::NonTemplateClass::MemberFuncTemplate<test1::Foo>'}} 57 MemberFuncTemplate(resource_data, now); 58 } 59 template <class T> MemberFuncTemplate(ArraySlice<T> resource_data,int)60 void NonTemplateClass::MemberFuncTemplate(ArraySlice<T> resource_data, int) { 61 // expected-error@+1 {{use of undeclared identifier 'UndeclaredMethod'}} 62 UndeclaredMethod(resource_data); 63 } 64 // expected-error@+2 {{out-of-line definition of 'UndeclaredMethod' does not match any declaration}} 65 // expected-note@+1 {{must qualify identifier to find this declaration in dependent base class}} UndeclaredMethod()66 void NonTemplateClass::UndeclaredMethod() {} 67 } 68