// P0784R7 // { dg-do compile { target c++20 } } struct S { constexpr S () : r (4), s (3) { --r; s -= 2; } constexpr ~S () { if (s == 1) s = 0; else asm (""); if (s == 0 && r == 3) r = 0; else asm (""); } int r, s; }; struct T : public S { constexpr T () : t (2) {} int t; S u; }; struct U : public S { constexpr U (int x) : u (x) {} constexpr ~U () = default; int u; S v; }; constexpr S a; constexpr T b; constexpr U c = 3; static_assert (a.s == 1 && a.r == 3); static_assert (b.s == 1 && b.r == 3 && b.t == 2 && b.u.s == 1 && b.u.r == 3); static_assert (c.s == 1 && c.r == 3 && c.u == 3 && c.v.s == 1 && c.v.r == 3); void foo () { static constexpr S d; static constexpr T e; static constexpr U f = 4; static_assert (d.s == 1 && d.r == 3); static_assert (e.s == 1 && e.r == 3 && e.t == 2 && e.u.s == 1 && e.u.r == 3); static_assert (f.s == 1 && f.r == 3 && f.u == 4 && f.v.s == 1 && f.v.r == 3); if (1) { constexpr S g; constexpr T h; constexpr U i = 5; static_assert (g.s == 1 && g.r == 3); static_assert (h.s == 1 && h.r == 3 && h.t == 2 && h.u.s == 1 && h.u.r == 3); static_assert (i.s == 1 && i.r == 3 && i.u == 5 && i.v.s == 1 && i.v.r == 3); } } constexpr bool bar () { S j; T k; U l = 6; if (j.s != 1 || j.r != 3) return false; if (k.s != 1 || k.r != 3 || k.t != 2 || k.u.s != 1 || k.u.r != 3) return false; if (l.s != 1 || l.r != 3 || l.u != 6 || l.v.s != 1 || l.v.r != 3) return false; return true; } static_assert (bar ());