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
13 // template <class U> constexpr T optional<T>::value_or(U&& v) const&;
16 #include <type_traits>
25 constexpr Y(int i) : i_(i) {}
32 constexpr X(int i) : i_(i) {}
33 constexpr X(const Y& y) : i_(y.i_) {}
34 constexpr X(Y&& y) : i_(y.i_+1) {}
35 friend constexpr bool operator==(const X& x, const X& y)
36 {return x.i_ == y.i_;}
42 constexpr optional<X> opt(2);
44 static_assert(opt.value_or(y) == 2, "");
47 constexpr optional<X> opt(2);
48 static_assert(opt.value_or(Y(3)) == 2, "");
51 constexpr optional<X> opt;
53 static_assert(opt.value_or(y) == 3, "");
56 constexpr optional<X> opt;
57 static_assert(opt.value_or(Y(3)) == 4, "");
60 const optional<X> opt(2);
62 assert(opt.value_or(y) == 2);
65 const optional<X> opt(2);
66 assert(opt.value_or(Y(3)) == 2);
69 const optional<X> opt;
71 assert(opt.value_or(y) == 3);
74 const optional<X> opt;
75 assert(opt.value_or(Y(3)) == 4);