https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93153

            Bug ID: 93153
           Summary: Wrong optimization while devirtualizing after
                    placement new over local var
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ch3root at openwall dot com
  Target Milestone: ---

It seems gcc doesn't account for a possible type change of local variables due
to storage reuse while devirtualizing method calls (seems to happen in ccp1):

----------------------------------------------------------------------
#include <stdio.h>
#include <new>

struct Y {
    virtual void foo() { puts("Y"); }
};

struct X : Y {
    virtual void foo() { puts("X"); }
};

static_assert(sizeof(X) == sizeof(Y));

int main()
{
    Y y;
    Y *p = new (&y) X;
    p->foo();
}
----------------------------------------------------------------------
$ g++ -std=c++2a -pedantic -Wall -Wextra test.cc && ./a.out
X
$ g++ -std=c++2a -pedantic -Wall -Wextra -O3 test.cc && ./a.out
Y
----------------------------------------------------------------------
gcc x86-64 version: g++ (GCC) 10.0.0 20200104 (experimental)
----------------------------------------------------------------------

Reply via email to