1 // P1064R0 2 // { dg-do compile } 3 // { dg-options "-std=c++2a" } 4 5 struct X1 6 { 7 virtual int f1() const = 0; 8 virtual int f2() const = 0; 9 virtual int f3() const = 0; 10 }; 11 12 struct X2: public X1 13 { f1X214 constexpr virtual int f1() const { return 21; } f2X215 constexpr virtual int f2() const { return 22; } f3X216 constexpr virtual int f3() const { return 23; } 17 }; 18 19 struct X3: public X2 20 { f1X321 virtual int f1() const { return 31; } f2X322 virtual int f2() const { return 32; } f3X323 virtual int f3() const { return 33; } 24 }; 25 26 struct X4: public X3 27 { f1X428 constexpr virtual int f1() const { return 41; } f2X429 constexpr virtual int f2() const { return 42; } f3X430 constexpr virtual int f3() const { return 43; } 31 }; 32 33 constexpr int (X1::*pf)() const = &X1::f2; 34 35 constexpr X2 x2; 36 static_assert(x2.f2() == 22); 37 static_assert((x2.*pf)() == 22); 38 39 constexpr X1 const& r2 = x2; 40 static_assert(r2.f2() == 22); 41 static_assert((r2.*pf)() == 22); 42 43 constexpr X1 const* p2 = &x2; 44 static_assert(p2->f2() == 22); 45 static_assert((p2->*pf)() == 22); 46 47 constexpr X4 x4; 48 static_assert(x4.f2() == 42); 49 static_assert((x4.*pf)() == 42); 50 51 constexpr X1 const& r4 = x4; 52 static_assert(r4.f2() == 42); 53 static_assert((r4.*pf)() == 42); 54 55 constexpr X1 const* p4 = &x4; 56 static_assert(p4->f2() == 42); 57 static_assert((p4->*pf)() == 42); 58