17002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall// RUN: %clang_cc1 -fsyntax-only -verify %s 20777972d38a3125efed962b045704c30ae6965cfSebastian Redlstruct A {}; 30777972d38a3125efed962b045704c30ae6965cfSebastian Redlstruct B : public A {}; // Single public base. 40777972d38a3125efed962b045704c30ae6965cfSebastian Redlstruct C1 : public virtual B {}; // Single virtual base. 50777972d38a3125efed962b045704c30ae6965cfSebastian Redlstruct C2 : public virtual B {}; 60777972d38a3125efed962b045704c30ae6965cfSebastian Redlstruct D : public C1, public C2 {}; // Diamond 76b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCallstruct E : private A {}; // Single private base. expected-note 3 {{declared private here}} 80777972d38a3125efed962b045704c30ae6965cfSebastian Redlstruct F : public C1 {}; // Single path to B with virtual. 90777972d38a3125efed962b045704c30ae6965cfSebastian Redlstruct G1 : public B {}; 100777972d38a3125efed962b045704c30ae6965cfSebastian Redlstruct G2 : public B {}; 110777972d38a3125efed962b045704c30ae6965cfSebastian Redlstruct H : public G1, public G2 {}; // Ambiguous path to B. 12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct I; // Incomplete. 13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct J; // Incomplete. 140777972d38a3125efed962b045704c30ae6965cfSebastian Redl 150777972d38a3125efed962b045704c30ae6965cfSebastian Redlenum Enum { En1, En2 }; 160777972d38a3125efed962b045704c30ae6965cfSebastian Redlenum Onom { On1, On2 }; 170777972d38a3125efed962b045704c30ae6965cfSebastian Redl 189cc11e70031365972424b43f439021d88096b146Sebastian Redlstruct Co1 { operator int(); }; 199cc11e70031365972424b43f439021d88096b146Sebastian Redlstruct Co2 { Co2(int); }; 209cc11e70031365972424b43f439021d88096b146Sebastian Redlstruct Co3 { }; 219cc11e70031365972424b43f439021d88096b146Sebastian Redlstruct Co4 { Co4(Co3); operator Co3(); }; 229cc11e70031365972424b43f439021d88096b146Sebastian Redl 230777972d38a3125efed962b045704c30ae6965cfSebastian Redl// Explicit implicits 240777972d38a3125efed962b045704c30ae6965cfSebastian Redlvoid t_529_2() 250777972d38a3125efed962b045704c30ae6965cfSebastian Redl{ 260777972d38a3125efed962b045704c30ae6965cfSebastian Redl int i = 1; 270777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<float>(i); 280777972d38a3125efed962b045704c30ae6965cfSebastian Redl double d = 1.0; 290777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<float>(d); 300777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<int>(d); 310777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<char>(i); 320777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<unsigned long>(i); 330777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<int>(En1); 340777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<double>(En1); 350777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<int&>(i); 360777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<const int&>(i); 370777972d38a3125efed962b045704c30ae6965cfSebastian Redl 380777972d38a3125efed962b045704c30ae6965cfSebastian Redl int ar[1]; 390777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<const int*>(ar); 400777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<void (*)()>(t_529_2); 410777972d38a3125efed962b045704c30ae6965cfSebastian Redl 420777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<void*>(0); 430777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<void*>((int*)0); 440777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<volatile const void*>((const int*)0); 450777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<A*>((B*)0); 460777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<A&>(*((B*)0)); 470777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<const B*>((C1*)0); 480777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<B&>(*((C1*)0)); 490777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<A*>((D*)0); 500777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<const A&>(*((D*)0)); 5121593acb933324b439bc68b68e7cc7d1c3e3484dSebastian Redl (void)static_cast<int B::*>((int A::*)0); 5221593acb933324b439bc68b68e7cc7d1c3e3484dSebastian Redl (void)static_cast<void (B::*)()>((void (A::*)())0); 530777972d38a3125efed962b045704c30ae6965cfSebastian Redl 549cc11e70031365972424b43f439021d88096b146Sebastian Redl (void)static_cast<int>(Co1()); 559cc11e70031365972424b43f439021d88096b146Sebastian Redl (void)static_cast<Co2>(1); 569cc11e70031365972424b43f439021d88096b146Sebastian Redl (void)static_cast<Co3>(static_cast<Co4>(Co3())); 570777972d38a3125efed962b045704c30ae6965cfSebastian Redl 580777972d38a3125efed962b045704c30ae6965cfSebastian Redl // Bad code below 590777972d38a3125efed962b045704c30ae6965cfSebastian Redl 6058f9e13e87e57236fee4b914eea9be6f92a1c345Chris Lattner (void)static_cast<void*>((const int*)0); // expected-error {{static_cast from 'const int *' to 'void *' is not allowed}} 617c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)static_cast<A*>((E*)0); // expected-error {{cannot cast 'E' to its private base class 'A'}} 62a82e4ae149168be47458f298371035911685370cSebastian Redl (void)static_cast<A*>((H*)0); // expected-error {{ambiguous conversion}} 630777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<int>((int*)0); // expected-error {{static_cast from 'int *' to 'int' is not allowed}} 647c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)static_cast<A**>((B**)0); // expected-error {{static_cast from 'B **' to 'A **' is not allowed}} 65c6e378e7d4e14b451f50158968d012dace6646d2Douglas Gregor (void)static_cast<char&>(i); // expected-error {{non-const lvalue reference to type 'char' cannot bind to a value of unrelated type 'int'}} 660777972d38a3125efed962b045704c30ae6965cfSebastian Redl} 670777972d38a3125efed962b045704c30ae6965cfSebastian Redl 680777972d38a3125efed962b045704c30ae6965cfSebastian Redl// Anything to void 690777972d38a3125efed962b045704c30ae6965cfSebastian Redlvoid t_529_4() 700777972d38a3125efed962b045704c30ae6965cfSebastian Redl{ 710777972d38a3125efed962b045704c30ae6965cfSebastian Redl static_cast<void>(1); 720777972d38a3125efed962b045704c30ae6965cfSebastian Redl static_cast<void>(t_529_4); 730777972d38a3125efed962b045704c30ae6965cfSebastian Redl} 740777972d38a3125efed962b045704c30ae6965cfSebastian Redl 750777972d38a3125efed962b045704c30ae6965cfSebastian Redl// Static downcasts 760777972d38a3125efed962b045704c30ae6965cfSebastian Redlvoid t_529_5_8() 770777972d38a3125efed962b045704c30ae6965cfSebastian Redl{ 780777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<B*>((A*)0); 790777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<B&>(*((A*)0)); 800777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<const G1*>((A*)0); 810777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<const G1&>(*((A*)0)); 820777972d38a3125efed962b045704c30ae6965cfSebastian Redl 830777972d38a3125efed962b045704c30ae6965cfSebastian Redl // Bad code below 840777972d38a3125efed962b045704c30ae6965cfSebastian Redl 857c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)static_cast<C1*>((A*)0); // expected-error {{cannot cast 'A *' to 'C1 *' via virtual base 'B'}} 867c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)static_cast<C1&>(*((A*)0)); // expected-error {{cannot cast 'A' to 'C1 &' via virtual base 'B'}} 877c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)static_cast<D*>((A*)0); // expected-error {{cannot cast 'A *' to 'D *' via virtual base 'B'}} 887c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)static_cast<D&>(*((A*)0)); // expected-error {{cannot cast 'A' to 'D &' via virtual base 'B'}} 89d4c5f84bbed2ecb5ddd0f0e8316c553b2084772aDouglas Gregor (void)static_cast<B*>((const A*)0); // expected-error {{static_cast from 'const A *' to 'B *' casts away qualifiers}} 90d4c5f84bbed2ecb5ddd0f0e8316c553b2084772aDouglas Gregor (void)static_cast<B&>(*((const A*)0)); // expected-error {{static_cast from 'const A' to 'B &' casts away qualifiers}} 917c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)static_cast<E*>((A*)0); // expected-error {{cannot cast private base class 'A' to 'E'}} 927c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)static_cast<E&>(*((A*)0)); // expected-error {{cannot cast private base class 'A' to 'E'}} 937c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)static_cast<H*>((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}} 947c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)static_cast<H&>(*((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}} 957c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)static_cast<E*>((B*)0); // expected-error {{static_cast from 'B *' to 'E *' is not allowed}} 96c6e378e7d4e14b451f50158968d012dace6646d2Douglas Gregor (void)static_cast<E&>(*((B*)0)); // expected-error {{non-const lvalue reference to type 'E' cannot bind to a value of unrelated type 'B'}} 970777972d38a3125efed962b045704c30ae6965cfSebastian Redl 980777972d38a3125efed962b045704c30ae6965cfSebastian Redl // TODO: Test inaccessible base in context where it's accessible, i.e. 990777972d38a3125efed962b045704c30ae6965cfSebastian Redl // member function and friend. 1000777972d38a3125efed962b045704c30ae6965cfSebastian Redl 1010777972d38a3125efed962b045704c30ae6965cfSebastian Redl // TODO: Test DR427. This requires user-defined conversions, though. 1020777972d38a3125efed962b045704c30ae6965cfSebastian Redl} 1030777972d38a3125efed962b045704c30ae6965cfSebastian Redl 1040777972d38a3125efed962b045704c30ae6965cfSebastian Redl// Enum conversions 1050777972d38a3125efed962b045704c30ae6965cfSebastian Redlvoid t_529_7() 1060777972d38a3125efed962b045704c30ae6965cfSebastian Redl{ 1070777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<Enum>(1); 1080777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<Enum>(1.0); 1090777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<Onom>(En1); 1100777972d38a3125efed962b045704c30ae6965cfSebastian Redl 1110777972d38a3125efed962b045704c30ae6965cfSebastian Redl // Bad code below 1120777972d38a3125efed962b045704c30ae6965cfSebastian Redl 1137c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)static_cast<Enum>((int*)0); // expected-error {{static_cast from 'int *' to 'Enum' is not allowed}} 1140777972d38a3125efed962b045704c30ae6965cfSebastian Redl} 1150777972d38a3125efed962b045704c30ae6965cfSebastian Redl 1160777972d38a3125efed962b045704c30ae6965cfSebastian Redl// Void pointer to object pointer 1170777972d38a3125efed962b045704c30ae6965cfSebastian Redlvoid t_529_10() 1180777972d38a3125efed962b045704c30ae6965cfSebastian Redl{ 1190777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<int*>((void*)0); 1200777972d38a3125efed962b045704c30ae6965cfSebastian Redl (void)static_cast<const A*>((void*)0); 1210777972d38a3125efed962b045704c30ae6965cfSebastian Redl 1220777972d38a3125efed962b045704c30ae6965cfSebastian Redl // Bad code below 1230777972d38a3125efed962b045704c30ae6965cfSebastian Redl 124d4c5f84bbed2ecb5ddd0f0e8316c553b2084772aDouglas Gregor (void)static_cast<int*>((const void*)0); // expected-error {{static_cast from 'const void *' to 'int *' casts away qualifiers}} 1257c94c4bb7b875dc1a2b23f77f1ed8013cf94abdbArgyrios Kyrtzidis (void)static_cast<void (*)()>((void*)0); // expected-error {{static_cast from 'void *' to 'void (*)()' is not allowed}} 1260777972d38a3125efed962b045704c30ae6965cfSebastian Redl} 1270777972d38a3125efed962b045704c30ae6965cfSebastian Redl 12821593acb933324b439bc68b68e7cc7d1c3e3484dSebastian Redl// Member pointer upcast. 12921593acb933324b439bc68b68e7cc7d1c3e3484dSebastian Redlvoid t_529_9() 13021593acb933324b439bc68b68e7cc7d1c3e3484dSebastian Redl{ 13121593acb933324b439bc68b68e7cc7d1c3e3484dSebastian Redl (void)static_cast<int A::*>((int B::*)0); 13221593acb933324b439bc68b68e7cc7d1c3e3484dSebastian Redl 13321593acb933324b439bc68b68e7cc7d1c3e3484dSebastian Redl // Bad code below 1347c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)static_cast<int A::*>((int H::*)0); // expected-error {{ambiguous conversion from pointer to member of derived class 'H' to pointer to member of base class 'A':}} 1357c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)static_cast<int A::*>((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}} 136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (void)static_cast<int I::*>((int J::*)0); // expected-error {{static_cast from 'int J::*' to 'int I::*' is not allowed}} 13721593acb933324b439bc68b68e7cc7d1c3e3484dSebastian Redl} 1385ed66f709126b60e88631bf86d7e2d59e774686fSebastian Redl 1395ed66f709126b60e88631bf86d7e2d59e774686fSebastian Redl// PR 5261 - static_cast should instantiate template if possible 1405ed66f709126b60e88631bf86d7e2d59e774686fSebastian Redlnamespace pr5261 { 1415ed66f709126b60e88631bf86d7e2d59e774686fSebastian Redl struct base {}; 1425ed66f709126b60e88631bf86d7e2d59e774686fSebastian Redl template<typename E> struct derived : public base {}; 1435ed66f709126b60e88631bf86d7e2d59e774686fSebastian Redl template<typename E> struct outer { 1445ed66f709126b60e88631bf86d7e2d59e774686fSebastian Redl base *pb; 1455ed66f709126b60e88631bf86d7e2d59e774686fSebastian Redl ~outer() { (void)static_cast<derived<E>*>(pb); } 1465ed66f709126b60e88631bf86d7e2d59e774686fSebastian Redl }; 1475ed66f709126b60e88631bf86d7e2d59e774686fSebastian Redl outer<int> EntryList; 1485ed66f709126b60e88631bf86d7e2d59e774686fSebastian Redl} 14919aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregor 15019aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregor 15119aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregor// Initialization by constructor 15219aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregorstruct X0; 15319aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregor 15419aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregorstruct X1 { 15519aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregor X1(); 15619aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregor X1(X1&); 15719aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregor X1(const X0&); 15819aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregor 15919aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregor operator X0() const; 16019aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregor}; 16119aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregor 16219aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregorstruct X0 { }; 16319aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregor 16419aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregorvoid test_ctor_init() { 16519aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregor (void)static_cast<X1>(X1()); 16619aeac6ea4897c542b21c9f53a0a51762d8ddf83Douglas Gregor} 167ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregor 168ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregor// Casting away constness 169ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregorstruct X2 { 170ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregor}; 171ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregor 172ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregorstruct X3 : X2 { 173ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregor}; 174ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregor 175ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregorstruct X4 { 176ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregor typedef const X3 X3_typedef; 177ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregor 178ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregor void f() const { 179ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregor (void)static_cast<X3_typedef*>(x2); 180ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregor } 181ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregor 182ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregor const X2 *x2; 183ab15d0e5af616c11b6cbb478c81d0a8eaa9d450aDouglas Gregor}; 184c099d9bc4842afc0e724eddab661cbb386c82117Chandler Carruth 185c099d9bc4842afc0e724eddab661cbb386c82117Chandler Carruth// PR5897 - accept static_cast from const void* to const int (*)[1]. 186e1cd3374a8762d56c49d9abbc0c973a99e236422Chandler Carruthvoid PR5897() { (void)static_cast<const int(*)[1]>((const void*)0); } 1874ce46c2db2b17ef52b34dbeeec01e448025c8edcDouglas Gregor 1884ce46c2db2b17ef52b34dbeeec01e448025c8edcDouglas Gregornamespace PR6072 { 1894ce46c2db2b17ef52b34dbeeec01e448025c8edcDouglas Gregor struct A { }; 1908e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor struct B : A { void f(int); void f(); }; // expected-note 2{{candidate function}} 1914ce46c2db2b17ef52b34dbeeec01e448025c8edcDouglas Gregor struct C : B { }; 1924ce46c2db2b17ef52b34dbeeec01e448025c8edcDouglas Gregor struct D { }; 1934ce46c2db2b17ef52b34dbeeec01e448025c8edcDouglas Gregor 1944ce46c2db2b17ef52b34dbeeec01e448025c8edcDouglas Gregor void f() { 1954ce46c2db2b17ef52b34dbeeec01e448025c8edcDouglas Gregor (void)static_cast<void (A::*)()>(&B::f); 1964ce46c2db2b17ef52b34dbeeec01e448025c8edcDouglas Gregor (void)static_cast<void (B::*)()>(&B::f); 1974ce46c2db2b17ef52b34dbeeec01e448025c8edcDouglas Gregor (void)static_cast<void (C::*)()>(&B::f); 198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (void)static_cast<void (D::*)()>(&B::f); // expected-error-re{{address of overloaded function 'f' cannot be static_cast to type 'void (PR6072::D::*)(){{( __attribute__\(\(thiscall\)\))?}}'}} 1994ce46c2db2b17ef52b34dbeeec01e448025c8edcDouglas Gregor } 2004ce46c2db2b17ef52b34dbeeec01e448025c8edcDouglas Gregor} 201