| // 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() {} |
| } |