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