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