https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109770
Bug ID: 109770 Summary: wrong(?) devirtualization Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: ipa Assignee: unassigned at gcc dot gnu.org Reporter: rguenth at gcc dot gnu.org CC: marxin at gcc dot gnu.org Target Milestone: --- #include <new> struct Base { virtual ~Base() {} }; struct A : Base { virtual ~A() {} }; struct B : Base { [[gnu::noinline]] B() { new (this) A; } virtual ~B() { __builtin_abort (); } }; int main() { Base *p = new B; delete p; } aborts when compiled with -O2 (with devirtualization enabled). Neither GCC nor clang diagnose the placement new in B::B() (but it looks fishy).