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