1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
20777972d38a3125efed962b045704c30ae6965cfSebastian Redl
30777972d38a3125efed962b045704c30ae6965cfSebastian Redlstruct A {};
40777972d38a3125efed962b045704c30ae6965cfSebastian Redlstruct B : A {};
50777972d38a3125efed962b045704c30ae6965cfSebastian Redlstruct C : B {};
60777972d38a3125efed962b045704c30ae6965cfSebastian Redl
70777972d38a3125efed962b045704c30ae6965cfSebastian Redlstruct D : private A {};
80777972d38a3125efed962b045704c30ae6965cfSebastian Redlstruct E : A {};
90777972d38a3125efed962b045704c30ae6965cfSebastian Redlstruct F : B, E {};
100777972d38a3125efed962b045704c30ae6965cfSebastian Redl
117c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallstruct Incomplete; // expected-note 2 {{forward declaration of 'Incomplete'}}
120777972d38a3125efed962b045704c30ae6965cfSebastian Redl
13d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redlstruct Poly
14d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl{
15d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl  virtual void f();
16d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl};
17d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl
18d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redlstruct PolyDerived : Poly
19d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl{
20d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl};
21d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl
220777972d38a3125efed962b045704c30ae6965cfSebastian Redlvoid basic_bad()
230777972d38a3125efed962b045704c30ae6965cfSebastian Redl{
240777972d38a3125efed962b045704c30ae6965cfSebastian Redl  // ptr -> nonptr
257c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  (void)dynamic_cast<A>((A*)0); // expected-error {{'A' is not a reference or pointer}}
260777972d38a3125efed962b045704c30ae6965cfSebastian Redl  // nonptr -> ptr
270777972d38a3125efed962b045704c30ae6965cfSebastian Redl  (void)dynamic_cast<A*>(0); // expected-error {{'int' is not a pointer}}
280777972d38a3125efed962b045704c30ae6965cfSebastian Redl  // ptr -> noncls
290777972d38a3125efed962b045704c30ae6965cfSebastian Redl  (void)dynamic_cast<int*>((A*)0); // expected-error {{'int' is not a class}}
300777972d38a3125efed962b045704c30ae6965cfSebastian Redl  // noncls -> ptr
310777972d38a3125efed962b045704c30ae6965cfSebastian Redl  (void)dynamic_cast<A*>((int*)0); // expected-error {{'int' is not a class}}
320777972d38a3125efed962b045704c30ae6965cfSebastian Redl  // ref -> noncls
330777972d38a3125efed962b045704c30ae6965cfSebastian Redl  (void)dynamic_cast<int&>(*((A*)0)); // expected-error {{'int' is not a class}}
340777972d38a3125efed962b045704c30ae6965cfSebastian Redl  // noncls -> ref
350777972d38a3125efed962b045704c30ae6965cfSebastian Redl  (void)dynamic_cast<A&>(*((int*)0)); // expected-error {{'int' is not a class}}
360777972d38a3125efed962b045704c30ae6965cfSebastian Redl  // ptr -> incomplete
377c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  (void)dynamic_cast<Incomplete*>((A*)0); // expected-error {{'Incomplete' is an incomplete type}}
380777972d38a3125efed962b045704c30ae6965cfSebastian Redl  // incomplete -> ptr
397c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  (void)dynamic_cast<A*>((Incomplete*)0); // expected-error {{'Incomplete' is an incomplete type}}
40f5d40bf94ac1d1d281d50fa12aeb2b7b8d7aaf9dEli Friedman  // rvalue -> lvalue
41f5d40bf94ac1d1d281d50fa12aeb2b7b8d7aaf9dEli Friedman  (void)dynamic_cast<A&>(A()); // expected-error {{dynamic_cast from rvalue to reference type 'A &'}}
420777972d38a3125efed962b045704c30ae6965cfSebastian Redl}
430777972d38a3125efed962b045704c30ae6965cfSebastian Redl
440777972d38a3125efed962b045704c30ae6965cfSebastian Redlvoid same()
450777972d38a3125efed962b045704c30ae6965cfSebastian Redl{
460777972d38a3125efed962b045704c30ae6965cfSebastian Redl  (void)dynamic_cast<A*>((A*)0);
470777972d38a3125efed962b045704c30ae6965cfSebastian Redl  (void)dynamic_cast<A&>(*((A*)0));
480777972d38a3125efed962b045704c30ae6965cfSebastian Redl}
490777972d38a3125efed962b045704c30ae6965cfSebastian Redl
500777972d38a3125efed962b045704c30ae6965cfSebastian Redlvoid up()
510777972d38a3125efed962b045704c30ae6965cfSebastian Redl{
520777972d38a3125efed962b045704c30ae6965cfSebastian Redl  (void)dynamic_cast<A*>((B*)0);
530777972d38a3125efed962b045704c30ae6965cfSebastian Redl  (void)dynamic_cast<A&>(*((B*)0));
540777972d38a3125efed962b045704c30ae6965cfSebastian Redl  (void)dynamic_cast<A*>((C*)0);
550777972d38a3125efed962b045704c30ae6965cfSebastian Redl  (void)dynamic_cast<A&>(*((C*)0));
560777972d38a3125efed962b045704c30ae6965cfSebastian Redl
570777972d38a3125efed962b045704c30ae6965cfSebastian Redl  // Inaccessible
580777972d38a3125efed962b045704c30ae6965cfSebastian Redl  //(void)dynamic_cast<A*>((D*)0);
590777972d38a3125efed962b045704c30ae6965cfSebastian Redl  //(void)dynamic_cast<A&>(*((D*)0));
600777972d38a3125efed962b045704c30ae6965cfSebastian Redl
610777972d38a3125efed962b045704c30ae6965cfSebastian Redl  // Ambiguous
627c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  (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}}
637c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  (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}}
640777972d38a3125efed962b045704c30ae6965cfSebastian Redl}
650777972d38a3125efed962b045704c30ae6965cfSebastian Redl
66d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redlvoid poly()
67d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl{
68d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl  (void)dynamic_cast<A*>((Poly*)0);
69d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl  (void)dynamic_cast<A&>(*((Poly*)0));
70d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl  (void)dynamic_cast<A*>((PolyDerived*)0);
71d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl  (void)dynamic_cast<A&>(*((PolyDerived*)0));
72d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl
73d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl  // Not polymorphic source
747c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  (void)dynamic_cast<Poly*>((A*)0); // expected-error {{'A' is not polymorphic}}
757c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  (void)dynamic_cast<PolyDerived&>(*((A*)0)); // expected-error {{'A' is not polymorphic}}
76d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl}
77