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

Reply via email to