xref: /aosp_15_r20/external/clang/test/SemaTemplate/recovery-crash.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void 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