145
|
1 // PR c++/92695
|
|
2 // { dg-do compile { target c++2a } }
|
|
3
|
|
4 struct A {
|
|
5 virtual int get () = 0;
|
|
6 virtual int set (A *o) = 0;
|
|
7 };
|
|
8 struct B : A {
|
|
9 constexpr int get () override { return 10; }
|
|
10 constexpr int set (A *o) override { a = o; return 20; }
|
|
11 A *a {};
|
|
12 };
|
|
13 constexpr auto addressof = [] (A &n) { return &n; };
|
|
14 struct C {
|
|
15 B b;
|
|
16 A *c { addressof (b) };
|
|
17 constexpr int add () { return c->set (addressof (b)); }
|
|
18 };
|
|
19 struct D {
|
|
20 B b[2];
|
|
21 A *c { addressof (b[0]) };
|
|
22 constexpr int add () { return c->set (addressof (b[0])); }
|
|
23 };
|
|
24 template <typename T>
|
|
25 constexpr int get () { T f; return f.add (); }
|
|
26 static_assert (get<C> () == 20);
|
|
27 static_assert (get<D> () == 20);
|