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()17 void 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 {{use of undeclared identifier 'Mumble'}}
32     f<LocalStruct>();
33 #if __cplusplus <= 199711L
34     // expected-warning@-2 {{template argument uses local type 'LocalStruct'}}
35 #endif
36     struct LocalStruct2 : UnknownBase<C> { };  // expected-error {{no template named 'UnknownBase'}}
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