1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // UNSUPPORTED: c++98, c++03, c++11, c++14
14 // constexpr optional(T&& v);
17 #include <type_traits>
20 #include "test_macros.h"
21 #include "archetypes.hpp"
31 Z(Z&&) {TEST_THROW(6);}
39 constexpr optional<T> opt(T(5));
40 static_assert(static_cast<bool>(opt) == true, "");
41 static_assert(*opt == 5, "");
43 struct test_constexpr_ctor
46 constexpr test_constexpr_ctor(T&&) {}
51 constexpr optional<T> opt(T(3));
52 static_assert(static_cast<bool>(opt) == true, "");
53 static_assert(*opt == 3, "");
55 struct test_constexpr_ctor
58 constexpr test_constexpr_ctor(T&&) {}
63 optional<const int> o(std::move(x));
67 typedef TestTypes::TestType T;
69 optional<T> opt = T{3};
70 assert(T::alive == 1);
71 assert(T::move_constructed == 1);
72 assert(static_cast<bool>(opt) == true);
73 assert(opt.value().value == 3);
76 typedef ExplicitTestTypes::TestType T;
77 static_assert(!std::is_convertible<T&&, optional<T>>::value, "");
79 optional<T> opt(T{3});
80 assert(T::alive == 1);
81 assert(T::move_constructed == 1);
82 assert(static_cast<bool>(opt) == true);
83 assert(opt.value().value == 3);
86 typedef TestTypes::TestType T;
88 optional<T> opt = {3};
89 assert(T::alive == 1);
90 assert(T::value_constructed == 1);
91 assert(T::copy_constructed == 0);
92 assert(T::move_constructed == 0);
93 assert(static_cast<bool>(opt) == true);
94 assert(opt.value().value == 3);
97 typedef ConstexprTestTypes::TestType T;
98 constexpr optional<T> opt = {T(3)};
99 static_assert(static_cast<bool>(opt) == true, "");
100 static_assert(opt.value().value == 3, "");
102 struct test_constexpr_ctor
105 constexpr test_constexpr_ctor(const T&) {}
109 typedef ConstexprTestTypes::TestType T;
110 constexpr optional<T> opt = {3};
111 static_assert(static_cast<bool>(opt) == true, "");
112 static_assert(opt.value().value == 3, "");
114 struct test_constexpr_ctor
117 constexpr test_constexpr_ctor(const T&) {}
121 typedef ExplicitConstexprTestTypes::TestType T;
122 static_assert(!std::is_convertible<T&&, optional<T>>::value, "");
123 constexpr optional<T> opt(T{3});
124 static_assert(static_cast<bool>(opt) == true, "");
125 static_assert(opt.value().value == 3, "");
127 struct test_constexpr_ctor
130 constexpr test_constexpr_ctor(T&&) {}
134 #ifndef TEST_HAS_NO_EXCEPTIONS
144 optional<T> opt(std::move(t));