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

--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Created attachment 61688
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=61688&action=edit
gcc16-pr120777-wip.patch

Started playing with this and made some progess, but
struct A {
  int a;
  constexpr virtual int foo () { return a; };
  constexpr A () : a (42) {}
  constexpr A (int x) : a (x) {}
  constexpr virtual ~A () { if (a < 42 || a > 62) asm (""); }
};
struct B : public A {
  int b;
  constexpr virtual int foo () { return a + b; }
  constexpr B () : A (43), b (42) {}
  constexpr B (int x, int y) : A (x), b (y) {}
  constexpr virtual ~B () { if (b < 42 || b > 62) asm (""); }
};
struct C : virtual public B {
  int c;
  constexpr C () : B (44, 43), c (45) {}
  constexpr C (int x) : B (44, 43), c (x) {}
  constexpr virtual int bar () { return a + b + c; }
  constexpr virtual ~C () { if (c < 42 || c > 62) asm (""); }
};
struct D : virtual public B {
  int d;
  constexpr D () : B (44, 43), d (45) {}
  constexpr D (int x) : B (44, 43), d (x) {}
  constexpr virtual int baz () { return a + b + d; }
  constexpr virtual ~D () { if (d < 42 || d > 62) asm (""); }
};
struct E : public C, D {
  int e;
  constexpr E () : B (), C (), D () {}
  constexpr E (int x, int y, int z, int w, int v) : B (x, y), C (z), D (w), e
(v) {}
  constexpr virtual ~E () { if (e < 42 || e > 62) asm (""); }
};

constexpr bool
qux ()
{
  E f (45, 46, 47, 48, 49);
  f.a++;
  f.b++;
  f.c++;
  f.d++;
  f.e++;
  C *c = static_cast <C *> (&f);
  D *d = static_cast <D *> (&f);
  B *b = static_cast <B *> (&f);
  A *a = static_cast <A *> (&f);
  if (f.foo () != 46 + 47)
    return false;
  if (f.bar () != 46 + 47 + 48)
    return false;
  if (f.baz () != 46 + 47 + 49)
    return false;
  a->a += 2;
  b->b += 3;
  c->c += 4;
  c->a += 5;
  d->d += 6;
  d->a += 7;
  if (c->foo () != 60 + 50)
    return false;
  c->b -= 3;
  if (d->foo () != 60 + 47)
    return false;
  if (f.a != 60 || f.b != 47 || f.c != 52 || f.d != 55 || f.e != 50)
    return false;
  return true;
}

static_assert (qux ());

still doesn't work yet.

Reply via email to