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