// PR c++/92695 // { dg-do compile { target c++20 } } struct A { virtual int get () = 0; virtual int set (A *o) = 0; }; struct B : A { constexpr int get () override { return 10; } constexpr int set (A *o) override { a = o; return 20; } A *a {}; }; constexpr auto addressof = [] (A &n) { return &n; }; struct C { B b; A *c { addressof (b) }; constexpr int add () { return c->set (addressof (b)); } }; struct D { B b[2]; A *c { addressof (b[0]) }; constexpr int add () { return c->set (addressof (b[0])); } }; template constexpr int get () { T f; return f.add (); } static_assert (get () == 20); static_assert (get () == 20);