1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2*67e74705SXin Li // REQUIRES: LP64
3*67e74705SXin Li
4*67e74705SXin Li // ------------ not interpreted as C-style cast ------------
5*67e74705SXin Li
6*67e74705SXin Li struct SimpleValueInit {
7*67e74705SXin Li int i;
8*67e74705SXin Li };
9*67e74705SXin Li
10*67e74705SXin Li struct InitViaConstructor {
11*67e74705SXin Li InitViaConstructor(int i = 7);
12*67e74705SXin Li };
13*67e74705SXin Li
14*67e74705SXin Li struct NoValueInit { // expected-note 2 {{candidate constructor (the implicit copy constructor)}} expected-note 2 {{candidate constructor (the implicit move constructor)}}
15*67e74705SXin Li NoValueInit(int i, int j); // expected-note 2 {{candidate constructor}}
16*67e74705SXin Li };
17*67e74705SXin Li
test_cxx_functional_value_init()18*67e74705SXin Li void test_cxx_functional_value_init() {
19*67e74705SXin Li (void)SimpleValueInit();
20*67e74705SXin Li (void)InitViaConstructor();
21*67e74705SXin Li (void)NoValueInit(); // expected-error{{no matching constructor for initialization}}
22*67e74705SXin Li }
23*67e74705SXin Li
test_cxx_function_cast_multi()24*67e74705SXin Li void test_cxx_function_cast_multi() {
25*67e74705SXin Li (void)NoValueInit(0, 0);
26*67e74705SXin Li (void)NoValueInit(0, 0, 0); // expected-error{{no matching constructor for initialization}}
27*67e74705SXin Li (void)int(1, 2); // expected-error{{excess elements in scalar initializer}}
28*67e74705SXin Li (void)int({}, 2); // expected-error{{excess elements in scalar initializer}}
29*67e74705SXin Li }
30*67e74705SXin Li
31*67e74705SXin Li
32*67e74705SXin Li // ------------------ everything else --------------------
33*67e74705SXin Li
34*67e74705SXin Li struct A {};
35*67e74705SXin Li
36*67e74705SXin Li // ----------- const_cast --------------
37*67e74705SXin Li
38*67e74705SXin Li typedef char c;
39*67e74705SXin Li typedef c *cp;
40*67e74705SXin Li typedef cp *cpp;
41*67e74705SXin Li typedef cpp *cppp;
42*67e74705SXin Li typedef cppp &cpppr;
43*67e74705SXin Li typedef const cppp &cpppcr;
44*67e74705SXin Li typedef const char cc;
45*67e74705SXin Li typedef cc *ccp;
46*67e74705SXin Li typedef volatile ccp ccvp;
47*67e74705SXin Li typedef ccvp *ccvpp;
48*67e74705SXin Li typedef const volatile ccvpp ccvpcvp;
49*67e74705SXin Li typedef ccvpcvp *ccvpcvpp;
50*67e74705SXin Li typedef int iar[100];
51*67e74705SXin Li typedef iar &iarr;
52*67e74705SXin Li typedef int (*f)(int);
53*67e74705SXin Li
t_cc()54*67e74705SXin Li void t_cc()
55*67e74705SXin Li {
56*67e74705SXin Li ccvpcvpp var = 0;
57*67e74705SXin Li // Cast away deep consts and volatiles.
58*67e74705SXin Li char ***var2 = cppp(var);
59*67e74705SXin Li char ***const &var3 = var2;
60*67e74705SXin Li // Const reference to reference.
61*67e74705SXin Li char ***&var4 = cpppr(var3);
62*67e74705SXin Li // Drop reference. Intentionally without qualifier change.
63*67e74705SXin Li char *** var5 = cppp(var4);
64*67e74705SXin Li const int ar[100] = {0};
65*67e74705SXin Li // Array decay. Intentionally without qualifier change.
66*67e74705SXin Li typedef int *intp;
67*67e74705SXin Li int *pi = intp(ar);
68*67e74705SXin Li f fp = 0;
69*67e74705SXin Li // Don't misidentify fn** as a function pointer.
70*67e74705SXin Li typedef f *fp_t;
71*67e74705SXin Li f *fpp = fp_t(&fp);
72*67e74705SXin Li int const A::* const A::*icapcap = 0;
73*67e74705SXin Li typedef int A::* A::*iapap_t;
74*67e74705SXin Li iapap_t iapap = iapap_t(icapcap);
75*67e74705SXin Li }
76*67e74705SXin Li
77*67e74705SXin Li // ----------- static_cast -------------
78*67e74705SXin Li
79*67e74705SXin Li struct B : public A {}; // Single public base.
80*67e74705SXin Li struct C1 : public virtual B {}; // Single virtual base.
81*67e74705SXin Li struct C2 : public virtual B {};
82*67e74705SXin Li struct D : public C1, public C2 {}; // Diamond
83*67e74705SXin Li struct E : private A {}; // Single private base.
84*67e74705SXin Li struct F : public C1 {}; // Single path to B with virtual.
85*67e74705SXin Li struct G1 : public B {};
86*67e74705SXin Li struct G2 : public B {};
87*67e74705SXin Li struct H : public G1, public G2 {}; // Ambiguous path to B.
88*67e74705SXin Li
89*67e74705SXin Li enum Enum { En1, En2 };
90*67e74705SXin Li enum Onom { On1, On2 };
91*67e74705SXin Li
92*67e74705SXin Li struct Co1 { operator int(); };
93*67e74705SXin Li struct Co2 { Co2(int); };
94*67e74705SXin Li struct Co3 { };
95*67e74705SXin Li struct Co4 { Co4(Co3); operator Co3(); };
96*67e74705SXin Li
97*67e74705SXin Li // Explicit implicits
t_529_2()98*67e74705SXin Li void t_529_2()
99*67e74705SXin Li {
100*67e74705SXin Li int i = 1;
101*67e74705SXin Li (void)float(i);
102*67e74705SXin Li double d = 1.0;
103*67e74705SXin Li (void)float(d);
104*67e74705SXin Li (void)int(d);
105*67e74705SXin Li (void)char(i);
106*67e74705SXin Li typedef unsigned long ulong;
107*67e74705SXin Li (void)ulong(i);
108*67e74705SXin Li (void)int(En1);
109*67e74705SXin Li (void)double(En1);
110*67e74705SXin Li typedef int &intr;
111*67e74705SXin Li (void)intr(i);
112*67e74705SXin Li typedef const int &cintr;
113*67e74705SXin Li (void)cintr(i);
114*67e74705SXin Li
115*67e74705SXin Li int ar[1];
116*67e74705SXin Li typedef const int *cintp;
117*67e74705SXin Li (void)cintp(ar);
118*67e74705SXin Li typedef void (*pfvv)();
119*67e74705SXin Li (void)pfvv(t_529_2);
120*67e74705SXin Li
121*67e74705SXin Li typedef void *voidp;
122*67e74705SXin Li (void)voidp(0);
123*67e74705SXin Li (void)voidp((int*)0);
124*67e74705SXin Li typedef volatile const void *vcvoidp;
125*67e74705SXin Li (void)vcvoidp((const int*)0);
126*67e74705SXin Li typedef A *Ap;
127*67e74705SXin Li (void)Ap((B*)0);
128*67e74705SXin Li typedef A &Ar;
129*67e74705SXin Li (void)Ar(*((B*)0)); // expected-warning {{binding dereferenced null pointer to reference has undefined behavior}}
130*67e74705SXin Li typedef const B *cBp;
131*67e74705SXin Li (void)cBp((C1*)0);
132*67e74705SXin Li typedef B &Br;
133*67e74705SXin Li (void)Br(*((C1*)0)); // expected-warning {{binding dereferenced null pointer to reference has undefined behavior}}
134*67e74705SXin Li (void)Ap((D*)0);
135*67e74705SXin Li typedef const A &cAr;
136*67e74705SXin Li (void)cAr(*((D*)0)); // expected-warning {{binding dereferenced null pointer to reference has undefined behavior}}
137*67e74705SXin Li typedef int B::*Bmp;
138*67e74705SXin Li (void)Bmp((int A::*)0);
139*67e74705SXin Li typedef void (B::*Bmfp)();
140*67e74705SXin Li (void)Bmfp((void (A::*)())0);
141*67e74705SXin Li (void)Ap((E*)0); // functional-style cast ignores access control
142*67e74705SXin Li (void)voidp((const int*)0); // const_cast appended
143*67e74705SXin Li
144*67e74705SXin Li (void)int(Co1());
145*67e74705SXin Li (void)Co2(1);
146*67e74705SXin Li (void)Co3((Co4)(Co3()));
147*67e74705SXin Li
148*67e74705SXin Li // Bad code below
149*67e74705SXin Li //(void)(A*)((H*)0); // {{static_cast from 'struct H *' to 'struct A *' is not allowed}}
150*67e74705SXin Li }
151*67e74705SXin Li
152*67e74705SXin Li // Anything to void
t_529_4()153*67e74705SXin Li void t_529_4()
154*67e74705SXin Li {
155*67e74705SXin Li void(1);
156*67e74705SXin Li (void(t_529_4));
157*67e74705SXin Li }
158*67e74705SXin Li
159*67e74705SXin Li // Static downcasts
t_529_5_8()160*67e74705SXin Li void t_529_5_8()
161*67e74705SXin Li {
162*67e74705SXin Li typedef B *Bp;
163*67e74705SXin Li (void)Bp((A*)0);
164*67e74705SXin Li typedef B &Br;
165*67e74705SXin Li (void)Br(*((A*)0));
166*67e74705SXin Li typedef const G1 *cG1p;
167*67e74705SXin Li (void)cG1p((A*)0);
168*67e74705SXin Li typedef const G1 &cG1r;
169*67e74705SXin Li (void)cG1r(*((A*)0));
170*67e74705SXin Li (void)Bp((const A*)0); // const_cast appended
171*67e74705SXin Li (void)Br(*((const A*)0)); // const_cast appended
172*67e74705SXin Li typedef E *Ep;
173*67e74705SXin Li (void)Ep((A*)0); // access control ignored
174*67e74705SXin Li typedef E &Er;
175*67e74705SXin Li (void)Er(*((A*)0)); // access control ignored
176*67e74705SXin Li
177*67e74705SXin Li // Bad code below
178*67e74705SXin Li
179*67e74705SXin Li typedef C1 *C1p;
180*67e74705SXin Li (void)C1p((A*)0); // expected-error {{cannot cast 'A *' to 'C1p' (aka 'C1 *') via virtual base 'B'}}
181*67e74705SXin Li typedef C1 &C1r;
182*67e74705SXin Li (void)C1r(*((A*)0)); // expected-error {{cannot cast 'A' to 'C1r' (aka 'C1 &') via virtual base 'B'}}
183*67e74705SXin Li typedef D *Dp;
184*67e74705SXin Li (void)Dp((A*)0); // expected-error {{cannot cast 'A *' to 'Dp' (aka 'D *') via virtual base 'B'}}
185*67e74705SXin Li typedef D &Dr;
186*67e74705SXin Li (void)Dr(*((A*)0)); // expected-error {{cannot cast 'A' to 'Dr' (aka 'D &') via virtual base 'B'}}
187*67e74705SXin Li typedef H *Hp;
188*67e74705SXin Li (void)Hp((A*)0); // expected-error {{ambiguous cast from base 'A' to derived 'H':\n struct A -> struct B -> struct G1 -> struct H\n struct A -> struct B -> struct G2 -> struct H}}
189*67e74705SXin Li typedef H &Hr;
190*67e74705SXin Li (void)Hr(*((A*)0)); // expected-error {{ambiguous cast from base 'A' to derived 'H':\n struct A -> struct B -> struct G1 -> struct H\n struct A -> struct B -> struct G2 -> struct H}}
191*67e74705SXin Li
192*67e74705SXin Li // TODO: Test DR427. This requires user-defined conversions, though.
193*67e74705SXin Li }
194*67e74705SXin Li
195*67e74705SXin Li // Enum conversions
t_529_7()196*67e74705SXin Li void t_529_7()
197*67e74705SXin Li {
198*67e74705SXin Li (void)Enum(1);
199*67e74705SXin Li (void)Enum(1.0);
200*67e74705SXin Li (void)Onom(En1);
201*67e74705SXin Li
202*67e74705SXin Li // Bad code below
203*67e74705SXin Li
204*67e74705SXin Li (void)Enum((int*)0); // expected-error {{functional-style cast from 'int *' to 'Enum' is not allowed}}
205*67e74705SXin Li }
206*67e74705SXin Li
207*67e74705SXin Li // Void pointer to object pointer
t_529_10()208*67e74705SXin Li void t_529_10()
209*67e74705SXin Li {
210*67e74705SXin Li typedef int *intp;
211*67e74705SXin Li (void)intp((void*)0);
212*67e74705SXin Li typedef const A *cAp;
213*67e74705SXin Li (void)cAp((void*)0);
214*67e74705SXin Li (void)intp((const void*)0); // const_cast appended
215*67e74705SXin Li }
216*67e74705SXin Li
217*67e74705SXin Li // Member pointer upcast.
t_529_9()218*67e74705SXin Li void t_529_9()
219*67e74705SXin Li {
220*67e74705SXin Li typedef int A::*Amp;
221*67e74705SXin Li (void)Amp((int B::*)0);
222*67e74705SXin Li
223*67e74705SXin Li // Bad code below
224*67e74705SXin Li (void)Amp((int H::*)0); // expected-error {{ambiguous conversion from pointer to member of derived class 'H' to pointer to member of base class 'A':}}
225*67e74705SXin Li (void)Amp((int F::*)0); // expected-error {{conversion from pointer to member of class 'F' to pointer to member of class 'A' via virtual base 'B' is not allowed}}
226*67e74705SXin Li }
227*67e74705SXin Li
228*67e74705SXin Li // -------- reinterpret_cast -----------
229*67e74705SXin Li
230*67e74705SXin Li enum test { testval = 1 };
231*67e74705SXin Li struct structure { int m; };
232*67e74705SXin Li typedef void (*fnptr)();
233*67e74705SXin Li
234*67e74705SXin Li // Test conversion between pointer and integral types, as in p3 and p4.
integral_conversion()235*67e74705SXin Li void integral_conversion()
236*67e74705SXin Li {
237*67e74705SXin Li typedef void *voidp;
238*67e74705SXin Li void *vp = voidp(testval);
239*67e74705SXin Li long l = long(vp);
240*67e74705SXin Li typedef float *floatp;
241*67e74705SXin Li (void)floatp(l);
242*67e74705SXin Li fnptr fnp = fnptr(l);
243*67e74705SXin Li (void)char(fnp); // expected-error {{cast from pointer to smaller type 'char' loses information}}
244*67e74705SXin Li (void)long(fnp);
245*67e74705SXin Li }
246*67e74705SXin Li
pointer_conversion()247*67e74705SXin Li void pointer_conversion()
248*67e74705SXin Li {
249*67e74705SXin Li int *p1 = 0;
250*67e74705SXin Li typedef float *floatp;
251*67e74705SXin Li float *p2 = floatp(p1);
252*67e74705SXin Li typedef structure *structurep;
253*67e74705SXin Li structure *p3 = structurep(p2);
254*67e74705SXin Li typedef int **ppint;
255*67e74705SXin Li typedef ppint *pppint;
256*67e74705SXin Li ppint *deep = pppint(p3);
257*67e74705SXin Li typedef fnptr fnptrp;
258*67e74705SXin Li (void)fnptrp(deep);
259*67e74705SXin Li }
260*67e74705SXin Li
constness()261*67e74705SXin Li void constness()
262*67e74705SXin Li {
263*67e74705SXin Li int ***const ipppc = 0;
264*67e74705SXin Li typedef int const *icp_t;
265*67e74705SXin Li int const *icp = icp_t(ipppc);
266*67e74705SXin Li typedef int *intp;
267*67e74705SXin Li (void)intp(icp); // const_cast appended
268*67e74705SXin Li typedef int const *const ** intcpcpp;
269*67e74705SXin Li intcpcpp icpcpp = intcpcpp(ipppc); // const_cast appended
270*67e74705SXin Li int *ip = intp(icpcpp);
271*67e74705SXin Li (void)icp_t(ip);
272*67e74705SXin Li typedef int const *const *const *intcpcpcp;
273*67e74705SXin Li (void)intcpcpcp(ipppc);
274*67e74705SXin Li }
275*67e74705SXin Li
fnptrs()276*67e74705SXin Li void fnptrs()
277*67e74705SXin Li {
278*67e74705SXin Li typedef int (*fnptr2)(int);
279*67e74705SXin Li fnptr fp = 0;
280*67e74705SXin Li (void)fnptr2(fp);
281*67e74705SXin Li typedef void *voidp;
282*67e74705SXin Li void *vp = voidp(fp);
283*67e74705SXin Li (void)fnptr(vp);
284*67e74705SXin Li }
285*67e74705SXin Li
refs()286*67e74705SXin Li void refs()
287*67e74705SXin Li {
288*67e74705SXin Li long l = 0;
289*67e74705SXin Li typedef char &charr;
290*67e74705SXin Li char &c = charr(l);
291*67e74705SXin Li // Bad: from rvalue
292*67e74705SXin Li typedef int &intr;
293*67e74705SXin Li (void)intr(&c); // expected-error {{functional-style cast from rvalue to reference type 'intr' (aka 'int &')}}
294*67e74705SXin Li }
295*67e74705SXin Li
memptrs()296*67e74705SXin Li void memptrs()
297*67e74705SXin Li {
298*67e74705SXin Li const int structure::*psi = 0;
299*67e74705SXin Li typedef const float structure::*structurecfmp;
300*67e74705SXin Li (void)structurecfmp(psi);
301*67e74705SXin Li typedef int structure::*structureimp;
302*67e74705SXin Li (void)structureimp(psi); // const_cast appended
303*67e74705SXin Li
304*67e74705SXin Li void (structure::*psf)() = 0;
305*67e74705SXin Li typedef int (structure::*structureimfp)();
306*67e74705SXin Li (void)structureimfp(psf);
307*67e74705SXin Li
308*67e74705SXin Li typedef void (structure::*structurevmfp)();
309*67e74705SXin Li (void)structurevmfp(psi); // expected-error-re {{functional-style cast from 'const int structure::*' to 'structurevmfp' (aka 'void (structure::*)(){{( __attribute__\(\(thiscall\)\))?}}') is not allowed}}
310*67e74705SXin Li (void)structureimp(psf); // expected-error-re {{functional-style cast from 'void (structure::*)(){{( __attribute__\(\(thiscall\)\))?}}' to 'structureimp' (aka 'int structure::*') is not allowed}}
311*67e74705SXin Li }
312*67e74705SXin Li
313*67e74705SXin Li // ---------------- misc ------------------
314*67e74705SXin Li
crash_on_invalid_1()315*67e74705SXin Li void crash_on_invalid_1()
316*67e74705SXin Li {
317*67e74705SXin Li typedef itn Typo; // expected-error {{unknown type name 'itn'}}
318*67e74705SXin Li (void)Typo(1); // used to crash
319*67e74705SXin Li
320*67e74705SXin Li typedef int &int_ref;
321*67e74705SXin Li (void)int_ref(); // expected-error {{reference to type 'int' requires an initializer}}
322*67e74705SXin Li }
323