// { dg-do run { target c++11 } } | |
// { dg-additional-options "-O2" } | |
#include <cassert> | |
void * | |
operator new (decltype (sizeof (0)), void *p) | |
{ | |
return p; | |
} | |
namespace std | |
{ | |
template <typename T> | |
T * | |
launder (T *p) | |
{ | |
return __builtin_launder (p); | |
} | |
} | |
struct A | |
{ | |
int& x; | |
}; | |
struct B | |
{ | |
A a; | |
}; | |
int | |
main () | |
{ | |
int x = 42; | |
B b{{x}}; | |
int y = 666; | |
new (&b.a) A{y}; | |
assert(std::launder(&b.a)->x == 666); | |
} |