Home | History | Annotate | Download | only in SemaTemplate
      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> {
     12   template <typename T2> B(T2 x) {
     13     Work(x);  // expected-error{{use of undeclared identifier}}
     14   }
     15 };
     16 
     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();
     30   template <typename C> void g(C*) {
     31     struct LocalStruct : UnknownBase<Mumble, C> { };  // expected-error {{unknown template name 'UnknownBase'}} \
     32                                                       // expected-error {{use of undeclared identifier 'Mumble'}}
     33     f<LocalStruct>();
     34 #if __cplusplus <= 199711L
     35     // expected-warning@-2 {{template argument uses local type 'LocalStruct'}}
     36 #endif
     37   }
     38   struct S;
     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   };
     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>
     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}}
     66   void NonTemplateClass::UndeclaredMethod() {}
     67 }
     68