blob: 071f5943b9720b6d4649e44110c169ae55933c21 [file] [log] [blame]
Howard Hinnant01afa5c2013-09-02 20:30:37 +00001//===----------------------------------------------------------------------===//
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
Marshall Clow0cdbe602013-11-15 22:42:10 +000014#include <experimental/optional>
Howard Hinnant01afa5c2013-09-02 20:30:37 +000015#include <type_traits>
16#include <cassert>
17
Dan Albert1d4a1ed2016-05-25 22:36:09 -070018#if _LIBCPP_STD_VER > 11
19
Marshall Clow0cdbe602013-11-15 22:42:10 +000020using std::experimental::optional;
21
Howard Hinnant01afa5c2013-09-02 20:30:37 +000022class X
23{
24 int i_;
25public:
26 X(int i) : i_(i) {}
27
28 friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}
29};
30
31class Y
32{
33 int i_;
34public:
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
40class Z
41{
Dan Albert1d4a1ed2016-05-25 22:36:09 -070042 int i_;
Howard Hinnant01afa5c2013-09-02 20:30:37 +000043public:
Dan Albert1d4a1ed2016-05-25 22:36:09 -070044 Z(int i) : i_(i) {}
Howard Hinnant01afa5c2013-09-02 20:30:37 +000045 Z(const Z&) {throw 6;}
46};
47
48
Dan Albert1d4a1ed2016-05-25 22:36:09 -070049#endif // _LIBCPP_STD_VER > 11
50
Howard Hinnant01afa5c2013-09-02 20:30:37 +000051int main()
52{
Dan Albert1d4a1ed2016-05-25 22:36:09 -070053#if _LIBCPP_STD_VER > 11
Howard Hinnant01afa5c2013-09-02 20:30:37 +000054 {
55 typedef int T;
56 constexpr T t(5);
Marshall Clow0cdbe602013-11-15 22:42:10 +000057 constexpr optional<T> opt(t);
Howard Hinnant01afa5c2013-09-02 20:30:37 +000058 static_assert(static_cast<bool>(opt) == true, "");
59 static_assert(*opt == 5, "");
60
61 struct test_constexpr_ctor
Marshall Clow0cdbe602013-11-15 22:42:10 +000062 : public optional<T>
Howard Hinnant01afa5c2013-09-02 20:30:37 +000063 {
64 constexpr test_constexpr_ctor(const T&) {}
65 };
66
67 }
68 {
69 typedef double T;
70 constexpr T t(3);
Marshall Clow0cdbe602013-11-15 22:42:10 +000071 constexpr optional<T> opt(t);
Howard Hinnant01afa5c2013-09-02 20:30:37 +000072 static_assert(static_cast<bool>(opt) == true, "");
73 static_assert(*opt == 3, "");
74
75 struct test_constexpr_ctor
Marshall Clow0cdbe602013-11-15 22:42:10 +000076 : public optional<T>
Howard Hinnant01afa5c2013-09-02 20:30:37 +000077 {
78 constexpr test_constexpr_ctor(const T&) {}
79 };
80
81 }
82 {
83 typedef X T;
84 const T t(3);
Marshall Clow0cdbe602013-11-15 22:42:10 +000085 optional<T> opt(t);
Howard Hinnant01afa5c2013-09-02 20:30:37 +000086 assert(static_cast<bool>(opt) == true);
87 assert(*opt == 3);
88 }
89 {
90 typedef Y T;
91 constexpr T t(3);
Marshall Clow0cdbe602013-11-15 22:42:10 +000092 constexpr optional<T> opt(t);
Howard Hinnant01afa5c2013-09-02 20:30:37 +000093 static_assert(static_cast<bool>(opt) == true, "");
94 static_assert(*opt == 3, "");
95
96 struct test_constexpr_ctor
Marshall Clow0cdbe602013-11-15 22:42:10 +000097 : public optional<T>
Howard Hinnant01afa5c2013-09-02 20:30:37 +000098 {
99 constexpr test_constexpr_ctor(const T&) {}
100 };
101
102 }
103 {
104 typedef Z T;
105 try
106 {
107 const T t(3);
Marshall Clow0cdbe602013-11-15 22:42:10 +0000108 optional<T> opt(t);
Howard Hinnant01afa5c2013-09-02 20:30:37 +0000109 assert(false);
110 }
111 catch (int i)
112 {
113 assert(i == 6);
114 }
115 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700116#endif // _LIBCPP_STD_VER > 11
Howard Hinnant01afa5c2013-09-02 20:30:37 +0000117}