annotate gcc/testsuite/g++.dg/cpp2a/cond-triv1.C @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 // Testcase from P0848R0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 // { dg-do compile { target concepts } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 #include <type_traits>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 class optional
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 struct empty {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 union {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 empty _ = { };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 T value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 bool engaged = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 constexpr optional() = default;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 constexpr optional(optional const&)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 requires std::is_trivially_copy_constructible_v<T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 = default;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 constexpr optional(optional const& o)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 : engaged (o.engaged)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 if (engaged)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 new (&value) T (o.value);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 ~optional()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 requires std::is_trivially_destructible_v<T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 = default;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 ~optional()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 if (engaged)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 value.~T();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 // ...
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 struct A { A(); A(const A&); ~A(); };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 static_assert(std::is_trivially_copy_constructible_v<optional<int>>);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 static_assert(!std::is_trivially_copy_constructible_v<optional<A>>);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 static_assert(std::is_trivially_destructible_v<optional<int>>);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 static_assert(!std::is_trivially_destructible_v<optional<A>>);