// PR c++/57599
class A { };
class B : public A { };
void p()
{
  B* b;
  A* a1;
  a1 = dynamic_cast<A*>(b);
  a1 = dynamic_cast<const A*>(b);          // { dg-error "invalid" }
  a1 = dynamic_cast<volatile A*>(b);       // { dg-error "invalid" }
  a1 = dynamic_cast<const volatile A*>(b); // { dg-error "invalid" }
  const A* a2;
  a2 = dynamic_cast<A*>(b);
  a2 = dynamic_cast<const A*>(b);
  a2 = dynamic_cast<volatile A*>(b);       // { dg-error "invalid" }
  a2 = dynamic_cast<const volatile A*>(b); // { dg-error "invalid" }
  volatile A* a3;
  a3 = dynamic_cast<A*>(b);
  a3 = dynamic_cast<const A*>(b);          // { dg-error "invalid" }
  a3 = dynamic_cast<volatile A*>(b);
  a3 = dynamic_cast<const volatile A*>(b); // { dg-error "invalid" }
  const volatile A* a4;
  a4 = dynamic_cast<A*>(b);
  a4 = dynamic_cast<const A*>(b);
  a4 = dynamic_cast<volatile A*>(b);
  a4 = dynamic_cast<const volatile A*>(b);
}
void r()
{
  B b;
  A& a1 = dynamic_cast<A&>(b);
  A& a2 = dynamic_cast<const A&>(b);                // { dg-error "" }
  A& a3 = dynamic_cast<volatile A&>(b);             // { dg-error "" }
  A& a4 = dynamic_cast<const volatile A&>(b);       // { dg-error "" }
  const A& ca1 = dynamic_cast<A&>(b);
  const A& ca2 = dynamic_cast<const A&>(b);
  const A& ca3 = dynamic_cast<volatile A&>(b);       // { dg-error "" }
  const A& ca4 = dynamic_cast<const volatile A&>(b); // { dg-error "" }
  volatile A& va1 = dynamic_cast<A&>(b);
  volatile A& va2 = dynamic_cast<const A&>(b);       // { dg-error "" }
  volatile A& va3 = dynamic_cast<volatile A&>(b);
  volatile A& va4 = dynamic_cast<const volatile A&>(b);// { dg-error "" }
  const volatile A& cva1 = dynamic_cast<A&>(b);
  const volatile A& cva2 = dynamic_cast<const A&>(b);
  const volatile A& cva3 = dynamic_cast<volatile A&>(b);
  const volatile A& cva4 = dynamic_cast<const volatile A&>(b);
}