| // PR c++/88337 - Implement P1327R1: Allow dynamic_cast/typeid in constexpr. |
| // { dg-do compile { target c++20 } } |
| // { dg-additional-options "-fdelete-null-pointer-checks" } |
| |
| // dynamic_cast in a constructor. |
| // [class.cdtor]#6: "If the operand of the dynamic_cast refers to the object |
| // under construction or destruction and the static type of the operand is not |
| // a pointer to or object of the constructor or destructor's own class or one |
| // of its bases, the dynamic_cast results in undefined behavior. |
| // See <https://gcc.gnu.org/ml/gcc-patches/2019-12/msg01521.html>. |
| |
| struct V { |
| virtual void f(); |
| }; |
| |
| struct A : V { }; |
| |
| struct B : V { |
| constexpr B(V*, A*); |
| }; |
| |
| struct D : B, A { |
| constexpr D() : B((A*)this, this) { } // { dg-message "in 'constexpr' expansion of" } |
| }; |
| |
| constexpr B::B(V* v, A* a) |
| { |
| dynamic_cast<B*>(a); |
| } |
| |
| constexpr D d; // { dg-error "accessing uninitialized member" } |
| // { dg-message "in 'constexpr' expansion of" "" { target *-*-* } .-1 } |