xref: /aosp_15_r20/external/clang/test/SemaCXX/vtable-instantiation.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li namespace PR8640 {
4*67e74705SXin Li   template<class T1> struct C1 {
c1PR8640::C15*67e74705SXin Li     virtual void c1() {
6*67e74705SXin Li       T1 t1 = 3;  // expected-error {{cannot initialize a variable}}
7*67e74705SXin Li     }
8*67e74705SXin Li   };
9*67e74705SXin Li 
10*67e74705SXin Li   template<class T2> struct C2 {
c2PR8640::C211*67e74705SXin Li     void c2() {
12*67e74705SXin Li       new C1<T2>();  // expected-note {{in instantiation of member function}}
13*67e74705SXin Li     }
14*67e74705SXin Li   };
15*67e74705SXin Li 
f()16*67e74705SXin Li   void f() {
17*67e74705SXin Li     C2<int*> c2;
18*67e74705SXin Li     c2.c2();  // expected-note {{in instantiation of member function}}
19*67e74705SXin Li   }
20*67e74705SXin Li }
21*67e74705SXin Li 
22*67e74705SXin Li namespace PR9325 {
23*67e74705SXin Li   template<typename T>
24*67e74705SXin Li   class Target
25*67e74705SXin Li   {
26*67e74705SXin Li   public:
Value() const27*67e74705SXin Li     virtual T Value() const
28*67e74705SXin Li     {
29*67e74705SXin Li       return 1; // expected-error{{cannot initialize return object of type 'int *' with an rvalue of type 'int'}}
30*67e74705SXin Li     }
31*67e74705SXin Li   };
32*67e74705SXin Li 
33*67e74705SXin Li   template<typename T>
34*67e74705SXin Li   struct Provider
35*67e74705SXin Li   {
36*67e74705SXin Li     static Target<T> Instance;
37*67e74705SXin Li   };
38*67e74705SXin Li 
39*67e74705SXin Li   template<typename T>
40*67e74705SXin Li   Target<T> Provider<T>::Instance; // expected-note{{in instantiation of}}
41*67e74705SXin Li 
f()42*67e74705SXin Li   void f()
43*67e74705SXin Li   {
44*67e74705SXin Li     Target<int*>* traits = &Provider<int*>::Instance; // expected-note{{requested here}}
45*67e74705SXin Li   }
46*67e74705SXin Li }
47*67e74705SXin Li 
48*67e74705SXin Li namespace PR10020 {
49*67e74705SXin Li   struct MG {
50*67e74705SXin Li     virtual void Accept(int) = 0;
51*67e74705SXin Li   };
52*67e74705SXin Li 
53*67e74705SXin Li   template <typename Type>
54*67e74705SXin Li   struct GMG : MG {
AcceptPR10020::GMG55*67e74705SXin Li     void Accept(int i) {
56*67e74705SXin Li       static_cast<Type *>(0)->Accept(i); // expected-error{{member reference base}}
57*67e74705SXin Li     }
MethodPR10020::GMG58*67e74705SXin Li     static GMG* Method() { return &singleton; } // expected-note{{in instantiation of}}
59*67e74705SXin Li     static GMG singleton;
60*67e74705SXin Li   };
61*67e74705SXin Li 
62*67e74705SXin Li   template <typename Type>
63*67e74705SXin Li   GMG<Type> GMG<Type>::singleton; // expected-note{{requested here}}
64*67e74705SXin Li 
test(void)65*67e74705SXin Li   void test(void) {
66*67e74705SXin Li     GMG<int>::Method(); // expected-note{{in instantiation of}}
67*67e74705SXin Li   }
68*67e74705SXin Li }
69