]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/experimental/optional/77288.cc
1 // { dg-do run { target c++14 } }
3 // Copyright (C) 2016-2018 Free Software Foundation, Inc.
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING3. If not see
18 // <http://www.gnu.org/licenses/>.
20 #include <experimental/optional>
21 #include <experimental/any>
23 using std::experimental::optional
;
25 #include <testsuite_hooks.h>
29 optional
<optional
<int>> nested_element
;
30 optional
<int> element
= {};
31 nested_element
= element
;
32 VERIFY(nested_element
);
38 static optional
<T
> get_result()
44 static optional
<T
> get_result_with_cond(bool cond
)
54 VERIFY(service_result
<int>::get_result());
55 VERIFY(service_result
<optional
<int>>::get_result());
56 VERIFY(service_result
<int>::get_result_with_cond(true));
57 VERIFY(service_result
<optional
<int>>::get_result_with_cond(true));
58 VERIFY(!service_result
<int>::get_result_with_cond(false));
59 VERIFY(!service_result
<optional
<int>>::get_result_with_cond(false));
65 Widget(optional
<int>) {}
74 static_assert(!std::is_assignable
<optional
<Widget
>&,
75 optional
<short>>::value
);
76 w
= optional
<optional
<int>>();
78 static_assert(!std::is_assignable
<optional
<Widget
>&,
79 optional
<optional
<short>>>::value
);
81 optional
<Widget
> w2
{optional
<int>()};
83 optional
<Widget
> w3
= optional
<int>();
85 optional
<Widget
> w4
{optional
<short>()};
87 static_assert(!std::is_convertible
<optional
<short>&&,
88 optional
<Widget
>>::value
);
90 optional
<Widget
> w6
{optional
<optional
<int>>()};
92 optional
<Widget
> w7
= optional
<optional
<int>>();
94 optional
<Widget
> w8
{optional
<optional
<short>>()};
96 static_assert(!std::is_convertible
<optional
<optional
<short>>&&,
97 optional
<Widget
>>::value
);
98 optional
<Widget
> w10
{optional
<optional
<short>>(10)};
100 optional
<Widget
> w11
= std::experimental::nullopt
;
102 optional
<Widget
> w12
= {};
104 optional
<Widget
> w13
{std::experimental::nullopt
};
106 optional
<Widget
> w14
;
114 Widget2(optional
<int>) {}
115 Widget2
& operator=(int) {return *this;}
116 Widget2
& operator=(optional
<int>) {return *this;}
124 w
= optional
<short>();
126 w
= optional
<optional
<int>>();
128 w
= optional
<optional
<short>>();
130 w
= optional
<optional
<short>>(10);
131 optional
<Widget2
> w2
= std::experimental::nullopt
;
133 optional
<Widget2
> w3
= {};
135 optional
<Widget2
> w4
{std::experimental::nullopt
};
137 optional
<Widget2
> w5
;
152 static_assert(!std::is_assignable
<optional
<Thingy
>&,
153 optional
<int>>::value
);
154 static_assert(std::is_assignable
<optional
<Thingy
>&,
155 optional
<short>>::value
);
156 static_assert(!std::is_assignable
<optional
<Thingy
>&,
157 optional
<optional
<int>>>::value
);
158 ot
= optional
<Widget
>();
160 optional
<Thingy
> ot2
{optional
<int>()};
162 static_assert(!std::is_convertible
<optional
<int>&&,
163 optional
<Thingy
>>::value
);
164 optional
<Thingy
> ot3
{optional
<short>()};
166 optional
<Thingy
> ot4
= optional
<short>();
169 optional
<Thingy
> ot5
{optional
<optional
<int>>()};
171 static_assert(!std::is_convertible
<optional
<optional
<int>>&&,
172 optional
<Thingy
>>::value
);
174 optional
<Thingy
> ot7
{optional
<Widget
>()};
176 optional
<Thingy
> ot8
= optional
<Widget
>();
178 static_assert(!std::is_constructible
<optional
<Thingy
>,
179 optional
<optional
<short>>>::value
);
180 static_assert(!std::is_convertible
<optional
<optional
<short>>,
181 optional
<Thingy
>>::value
);
182 static_assert(!std::is_assignable
<optional
<Thingy
>&,
183 optional
<optional
<short>>>::value
);
184 optional
<Thingy
> ot9
= std::experimental::nullopt
;
186 optional
<Thingy
> ot10
= {};
188 optional
<Thingy
> ot11
{std::experimental::nullopt
};
190 optional
<Thingy
> ot12
;
195 struct RvalueConstructible
197 RvalueConstructible(int) {}
198 RvalueConstructible(optional
<int>&&) {}
204 optional
<RvalueConstructible
> ori
;
205 static_assert(!std::is_assignable
<optional
<RvalueConstructible
>&,
206 optional
<int>&>::value
);
210 optional
<optional
<int>> ooi
;
211 static_assert(!std::is_assignable
<optional
<RvalueConstructible
>&,
212 optional
<optional
<int>>&>::value
);
213 ori
= std::move(ooi
);
216 static_assert(!std::is_constructible
<optional
<RvalueConstructible
>,
217 optional
<int>&>::value
);
218 static_assert(!std::is_convertible
<optional
<int>&,
219 optional
<RvalueConstructible
>>::value
);
221 optional
<RvalueConstructible
> ori2(std::move(oi
));
223 optional
<RvalueConstructible
> ori3
= std::move(oi
);
226 static_assert(!std::is_constructible
<optional
<RvalueConstructible
>,
227 optional
<optional
<int>>&>::value
);
228 static_assert(!std::is_convertible
<optional
<optional
<int>>&,
229 optional
<RvalueConstructible
>>::value
);
230 optional
<RvalueConstructible
> ori6(std::move(ooi
));
232 optional
<RvalueConstructible
> ori7
= std::move(ooi
);
234 optional
<RvalueConstructible
> ori8
= std::experimental::nullopt
;
236 optional
<RvalueConstructible
> ori9
= {};
238 optional
<RvalueConstructible
> ori10
{std::experimental::nullopt
};
240 optional
<RvalueConstructible
> ori11
;
248 explicit Thingy2(optional
<int>) {}
254 optional
<Thingy2
> ot
{optional
<int>{}};
256 static_assert(!std::is_convertible
<optional
<int>,
257 optional
<Thingy2
>>::value
);
258 optional
<Thingy2
> ot2
{optional
<short>{}};
260 static_assert(!std::is_convertible
<optional
<short>,
261 optional
<Thingy2
>>::value
);
262 optional
<Thingy2
> ot3
{optional
<optional
<int>>{}};
264 static_assert(!std::is_convertible
<optional
<optional
<int>>,
265 optional
<Thingy2
>>::value
);
266 optional
<Thingy2
> ot4
{optional
<optional
<short>>{}};
268 static_assert(!std::is_convertible
<optional
<optional
<short>>,
269 optional
<Thingy2
>>::value
);
271 optional
<Thingy2
> ot5
{optional
<Widget
>{}};
273 optional
<Thingy2
> ot6
= optional
<Widget
>();
276 static_assert(!std::is_assignable
<optional
<Thingy2
>&,
277 optional
<int>>::value
);
278 static_assert(!std::is_assignable
<optional
<Thingy2
>&,
279 optional
<short>>::value
);
280 static_assert(!std::is_assignable
<optional
<Thingy2
>&,
281 optional
<optional
<int>>>::value
);
282 static_assert(!std::is_assignable
<optional
<Thingy2
>&,
283 optional
<optional
<short>>>::value
);
284 optional
<Thingy2
> ot7
;
285 ot
= optional
<Widget
>();
287 optional
<Thingy2
> ot8
= std::experimental::nullopt
;
289 optional
<Thingy2
> ot9
= {};
291 optional
<Thingy2
> ot10
{std::experimental::nullopt
};
293 optional
<Thingy2
> ot11
;
301 template<class... Args
,
302 std::enable_if_t
<std::is_constructible
<Widget
, Args
&&...>::value
,
304 explicit Thingy3(Args
&&... args
) {}
310 optional
<Thingy3
> ot
{optional
<int>{}};
312 static_assert(!std::is_convertible
<optional
<int>,
313 optional
<Thingy3
>>::value
);
314 optional
<Thingy3
> ot2
{optional
<short>{}};
316 static_assert(!std::is_convertible
<optional
<short>,
317 optional
<Thingy3
>>::value
);
318 optional
<Thingy3
> ot3
{optional
<optional
<int>>{}};
320 static_assert(!std::is_convertible
<optional
<optional
<int>>,
321 optional
<Thingy3
>>::value
);
322 optional
<Thingy3
> ot4
{optional
<optional
<short>>{}};
324 static_assert(!std::is_convertible
<optional
<optional
<short>>,
325 optional
<Thingy3
>>::value
);
327 optional
<Thingy3
> ot5
{optional
<Widget
>{}};
329 optional
<Thingy3
> ot6
= optional
<Widget
>();
332 static_assert(!std::is_assignable
<optional
<Thingy3
>&,
333 optional
<int>>::value
);
334 static_assert(!std::is_assignable
<optional
<Thingy3
>&,
335 optional
<short>>::value
);
336 static_assert(!std::is_assignable
<optional
<Thingy3
>&,
337 optional
<optional
<int>>>::value
);
338 static_assert(!std::is_assignable
<optional
<Thingy3
>&,
339 optional
<optional
<short>>>::value
);
340 optional
<Thingy3
> ot7
;
341 ot
= optional
<Widget
>();
343 optional
<Thingy3
> ot8
= std::experimental::nullopt
;
345 optional
<Thingy3
> ot9
= {};
347 optional
<Thingy3
> ot10
{std::experimental::nullopt
};
349 optional
<Thingy3
> ot11
;
356 std::experimental::any a
= 42;
357 optional
<std::experimental::any
> oa2
= a
;
359 VERIFY(std::experimental::any_cast
<int>(*oa2
) == 42);
360 optional
<std::experimental::any
> oa3
= oa2
;
362 VERIFY(std::experimental::any_cast
<int>(*oa3
) == 42);
363 optional
<std::experimental::any
> oa4
{oa2
};
365 VERIFY(std::experimental::any_cast
<int>(*oa4
) == 42);
366 optional
<std::experimental::any
> oa5(oa2
);
368 VERIFY(std::experimental::any_cast
<int>(*oa5
) == 42);
369 optional
<std::experimental::any
> oa6
;
371 optional
<std::experimental::any
> oa7
= oa6
;
373 optional
<std::experimental::any
> oa8
{oa6
};
375 optional
<std::experimental::any
> oa9(oa6
);
382 optional
<int> oi(std::experimental::in_place
);
384 VERIFY(bool(oi
) == false);
385 optional
<X
> ot(std::experimental::in_place
);
387 VERIFY(bool(ot
) == false);
388 optional
<int> oi2(std::experimental::in_place
);