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 
11 // Throwing bad_optional_access is supported starting in macosx10.13
12 // XFAIL: use_system_cxx_lib && target={{.+}}-apple-macosx10.{{9|10|11|12}} && !no-exceptions
13 
14 // <optional>
15 
16 // constexpr optional(const T& v);
17 
18 #include <optional>
19 #include <type_traits>
20 #include <cassert>
21 
22 #include "test_macros.h"
23 #include "archetypes.h"
24 
25 using std::optional;
26 
main(int,char **)27 int main(int, char**)
28 {
29     {
30         typedef int T;
31         constexpr T t(5);
32         constexpr optional<T> opt(t);
33         static_assert(static_cast<bool>(opt) == true, "");
34         static_assert(*opt == 5, "");
35 
36         struct test_constexpr_ctor
37             : public optional<T>
38         {
39             constexpr test_constexpr_ctor(const T&) {}
40         };
41 
42     }
43     {
44         typedef double T;
45         constexpr T t(3);
46         constexpr optional<T> opt(t);
47         static_assert(static_cast<bool>(opt) == true, "");
48         static_assert(*opt == 3, "");
49 
50         struct test_constexpr_ctor
51             : public optional<T>
52         {
53             constexpr test_constexpr_ctor(const T&) {}
54         };
55 
56     }
57     {
58         const int x = 42;
59         optional<const int> o(x);
60         assert(*o == x);
61     }
62     {
63         typedef TestTypes::TestType T;
64         T::reset();
65         const T t(3);
66         optional<T> opt = t;
67         assert(T::alive == 2);
68         assert(T::copy_constructed == 1);
69         assert(static_cast<bool>(opt) == true);
70         assert(opt.value().value == 3);
71     }
72     {
73         typedef ExplicitTestTypes::TestType T;
74         static_assert(!std::is_convertible<T const&, optional<T>>::value, "");
75         T::reset();
76         const T t(3);
77         optional<T> opt(t);
78         assert(T::alive == 2);
79         assert(T::copy_constructed == 1);
80         assert(static_cast<bool>(opt) == true);
81         assert(opt.value().value == 3);
82     }
83     {
84         typedef ConstexprTestTypes::TestType T;
85         constexpr T t(3);
86         constexpr optional<T> opt = {t};
87         static_assert(static_cast<bool>(opt) == true, "");
88         static_assert(opt.value().value == 3, "");
89 
90         struct test_constexpr_ctor
91             : public optional<T>
92         {
93             constexpr test_constexpr_ctor(const T&) {}
94         };
95     }
96     {
97         typedef ExplicitConstexprTestTypes::TestType T;
98         static_assert(!std::is_convertible<const T&, optional<T>>::value, "");
99         constexpr T t(3);
100         constexpr optional<T> opt(t);
101         static_assert(static_cast<bool>(opt) == true, "");
102         static_assert(opt.value().value == 3, "");
103 
104         struct test_constexpr_ctor
105             : public optional<T>
106         {
107             constexpr test_constexpr_ctor(const T&) {}
108         };
109 
110     }
111 #ifndef TEST_HAS_NO_EXCEPTIONS
112     {
113         struct Z {
114             Z(int) {}
115             Z(const Z&) {throw 6;}
116         };
117         typedef Z T;
118         try
119         {
120             const T t(3);
121             optional<T> opt(t);
122             assert(false);
123         }
124         catch (int i)
125         {
126             assert(i == 6);
127         }
128     }
129 #endif
130 
131   return 0;
132 }
133