1a9e65961SEric Fiselier //===----------------------------------------------------------------------===//
2a9e65961SEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a9e65961SEric Fiselier //
7a9e65961SEric Fiselier //===----------------------------------------------------------------------===//
8a9e65961SEric Fiselier //
931cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
10a9e65961SEric Fiselier
112659663eSLouis Dionne // Throwing bad_optional_access is supported starting in macosx10.13
12*c360553cSLouis Dionne // XFAIL: use_system_cxx_lib && target={{.+}}-apple-macosx10.{{9|10|11|12}} && !no-exceptions
13e9c66ad9SMehdi Amini
14a9e65961SEric Fiselier // <optional>
15a9e65961SEric Fiselier
16a9e65961SEric Fiselier // constexpr optional(const T& v);
17a9e65961SEric Fiselier
18a9e65961SEric Fiselier #include <optional>
19a9e65961SEric Fiselier #include <type_traits>
20a9e65961SEric Fiselier #include <cassert>
21a9e65961SEric Fiselier
22a9e65961SEric Fiselier #include "test_macros.h"
23cc89063bSNico Weber #include "archetypes.h"
24a9e65961SEric Fiselier
25a9e65961SEric Fiselier using std::optional;
26a9e65961SEric Fiselier
main(int,char **)272df59c50SJF Bastien int main(int, char**)
28a9e65961SEric Fiselier {
29a9e65961SEric Fiselier {
30a9e65961SEric Fiselier typedef int T;
31a9e65961SEric Fiselier constexpr T t(5);
32a9e65961SEric Fiselier constexpr optional<T> opt(t);
33a9e65961SEric Fiselier static_assert(static_cast<bool>(opt) == true, "");
34a9e65961SEric Fiselier static_assert(*opt == 5, "");
35a9e65961SEric Fiselier
36a9e65961SEric Fiselier struct test_constexpr_ctor
37a9e65961SEric Fiselier : public optional<T>
38a9e65961SEric Fiselier {
39a9e65961SEric Fiselier constexpr test_constexpr_ctor(const T&) {}
40a9e65961SEric Fiselier };
41a9e65961SEric Fiselier
42a9e65961SEric Fiselier }
43a9e65961SEric Fiselier {
44a9e65961SEric Fiselier typedef double T;
45a9e65961SEric Fiselier constexpr T t(3);
46a9e65961SEric Fiselier constexpr optional<T> opt(t);
47a9e65961SEric Fiselier static_assert(static_cast<bool>(opt) == true, "");
48a9e65961SEric Fiselier static_assert(*opt == 3, "");
49a9e65961SEric Fiselier
50a9e65961SEric Fiselier struct test_constexpr_ctor
51a9e65961SEric Fiselier : public optional<T>
52a9e65961SEric Fiselier {
53a9e65961SEric Fiselier constexpr test_constexpr_ctor(const T&) {}
54a9e65961SEric Fiselier };
55a9e65961SEric Fiselier
56a9e65961SEric Fiselier }
57a9e65961SEric Fiselier {
5864428acfSEric Fiselier const int x = 42;
5964428acfSEric Fiselier optional<const int> o(x);
6064428acfSEric Fiselier assert(*o == x);
6164428acfSEric Fiselier }
6264428acfSEric Fiselier {
63a9e65961SEric Fiselier typedef TestTypes::TestType T;
64a9e65961SEric Fiselier T::reset();
65a9e65961SEric Fiselier const T t(3);
66a9e65961SEric Fiselier optional<T> opt = t;
67a9e65961SEric Fiselier assert(T::alive == 2);
68a9e65961SEric Fiselier assert(T::copy_constructed == 1);
69a9e65961SEric Fiselier assert(static_cast<bool>(opt) == true);
70a9e65961SEric Fiselier assert(opt.value().value == 3);
71a9e65961SEric Fiselier }
72a9e65961SEric Fiselier {
73a9e65961SEric Fiselier typedef ExplicitTestTypes::TestType T;
74a9e65961SEric Fiselier static_assert(!std::is_convertible<T const&, optional<T>>::value, "");
75a9e65961SEric Fiselier T::reset();
76a9e65961SEric Fiselier const T t(3);
77a9e65961SEric Fiselier optional<T> opt(t);
78a9e65961SEric Fiselier assert(T::alive == 2);
79a9e65961SEric Fiselier assert(T::copy_constructed == 1);
80a9e65961SEric Fiselier assert(static_cast<bool>(opt) == true);
81a9e65961SEric Fiselier assert(opt.value().value == 3);
82a9e65961SEric Fiselier }
83a9e65961SEric Fiselier {
84a9e65961SEric Fiselier typedef ConstexprTestTypes::TestType T;
85a9e65961SEric Fiselier constexpr T t(3);
86a9e65961SEric Fiselier constexpr optional<T> opt = {t};
87a9e65961SEric Fiselier static_assert(static_cast<bool>(opt) == true, "");
88a9e65961SEric Fiselier static_assert(opt.value().value == 3, "");
89a9e65961SEric Fiselier
90a9e65961SEric Fiselier struct test_constexpr_ctor
91a9e65961SEric Fiselier : public optional<T>
92a9e65961SEric Fiselier {
93a9e65961SEric Fiselier constexpr test_constexpr_ctor(const T&) {}
94a9e65961SEric Fiselier };
95a9e65961SEric Fiselier }
96a9e65961SEric Fiselier {
97a9e65961SEric Fiselier typedef ExplicitConstexprTestTypes::TestType T;
98a9e65961SEric Fiselier static_assert(!std::is_convertible<const T&, optional<T>>::value, "");
99a9e65961SEric Fiselier constexpr T t(3);
100a9e65961SEric Fiselier constexpr optional<T> opt(t);
101a9e65961SEric Fiselier static_assert(static_cast<bool>(opt) == true, "");
102a9e65961SEric Fiselier static_assert(opt.value().value == 3, "");
103a9e65961SEric Fiselier
104a9e65961SEric Fiselier struct test_constexpr_ctor
105a9e65961SEric Fiselier : public optional<T>
106a9e65961SEric Fiselier {
107a9e65961SEric Fiselier constexpr test_constexpr_ctor(const T&) {}
108a9e65961SEric Fiselier };
109a9e65961SEric Fiselier
110a9e65961SEric Fiselier }
111a9e65961SEric Fiselier #ifndef TEST_HAS_NO_EXCEPTIONS
112a9e65961SEric Fiselier {
113a9e65961SEric Fiselier struct Z {
114a9e65961SEric Fiselier Z(int) {}
115a9e65961SEric Fiselier Z(const Z&) {throw 6;}
116a9e65961SEric Fiselier };
117a9e65961SEric Fiselier typedef Z T;
118a9e65961SEric Fiselier try
119a9e65961SEric Fiselier {
120a9e65961SEric Fiselier const T t(3);
121a9e65961SEric Fiselier optional<T> opt(t);
122a9e65961SEric Fiselier assert(false);
123a9e65961SEric Fiselier }
124a9e65961SEric Fiselier catch (int i)
125a9e65961SEric Fiselier {
126a9e65961SEric Fiselier assert(i == 6);
127a9e65961SEric Fiselier }
128a9e65961SEric Fiselier }
129a9e65961SEric Fiselier #endif
1302df59c50SJF Bastien
1312df59c50SJF Bastien return 0;
132a9e65961SEric Fiselier }
133