blob: ac52a42d595387f20cc44128fe07dc0f5a968788 [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(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 X(X&& x) : i_(x.i_) {}
28
29 friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}
30};
31
32class Y
33{
34 int i_;
35public:
36 constexpr Y(int i) : i_(i) {}
37 constexpr Y(Y&& x) : i_(x.i_) {}
38
39 friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_;}
40};
41
42class Z
43{
Dan Albert1d4a1ed2016-05-25 22:36:09 -070044 int i_;
Howard Hinnant01afa5c2013-09-02 20:30:37 +000045public:
Dan Albert1d4a1ed2016-05-25 22:36:09 -070046 Z(int i) : i_(i) {}
Howard Hinnant01afa5c2013-09-02 20:30:37 +000047 Z(Z&&) {throw 6;}
48};
49
Dan Albert1d4a1ed2016-05-25 22:36:09 -070050#endif // _LIBCPP_STD_VER > 11
Howard Hinnant01afa5c2013-09-02 20:30:37 +000051
52int main()
53{
Dan Albert1d4a1ed2016-05-25 22:36:09 -070054#if _LIBCPP_STD_VER > 11
Howard Hinnant01afa5c2013-09-02 20:30:37 +000055 {
56 typedef int T;
Marshall Clow0cdbe602013-11-15 22:42:10 +000057 constexpr optional<T> opt(T(5));
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(T&&) {}
65 };
66 }
67 {
68 typedef double T;
Marshall Clow0cdbe602013-11-15 22:42:10 +000069 constexpr optional<T> opt(T(3));
Howard Hinnant01afa5c2013-09-02 20:30:37 +000070 static_assert(static_cast<bool>(opt) == true, "");
71 static_assert(*opt == 3, "");
72
73 struct test_constexpr_ctor
Marshall Clow0cdbe602013-11-15 22:42:10 +000074 : public optional<T>
Howard Hinnant01afa5c2013-09-02 20:30:37 +000075 {
76 constexpr test_constexpr_ctor(T&&) {}
77 };
78 }
79 {
80 typedef X T;
Marshall Clow0cdbe602013-11-15 22:42:10 +000081 optional<T> opt(T(3));
Howard Hinnant01afa5c2013-09-02 20:30:37 +000082 assert(static_cast<bool>(opt) == true);
83 assert(*opt == 3);
84 }
85 {
86 typedef Y T;
Marshall Clow0cdbe602013-11-15 22:42:10 +000087 constexpr optional<T> opt(T(3));
Howard Hinnant01afa5c2013-09-02 20:30:37 +000088 static_assert(static_cast<bool>(opt) == true, "");
89 static_assert(*opt == 3, "");
90
91 struct test_constexpr_ctor
Marshall Clow0cdbe602013-11-15 22:42:10 +000092 : public optional<T>
Howard Hinnant01afa5c2013-09-02 20:30:37 +000093 {
94 constexpr test_constexpr_ctor(T&&) {}
95 };
96 }
97 {
98 typedef Z T;
99 try
100 {
Marshall Clow0cdbe602013-11-15 22:42:10 +0000101 optional<T> opt(T(3));
Howard Hinnant01afa5c2013-09-02 20:30:37 +0000102 assert(false);
103 }
104 catch (int i)
105 {
106 assert(i == 6);
107 }
108 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -0700109#endif // _LIBCPP_STD_VER > 11
Howard Hinnant01afa5c2013-09-02 20:30:37 +0000110}