annotate libstdc++-v3/testsuite/ext/new_allocator/89510.cc @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 2b5abeee2509
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1 // Copyright (C) 2020 Free Software Foundation, Inc.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
2 //
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
3 // This file is part of the GNU ISO C++ Library. This library is free
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
4 // software; you can redistribute it and/or modify it under the
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
5 // terms of the GNU General Public License as published by the
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
6 // Free Software Foundation; either version 3, or (at your option)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
7 // any later version.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
8
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
9 // This library is distributed in the hope that it will be useful,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
12 // GNU General Public License for more details.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
13
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
14 // You should have received a copy of the GNU General Public License along
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
15 // with this library; see the file COPYING3. If not see
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
16 // <http://www.gnu.org/licenses/>.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
17
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
18 // { dg-do compile { target c++11 } }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
19
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
20 #include <ext/new_allocator.h>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
21 #include <memory>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
22 #include <type_traits>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
23
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
24 using __gnu_cxx::new_allocator;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
25 using AT = std::allocator_traits<new_allocator<int>>;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
26
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
27 template<typename...> using void_t = void;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
28
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
29 template<typename T, typename U, typename = void>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
30 struct has_construct
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
31 : std::false_type
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
32 { };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
33
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
34 template<typename T, typename U>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
35 struct has_construct<T, U,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
36 void_t<decltype(std::declval<T&>().construct(std::declval<U*>()))>>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
37 : std::true_type
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
38 { };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
39
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
40 template<typename T, typename U, typename = void>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
41 struct has_destroy
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
42 : std::false_type
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
43 { };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
44
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
45 template<typename T, typename U>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
46 struct has_destroy<T, U,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
47 void_t<decltype(std::declval<T&>().destroy(std::declval<U*>()))>>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
48 : std::true_type
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
49 { };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
50
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
51 template<typename T, typename U, typename = void>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
52 struct has_traits_construct
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
53 : std::false_type
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
54 { };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
55
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
56 template<typename T, typename U>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
57 struct has_traits_construct<T, U,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
58 void_t<decltype(AT::construct(std::declval<T&>(), std::declval<U*>()))>>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
59 : std::true_type
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
60 { };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
61
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
62 template<typename T, typename U, typename = void>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
63 struct has_traits_destroy
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
64 : std::false_type
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
65 { };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
66
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
67 template<typename T, typename U>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
68 struct has_traits_destroy<T, U,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
69 void_t<decltype(AT::destroy(std::declval<T&>(), std::declval<U*>()))>>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
70 : std::true_type
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
71 { };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
72
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
73 struct NoDefault { NoDefault(int); };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
74 struct NoDest { private: ~NoDest(); };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
75
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
76 // Whether true or false, these should not give errors:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
77 constexpr bool c = has_construct<new_allocator<NoDefault>, NoDefault>::value;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
78 constexpr bool c2 = has_traits_construct<new_allocator<int>, NoDefault>::value;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
79 constexpr bool d = has_destroy<new_allocator<NoDest>, NoDest>::value;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
80 constexpr bool d2 = has_traits_destroy<new_allocator<int>, NoDest>::value;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
81
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
82 new_allocator<int> a;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
83
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
84 long* lp;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
85 #if __cplusplus <= 201703L
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
86 static_assert( noexcept(a.construct(lp)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
87 static_assert( noexcept(a.construct(lp, 1L)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
88 static_assert( noexcept(a.construct(lp, 2)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
89 static_assert( noexcept(a.construct(lp, 2U)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
90 static_assert( noexcept(a.destroy(lp)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
91 #endif
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
92 static_assert( noexcept(AT::construct(a, lp)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
93 static_assert( noexcept(AT::construct(a, lp, 1L)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
94 static_assert( noexcept(AT::construct(a, lp, 2)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
95 static_assert( noexcept(AT::construct(a, lp, 2U)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
96 static_assert( noexcept(AT::destroy(a, lp)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
97
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
98 struct X
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
99 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
100 X() noexcept;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
101 X(int) noexcept;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
102 ~X() noexcept;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
103 };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
104
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
105 X* xp;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
106 #if __cplusplus <= 201703L
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
107 static_assert( noexcept(a.construct(xp)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
108 static_assert( noexcept(a.construct(xp, 1)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
109 static_assert( noexcept(a.destroy(xp)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
110 #endif
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
111 static_assert( noexcept(AT::construct(a, xp)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
112 static_assert( noexcept(AT::construct(a, xp, 1)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
113 static_assert( noexcept(AT::destroy(a, xp)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
114
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
115 struct Y
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
116 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
117 Y() noexcept;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
118 Y(int) noexcept(false);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
119 ~Y() noexcept;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
120 };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
121
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
122 Y* yp;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
123 #if __cplusplus <= 201703L
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
124 static_assert( noexcept(a.construct(yp)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
125 static_assert( ! noexcept(a.construct(yp, 1)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
126 static_assert( noexcept(a.destroy(yp)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
127 #endif
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
128 static_assert( noexcept(AT::construct(a, yp)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
129 static_assert( ! noexcept(AT::construct(a, yp, 1)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
130 static_assert( noexcept(AT::destroy(a, yp)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
131
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
132 struct Z
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
133 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
134 Z() noexcept;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
135 Z(int) noexcept;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
136 ~Z() noexcept(false);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
137 };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
138
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
139 Z* zp;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
140 // These construct calls should be noexcept, but they are false because
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
141 // they use is_nothrow_constructible which depends on is_nothrow_destructible.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
142 #if __cplusplus <= 201703L
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
143 static_assert( ! noexcept(a.construct(zp)), "wrong" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
144 static_assert( ! noexcept(a.construct(zp, 1)), "wrong" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
145 static_assert( ! noexcept(a.destroy(zp)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
146 #endif
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
147 static_assert( ! noexcept(AT::construct(a, zp)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
148 static_assert( ! noexcept(AT::construct(a, zp, 1)), "" );
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
149 static_assert( ! noexcept(AT::destroy(a, zp)), "" );