1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // UNSUPPORTED: c++03, c++11, c++14
10 // <optional>
11
12 // constexpr optional(nullopt_t) noexcept;
13
14 #include <optional>
15 #include <type_traits>
16 #include <cassert>
17
18 #include "archetypes.h"
19
20 #include "test_macros.h"
21
22 using std::optional;
23 using std::nullopt_t;
24 using std::nullopt;
25
26 template <class Opt>
27 void
test_constexpr()28 test_constexpr()
29 {
30 static_assert(std::is_nothrow_constructible<Opt, nullopt_t&>::value, "");
31 static_assert(std::is_trivially_destructible<Opt>::value, "");
32 static_assert(std::is_trivially_destructible<typename Opt::value_type>::value, "");
33
34 constexpr Opt opt(nullopt);
35 static_assert(static_cast<bool>(opt) == false, "");
36
37 struct test_constexpr_ctor
38 : public Opt
39 {
40 constexpr test_constexpr_ctor() {}
41 };
42 }
43
44 template <class Opt>
45 void
test()46 test()
47 {
48 static_assert(std::is_nothrow_constructible<Opt, nullopt_t&>::value, "");
49 static_assert(!std::is_trivially_destructible<Opt>::value, "");
50 static_assert(!std::is_trivially_destructible<typename Opt::value_type>::value, "");
51 {
52 Opt opt(nullopt);
53 assert(static_cast<bool>(opt) == false);
54 }
55 {
56 const Opt opt(nullopt);
57 assert(static_cast<bool>(opt) == false);
58 }
59 struct test_constexpr_ctor
60 : public Opt
61 {
62 constexpr test_constexpr_ctor() {}
63 };
64 }
65
main(int,char **)66 int main(int, char**)
67 {
68 test_constexpr<optional<int>>();
69 test_constexpr<optional<int*>>();
70 test_constexpr<optional<ImplicitTypes::NoCtors>>();
71 test_constexpr<optional<NonTrivialTypes::NoCtors>>();
72 test_constexpr<optional<NonConstexprTypes::NoCtors>>();
73 test<optional<NonLiteralTypes::NoCtors>>();
74
75 return 0;
76 }
77