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