1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <optional>
11 
12 // constexpr optional(const T& v);
13 
14 #include <experimental/optional>
15 #include <type_traits>
16 #include <cassert>
17 
18 #if _LIBCPP_STD_VER > 11
19 
20 using std::experimental::optional;
21 
22 class X
23 {
24     int i_;
25 public:
26     X(int i) : i_(i) {}
27 
28     friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}
29 };
30 
31 class Y
32 {
33     int i_;
34 public:
35     constexpr Y(int i) : i_(i) {}
36 
37     friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_;}
38 };
39 
40 class Z
41 {
42     int i_;
43 public:
44     Z(int i) : i_(i) {}
45     Z(const Z&) {throw 6;}
46 };
47 
48 
49 #endif  // _LIBCPP_STD_VER > 11
50 
51 int main()
52 {
53 #if _LIBCPP_STD_VER > 11
54     {
55         typedef int T;
56         constexpr T t(5);
57         constexpr optional<T> opt(t);
58         static_assert(static_cast<bool>(opt) == true, "");
59         static_assert(*opt == 5, "");
60 
61         struct test_constexpr_ctor
62             : public optional<T>
63         {
64             constexpr test_constexpr_ctor(const T&) {}
65         };
66 
67     }
68     {
69         typedef double T;
70         constexpr T t(3);
71         constexpr optional<T> opt(t);
72         static_assert(static_cast<bool>(opt) == true, "");
73         static_assert(*opt == 3, "");
74 
75         struct test_constexpr_ctor
76             : public optional<T>
77         {
78             constexpr test_constexpr_ctor(const T&) {}
79         };
80 
81     }
82     {
83         typedef X T;
84         const T t(3);
85         optional<T> opt(t);
86         assert(static_cast<bool>(opt) == true);
87         assert(*opt == 3);
88     }
89     {
90         typedef Y T;
91         constexpr T t(3);
92         constexpr optional<T> opt(t);
93         static_assert(static_cast<bool>(opt) == true, "");
94         static_assert(*opt == 3, "");
95 
96         struct test_constexpr_ctor
97             : public optional<T>
98         {
99             constexpr test_constexpr_ctor(const T&) {}
100         };
101 
102     }
103     {
104         typedef Z T;
105         try
106         {
107             const T t(3);
108             optional<T> opt(t);
109             assert(false);
110         }
111         catch (int i)
112         {
113             assert(i == 6);
114         }
115     }
116 #endif  // _LIBCPP_STD_VER > 11
117 }
118