// RUN: %clang_cc1 -fsyntax-only -verify %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s // Clang used to crash trying to recover while adding 'this->' before Work(x); template <typename> struct A { static void Work(int); // expected-note{{must qualify identifier}} }; template <typename T> struct B : public A<T> { template <typename T2> B(T2 x) { Work(x); // expected-error{{use of undeclared identifier}} } }; void Test() { B<int> b(0); // expected-note{{in instantiation of function template}} } // Don't crash here. namespace PR16134 { template <class P> struct S // expected-error {{expected ';'}} template <> static S<Q>::f() // expected-error +{{}} } namespace PR16225 { template <typename T> void f(); template <typename C> void g(C*) { struct LocalStruct : UnknownBase<Mumble, C> { }; // expected-error {{unknown template name 'UnknownBase'}} \ // expected-error {{use of undeclared identifier 'Mumble'}} f<LocalStruct>(); #if __cplusplus <= 199711L // expected-warning@-2 {{template argument uses local type 'LocalStruct'}} #endif } struct S; void h() { g<S>(0); #if __cplusplus <= 199711L // expected-note@-2 {{in instantiation of function template specialization}} #endif } } namespace test1 { template <typename> class ArraySlice {}; class Foo; class NonTemplateClass { void MemberFunction(ArraySlice<Foo>, int); template <class T> void MemberFuncTemplate(ArraySlice<T>, int); }; void NonTemplateClass::MemberFunction(ArraySlice<Foo> resource_data, int now) { // expected-note@+1 {{in instantiation of function template specialization 'test1::NonTemplateClass::MemberFuncTemplate<test1::Foo>'}} MemberFuncTemplate(resource_data, now); } template <class T> void NonTemplateClass::MemberFuncTemplate(ArraySlice<T> resource_data, int) { // expected-error@+1 {{use of undeclared identifier 'UndeclaredMethod'}} UndeclaredMethod(resource_data); } // expected-error@+2 {{out-of-line definition of 'UndeclaredMethod' does not match any declaration}} // expected-note@+1 {{must qualify identifier to find this declaration in dependent base class}} void NonTemplateClass::UndeclaredMethod() {} }