xref: /aosp_15_r20/external/clang/test/SemaTemplate/instantiate-member-expr.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s -pedantic
2*67e74705SXin Li template<typename T>
3*67e74705SXin Li struct S {
SS4*67e74705SXin Li  S() { }
5*67e74705SXin Li };
6*67e74705SXin Li 
7*67e74705SXin Li template<typename T>
8*67e74705SXin Li struct vector {
push_backvector9*67e74705SXin Li   void push_back(const T&) { int a[sizeof(T) ? -1: -1]; } // expected-error {{array with a negative size}}
10*67e74705SXin Li };
11*67e74705SXin Li 
12*67e74705SXin Li class ExprEngine {
13*67e74705SXin Li public:
14*67e74705SXin Li  typedef vector<S<void *> >CheckersOrdered;
15*67e74705SXin Li  CheckersOrdered Checkers;
16*67e74705SXin Li 
17*67e74705SXin Li  template <typename CHECKER>
registerCheck(CHECKER * check)18*67e74705SXin Li  void registerCheck(CHECKER *check) {
19*67e74705SXin Li    Checkers.push_back(S<void *>()); // expected-note {{in instantiation of member function 'vector<S<void *> >::push_back' requested here}}
20*67e74705SXin Li  }
21*67e74705SXin Li };
22*67e74705SXin Li 
23*67e74705SXin Li class RetainReleaseChecker { };
24*67e74705SXin Li 
f(ExprEngine & Eng)25*67e74705SXin Li void f(ExprEngine& Eng) {
26*67e74705SXin Li    Eng.registerCheck(new RetainReleaseChecker); // expected-note {{in instantiation of function template specialization 'ExprEngine::registerCheck<RetainReleaseChecker>' requested here}}
27*67e74705SXin Li }
28*67e74705SXin Li 
29*67e74705SXin Li // PR 5838
30*67e74705SXin Li namespace test1 {
31*67e74705SXin Li   template<typename T> struct A {
32*67e74705SXin Li     int a;
33*67e74705SXin Li   };
34*67e74705SXin Li 
35*67e74705SXin Li   template<typename T> struct B : A<float>, A<T> {
ftest1::B36*67e74705SXin Li     void f() {
37*67e74705SXin Li       a = 0; // should not be ambiguous
38*67e74705SXin Li     }
39*67e74705SXin Li   };
40*67e74705SXin Li   template struct B<int>;
41*67e74705SXin Li 
42*67e74705SXin Li   struct O {
43*67e74705SXin Li     int a;
44*67e74705SXin Li     template<typename T> struct B : A<T> {
ftest1::O::B45*67e74705SXin Li       void f() {
46*67e74705SXin Li         a = 0; // expected-error {{'test1::O::a' is not a member of class 'test1::O::B<int>'}}
47*67e74705SXin Li       }
48*67e74705SXin Li     };
49*67e74705SXin Li   };
50*67e74705SXin Li   template struct O::B<int>; // expected-note {{in instantiation}}
51*67e74705SXin Li }
52*67e74705SXin Li 
53*67e74705SXin Li // PR7248
54*67e74705SXin Li namespace test2 {
55*67e74705SXin Li   template <class T> struct A {
footest2::A56*67e74705SXin Li     void foo() {
57*67e74705SXin Li       T::bar(); // expected-error {{type 'int' cannot}}
58*67e74705SXin Li     }
59*67e74705SXin Li   };
60*67e74705SXin Li 
61*67e74705SXin Li   template <class T> class B {
foo(A<T> a)62*67e74705SXin Li     void foo(A<T> a) {
63*67e74705SXin Li       a.test2::template A<T>::foo(); // expected-note {{in instantiation}}
64*67e74705SXin Li     }
65*67e74705SXin Li   };
66*67e74705SXin Li 
67*67e74705SXin Li   template class B<int>;
68*67e74705SXin Li }
69*67e74705SXin Li 
70*67e74705SXin Li namespace PR14124 {
71*67e74705SXin Li   template<typename T> struct S {
72*67e74705SXin Li     int value;
73*67e74705SXin Li   };
f()74*67e74705SXin Li   template<typename T> void f() { S<T>::value; } // expected-error {{invalid use of non-static data member 'value'}}
75*67e74705SXin Li   template void f<int>(); // expected-note {{in instantiation of}}
76*67e74705SXin Li 
77*67e74705SXin Li   struct List { List *next; };
78*67e74705SXin Li   template<typename T, T *(T::*p) = &T::next> struct A {};
79*67e74705SXin Li   A<List> a; // ok
80*67e74705SXin Li   void operator&(struct Whatever);
81*67e74705SXin Li   template<typename T, T *(T::*p) = &T::next> struct B {};
82*67e74705SXin Li   B<List> b; // still ok
83*67e74705SXin Li }
84