1 // { dg-do run { target c++11 } } 2 // { dg-additional-options "-O2" } 3 4 #include <cassert> 5 6 void * 7 operator new (decltype (sizeof (0)), void *p) 8 { 9 return p; 10 } 11 12 namespace std 13 { 14 template <typename T> 15 T * launder(T * p)16 launder (T *p) 17 { 18 return __builtin_launder (p); 19 } 20 } 21 22 struct A 23 { 24 int& x; 25 }; 26 27 struct B 28 { 29 A a; 30 }; 31 32 int main()33main () 34 { 35 int x = 42; 36 B b{{x}}; 37 int y = 666; 38 new (&b.a) A{y}; 39 assert(std::launder(&b.a)->x == 666); 40 } 41