1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li 3*67e74705SXin Li struct A {}; 4*67e74705SXin Li struct B : A {}; 5*67e74705SXin Li struct C : B {}; 6*67e74705SXin Li 7*67e74705SXin Li struct D : private A {}; 8*67e74705SXin Li struct E : A {}; 9*67e74705SXin Li struct F : B, E {}; 10*67e74705SXin Li 11*67e74705SXin Li struct Incomplete; // expected-note 2 {{forward declaration of 'Incomplete'}} 12*67e74705SXin Li 13*67e74705SXin Li struct Poly 14*67e74705SXin Li { 15*67e74705SXin Li virtual void f(); 16*67e74705SXin Li }; 17*67e74705SXin Li 18*67e74705SXin Li struct PolyDerived : Poly 19*67e74705SXin Li { 20*67e74705SXin Li }; 21*67e74705SXin Li basic_bad()22*67e74705SXin Livoid basic_bad() 23*67e74705SXin Li { 24*67e74705SXin Li // ptr -> nonptr 25*67e74705SXin Li (void)dynamic_cast<A>((A*)0); // expected-error {{'A' is not a reference or pointer}} 26*67e74705SXin Li // nonptr -> ptr 27*67e74705SXin Li (void)dynamic_cast<A*>(0); // expected-error {{'int' is not a pointer}} 28*67e74705SXin Li // ptr -> noncls 29*67e74705SXin Li (void)dynamic_cast<int*>((A*)0); // expected-error {{'int' is not a class}} 30*67e74705SXin Li // noncls -> ptr 31*67e74705SXin Li (void)dynamic_cast<A*>((int*)0); // expected-error {{'int' is not a class}} 32*67e74705SXin Li // ref -> noncls 33*67e74705SXin Li (void)dynamic_cast<int&>(*((A*)0)); // expected-error {{'int' is not a class}} 34*67e74705SXin Li // noncls -> ref 35*67e74705SXin Li (void)dynamic_cast<A&>(*((int*)0)); // expected-error {{'int' is not a class}} 36*67e74705SXin Li // ptr -> incomplete 37*67e74705SXin Li (void)dynamic_cast<Incomplete*>((A*)0); // expected-error {{'Incomplete' is an incomplete type}} 38*67e74705SXin Li // incomplete -> ptr 39*67e74705SXin Li (void)dynamic_cast<A*>((Incomplete*)0); // expected-error {{'Incomplete' is an incomplete type}} 40*67e74705SXin Li // rvalue -> lvalue 41*67e74705SXin Li (void)dynamic_cast<A&>(A()); // expected-error {{dynamic_cast from rvalue to reference type 'A &'}} 42*67e74705SXin Li } 43*67e74705SXin Li same()44*67e74705SXin Livoid same() 45*67e74705SXin Li { 46*67e74705SXin Li (void)dynamic_cast<A*>((A*)0); 47*67e74705SXin Li (void)dynamic_cast<A&>(*((A*)0)); 48*67e74705SXin Li } 49*67e74705SXin Li up()50*67e74705SXin Livoid up() 51*67e74705SXin Li { 52*67e74705SXin Li (void)dynamic_cast<A*>((B*)0); 53*67e74705SXin Li (void)dynamic_cast<A&>(*((B*)0)); 54*67e74705SXin Li (void)dynamic_cast<A*>((C*)0); 55*67e74705SXin Li (void)dynamic_cast<A&>(*((C*)0)); 56*67e74705SXin Li 57*67e74705SXin Li // Inaccessible 58*67e74705SXin Li //(void)dynamic_cast<A*>((D*)0); 59*67e74705SXin Li //(void)dynamic_cast<A&>(*((D*)0)); 60*67e74705SXin Li 61*67e74705SXin Li // Ambiguous 62*67e74705SXin Li (void)dynamic_cast<A*>((F*)0); // expected-error {{ambiguous conversion from derived class 'F' to base class 'A':\n struct F -> struct B -> struct A\n struct F -> struct E -> struct A}} 63*67e74705SXin Li (void)dynamic_cast<A&>(*((F*)0)); // expected-error {{ambiguous conversion from derived class 'F' to base class 'A':\n struct F -> struct B -> struct A\n struct F -> struct E -> struct A}} 64*67e74705SXin Li } 65*67e74705SXin Li poly()66*67e74705SXin Livoid poly() 67*67e74705SXin Li { 68*67e74705SXin Li (void)dynamic_cast<A*>((Poly*)0); 69*67e74705SXin Li (void)dynamic_cast<A&>(*((Poly*)0)); 70*67e74705SXin Li (void)dynamic_cast<A*>((PolyDerived*)0); 71*67e74705SXin Li (void)dynamic_cast<A&>(*((PolyDerived*)0)); 72*67e74705SXin Li 73*67e74705SXin Li // Not polymorphic source 74*67e74705SXin Li (void)dynamic_cast<Poly*>((A*)0); // expected-error {{'A' is not polymorphic}} 75*67e74705SXin Li (void)dynamic_cast<PolyDerived&>(*((A*)0)); // expected-error {{'A' is not polymorphic}} 76*67e74705SXin Li } 77