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()33 main ()
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