// 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 struct A { static void Work(int); // expected-note{{here}} }; template struct B : public A { template B(T2 x) { Work(x); // expected-error{{explicit qualification required}} } }; void Test() { B b(0); // expected-note{{in instantiation of function template}} } // Don't crash here. namespace PR16134 { template struct S // expected-error {{expected ';'}} template <> static S::f() // expected-error +{{}} } namespace PR16225 { template void f(); template void g(C*) { struct LocalStruct : UnknownBase { }; // expected-error {{use of undeclared identifier 'Mumble'}} f(); #if __cplusplus <= 199711L // expected-warning@-2 {{template argument uses local type 'LocalStruct'}} // expected-note@-3 {{while substituting explicitly-specified template arguments}} #endif struct LocalStruct2 : UnknownBase { }; // expected-error {{no template named 'UnknownBase'}} } struct S; void h() { g(0); #if __cplusplus <= 199711L // expected-note@-2 {{in instantiation of function template specialization}} #endif } } namespace test1 { template class ArraySlice {}; class Foo; class NonTemplateClass { // #defined-here void MemberFunction(ArraySlice, int); template void MemberFuncTemplate(ArraySlice, int); }; void NonTemplateClass::MemberFunction(ArraySlice resource_data, int now) { // expected-note@+1 {{in instantiation of function template specialization 'test1::NonTemplateClass::MemberFuncTemplate'}} MemberFuncTemplate(resource_data, now); } template void NonTemplateClass::MemberFuncTemplate(ArraySlice resource_data, int) { // expected-error@+1 {{member 'UndeclaredMethod' used before its declaration}} UndeclaredMethod(resource_data); } // expected-error@+3 {{out-of-line definition of 'UndeclaredMethod' does not match any declaration}} // expected-note@+2 {{member is declared here}} // expected-note@#defined-here {{defined here}} void NonTemplateClass::UndeclaredMethod() {} } namespace GH135621 { template struct S {}; // expected-note@-1 {{class template declared here}} template void f() { S::template S; // expected-error@-1 {{'S' is expected to be a non-type template, but instantiated to a class template}} } template void f(); // expected-note@-1 {{requested here}} } // namespace GH135621