xref: /aosp_15_r20/external/clang/test/SemaTemplate/instantiate-expr-2.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only %s
2*67e74705SXin Li typedef char one_byte;
3*67e74705SXin Li typedef char (&two_bytes)[2];
4*67e74705SXin Li typedef char (&four_bytes)[4];
5*67e74705SXin Li typedef char (&eight_bytes)[8];
6*67e74705SXin Li 
7*67e74705SXin Li template<int N> struct A { };
8*67e74705SXin Li 
9*67e74705SXin Li namespace N1 {
10*67e74705SXin Li   struct X { };
11*67e74705SXin Li }
12*67e74705SXin Li 
13*67e74705SXin Li namespace N2 {
14*67e74705SXin Li   struct Y { };
15*67e74705SXin Li 
16*67e74705SXin Li   two_bytes operator+(Y, Y);
17*67e74705SXin Li }
18*67e74705SXin Li 
19*67e74705SXin Li namespace N3 {
20*67e74705SXin Li   struct Z { };
21*67e74705SXin Li 
22*67e74705SXin Li   eight_bytes operator+(Z, Z);
23*67e74705SXin Li }
24*67e74705SXin Li 
25*67e74705SXin Li namespace N4 {
26*67e74705SXin Li   one_byte operator+(N1::X, N2::Y);
27*67e74705SXin Li 
28*67e74705SXin Li   template<typename T, typename U>
29*67e74705SXin Li   struct BinOpOverload {
30*67e74705SXin Li     typedef A<sizeof(T() + U())> type;
31*67e74705SXin Li   };
32*67e74705SXin Li }
33*67e74705SXin Li 
34*67e74705SXin Li namespace N1 {
35*67e74705SXin Li   four_bytes operator+(X, X);
36*67e74705SXin Li }
37*67e74705SXin Li 
38*67e74705SXin Li namespace N3 {
39*67e74705SXin Li   eight_bytes operator+(Z, Z); // redeclaration
40*67e74705SXin Li }
41*67e74705SXin Li 
test_bin_op_overload(A<1> * a1,A<2> * a2,A<4> * a4,A<8> * a8)42*67e74705SXin Li void test_bin_op_overload(A<1> *a1, A<2> *a2, A<4> *a4, A<8> *a8) {
43*67e74705SXin Li   typedef N4::BinOpOverload<N1::X, N2::Y>::type XY;
44*67e74705SXin Li   XY *xy = a1;
45*67e74705SXin Li   typedef N4::BinOpOverload<N1::X, N1::X>::type XX;
46*67e74705SXin Li   XX *xx = a4;
47*67e74705SXin Li   typedef N4::BinOpOverload<N2::Y, N2::Y>::type YY;
48*67e74705SXin Li   YY *yy = a2;
49*67e74705SXin Li   typedef N4::BinOpOverload<N3::Z, N3::Z>::type ZZ;
50*67e74705SXin Li   ZZ *zz = a8;
51*67e74705SXin Li }
52*67e74705SXin Li 
53*67e74705SXin Li namespace N3 {
54*67e74705SXin Li   eight_bytes operator-(::N3::Z);
55*67e74705SXin Li }
56*67e74705SXin Li 
57*67e74705SXin Li namespace N4 {
58*67e74705SXin Li   template<typename T>
59*67e74705SXin Li   struct UnaryOpOverload {
60*67e74705SXin Li     typedef A<sizeof(-T())> type;
61*67e74705SXin Li   };
62*67e74705SXin Li }
63*67e74705SXin Li 
test_unary_op_overload(A<8> * a8)64*67e74705SXin Li void test_unary_op_overload(A<8> *a8) {
65*67e74705SXin Li   typedef N4::UnaryOpOverload<N3::Z>::type UZ;
66*67e74705SXin Li   UZ *uz = a8;
67*67e74705SXin Li }
68*67e74705SXin Li 
69*67e74705SXin Li /*
70*67e74705SXin Li namespace N5 {
71*67e74705SXin Li   template<int I>
72*67e74705SXin Li   struct Lookup {
73*67e74705SXin Li     enum { val = I, more = val + 1 };
74*67e74705SXin Li   };
75*67e74705SXin Li 
76*67e74705SXin Li   template<bool B>
77*67e74705SXin Li   struct Cond {
78*67e74705SXin Li     enum Junk { is = B ? Lookup<B>::more : Lookup<Lookup<B+1>::more>::val };
79*67e74705SXin Li   };
80*67e74705SXin Li 
81*67e74705SXin Li   enum { resultT = Cond<true>::is,
82*67e74705SXin Li          resultF = Cond<false>::is };
83*67e74705SXin Li }
84*67e74705SXin Li */
85*67e74705SXin Li 
86*67e74705SXin Li namespace N6 {
87*67e74705SXin Li   // non-typedependent
88*67e74705SXin Li   template<int I>
89*67e74705SXin Li   struct Lookup {};
90*67e74705SXin Li 
91*67e74705SXin Li   template<bool B, typename T, typename E>
92*67e74705SXin Li   struct Cond {
93*67e74705SXin Li     typedef Lookup<B ? sizeof(T) : sizeof(E)> True;
94*67e74705SXin Li     typedef Lookup<!B ? sizeof(T) : sizeof(E)> False;
95*67e74705SXin Li   };
96*67e74705SXin Li 
97*67e74705SXin Li   typedef Cond<true, int, char>::True True;
98*67e74705SXin Li   typedef Cond<true, int, char>::False False;
99*67e74705SXin Li 
100*67e74705SXin Li   // check that we have the right types
101*67e74705SXin Li   Lookup<1> const &L1(False());
102*67e74705SXin Li   Lookup<sizeof(int)> const &L2(True());
103*67e74705SXin Li }
104*67e74705SXin Li 
105*67e74705SXin Li 
106*67e74705SXin Li namespace N7 {
107*67e74705SXin Li   // type dependent
108*67e74705SXin Li   template<int I>
109*67e74705SXin Li   struct Lookup {};
110*67e74705SXin Li 
111*67e74705SXin Li   template<bool B, typename T, typename E>
112*67e74705SXin Li   struct Cond {
fooN7::Cond113*67e74705SXin Li     T foo() { return B ? T() : E(); }
114*67e74705SXin Li     typedef Lookup<sizeof(B ? T() : E())> Type;
115*67e74705SXin Li   };
116*67e74705SXin Li 
117*67e74705SXin Li   //Cond<true, int*, double> C; // Errors
118*67e74705SXin Li   //int V(C.foo()); // Errors
119*67e74705SXin Li   //typedef Cond<true, int*, double>::Type Type; // Errors
120*67e74705SXin Li   typedef Cond<true, int, double>::Type Type;
121*67e74705SXin Li }
122*67e74705SXin Li 
123*67e74705SXin Li template<typename T, unsigned long N> struct IntegralConstant { };
124*67e74705SXin Li 
125*67e74705SXin Li template<typename T>
126*67e74705SXin Li struct X0 {
127*67e74705SXin Li   void f(T x, IntegralConstant<T, sizeof(x)>);
128*67e74705SXin Li };
129*67e74705SXin Li 
test_X0(X0<int> x,IntegralConstant<int,sizeof (int)> ic)130*67e74705SXin Li void test_X0(X0<int> x, IntegralConstant<int, sizeof(int)> ic) {
131*67e74705SXin Li   x.f(5,ic);
132*67e74705SXin Li }
133*67e74705SXin Li 
134*67e74705SXin Li namespace N8 {
135*67e74705SXin Li   struct X {
136*67e74705SXin Li     X operator+(const X&) const;
137*67e74705SXin Li   };
138*67e74705SXin Li 
139*67e74705SXin Li   template<typename T>
test_plus(const T * xp,const T & x,const T & y)140*67e74705SXin Li   T test_plus(const T* xp, const T& x, const T& y) {
141*67e74705SXin Li     x.operator+(y);
142*67e74705SXin Li     return xp->operator+(y);
143*67e74705SXin Li   }
144*67e74705SXin Li 
test_test_plus(X x)145*67e74705SXin Li   void test_test_plus(X x) {
146*67e74705SXin Li     test_plus(&x, x, x);
147*67e74705SXin Li   }
148*67e74705SXin Li }
149*67e74705SXin Li 
150*67e74705SXin Li namespace N9 {
151*67e74705SXin Li   struct A {
152*67e74705SXin Li     bool operator==(int value);
153*67e74705SXin Li   };
154*67e74705SXin Li 
155*67e74705SXin Li   template<typename T> struct B {
fN9::B156*67e74705SXin Li     bool f(A a) {
157*67e74705SXin Li       return a == 1;
158*67e74705SXin Li     }
159*67e74705SXin Li   };
160*67e74705SXin Li 
161*67e74705SXin Li   template struct B<int>;
162*67e74705SXin Li }
163*67e74705SXin Li 
164*67e74705SXin Li namespace N10 {
165*67e74705SXin Li   template <typename T>
166*67e74705SXin Li   class A {
167*67e74705SXin Li     struct X { };
168*67e74705SXin Li 
169*67e74705SXin Li   public:
~A()170*67e74705SXin Li     ~A() {
171*67e74705SXin Li       f(reinterpret_cast<X *>(0), reinterpret_cast<X *>(0));
172*67e74705SXin Li     }
173*67e74705SXin Li 
174*67e74705SXin Li   private:
175*67e74705SXin Li     void f(X *);
176*67e74705SXin Li     void f(X *, X *);
177*67e74705SXin Li   };
178*67e74705SXin Li 
179*67e74705SXin Li   template class A<int>;
180*67e74705SXin Li }
181*67e74705SXin Li 
182*67e74705SXin Li namespace N12 {
183*67e74705SXin Li   // PR5224
184*67e74705SXin Li   template<typename T>
185*67e74705SXin Li   struct A { typedef int t0; };
186*67e74705SXin Li 
187*67e74705SXin Li   struct C  {
188*67e74705SXin Li     C(int);
189*67e74705SXin Li 
190*67e74705SXin Li     template<typename T>
f0N12::C191*67e74705SXin Li     static C *f0(T a0) {return new C((typename A<T>::t0) 1);   }
192*67e74705SXin Li   };
193*67e74705SXin Li 
f0(int ** a)194*67e74705SXin Li   void f0(int **a) { C::f0(a); }
195*67e74705SXin Li }
196*67e74705SXin Li 
197*67e74705SXin Li namespace PR7202 {
198*67e74705SXin Li   template<typename U, typename T>
199*67e74705SXin Li   struct meta {
200*67e74705SXin Li     typedef T type;
201*67e74705SXin Li   };
202*67e74705SXin Li 
203*67e74705SXin Li   struct X {
204*67e74705SXin Li     struct dummy;
205*67e74705SXin Li 
206*67e74705SXin Li     template<typename T>
207*67e74705SXin Li     X(T, typename meta<T, dummy*>::type = 0);
208*67e74705SXin Li 
209*67e74705SXin Li     template<typename T, typename A>
210*67e74705SXin Li     X(T, A);
211*67e74705SXin Li   };
212*67e74705SXin Li 
213*67e74705SXin Li   template<typename T>
214*67e74705SXin Li   struct Z { };
215*67e74705SXin Li 
216*67e74705SXin Li   template<typename T> Z<T> g(T);
217*67e74705SXin Li 
218*67e74705SXin Li   struct Y {
219*67e74705SXin Li     template<typename T>
fPR7202::Y220*67e74705SXin Li     void f(T t) {
221*67e74705SXin Li       new X(g(*this));
222*67e74705SXin Li     }
223*67e74705SXin Li   };
224*67e74705SXin Li 
225*67e74705SXin Li   template void Y::f(int);
226*67e74705SXin Li }
227*67e74705SXin Li 
228*67e74705SXin Li namespace N13 {
229*67e74705SXin Li   class A{
230*67e74705SXin Li     A(const A&);
231*67e74705SXin Li 
232*67e74705SXin Li   public:
233*67e74705SXin Li     ~A();
234*67e74705SXin Li     A(int);
235*67e74705SXin Li     template<typename T> A &operator<<(const T&);
236*67e74705SXin Li   };
237*67e74705SXin Li 
238*67e74705SXin Li   template<typename T>
f(T t)239*67e74705SXin Li   void f(T t) {
240*67e74705SXin Li     A(17) << t;
241*67e74705SXin Li   }
242*67e74705SXin Li 
243*67e74705SXin Li   template void f(int);
244*67e74705SXin Li 
245*67e74705SXin Li }
246