annotate gcc/testsuite/g++.dg/cpp1z/launder4.C @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // { dg-do run { target c++11 } }
kono
parents:
diff changeset
2 // { dg-additional-options "-O2" }
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 #include <cassert>
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 void *
kono
parents:
diff changeset
7 operator new (decltype (sizeof (0)), void *p)
kono
parents:
diff changeset
8 {
kono
parents:
diff changeset
9 return p;
kono
parents:
diff changeset
10 }
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 namespace std
kono
parents:
diff changeset
13 {
kono
parents:
diff changeset
14 template <typename T>
kono
parents:
diff changeset
15 T *
kono
parents:
diff changeset
16 launder (T *p)
kono
parents:
diff changeset
17 {
kono
parents:
diff changeset
18 return __builtin_launder (p);
kono
parents:
diff changeset
19 }
kono
parents:
diff changeset
20 }
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 struct A
kono
parents:
diff changeset
23 {
kono
parents:
diff changeset
24 int& x;
kono
parents:
diff changeset
25 };
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 struct B
kono
parents:
diff changeset
28 {
kono
parents:
diff changeset
29 A a;
kono
parents:
diff changeset
30 };
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 int
kono
parents:
diff changeset
33 main ()
kono
parents:
diff changeset
34 {
kono
parents:
diff changeset
35 int x = 42;
kono
parents:
diff changeset
36 B b{{x}};
kono
parents:
diff changeset
37 int y = 666;
kono
parents:
diff changeset
38 new (&b.a) A{y};
kono
parents:
diff changeset
39 assert(std::launder(&b.a)->x == 666);
kono
parents:
diff changeset
40 }