https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93310
Bug ID: 93310 Summary: Incorrect constexpr virtual evaluation inside a constructor Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: ppalka at gcc dot gnu.org Target Milestone: --- The following testcase gets miscompiled on GCC 9 and on GCC 10 with -DUSE_CONSTEXPR due to (I believe) the constexpr virtual evaluation incorrectly resolving the dynamic type of ((A *)this) to C rather than B inside B's constructor. $ cat virtual-2.cc #if defined USE_CONSTEXPR # define CONSTEXPR constexpr #else # define CONSTEXPR #endif struct A { virtual CONSTEXPR char f () const { return 'A'; } }; struct B : A { char x; constexpr B () : x (0) { x = ((A *)this)->f(); } virtual CONSTEXPR char f () const { return 'B'; } }; struct C : B { virtual CONSTEXPR char f () const { return 'C'; } }; int main () { CONSTEXPR C c; if (c.x != 'B') __builtin_abort (); } $ g++ -std=c++2a virtual-2.cc $ ./a.out $ g++ -std=c++2a virtual-2.cc -DUSE_CONSTEXPR $ ./a.out zsh: abort ./a.out