value_or_const.pass.cpp revision 01afa5c6e407e985d9643707d7b7ab1384bd9317
1f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//===----------------------------------------------------------------------===//
2f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//
3f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
4f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//
5f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// This file is dual licensed under the MIT and the University of Illinois Open
6f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Source Licenses. See LICENSE.TXT for details.
7f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//
8f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//===----------------------------------------------------------------------===//
9f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
10f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// <optional>
11f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
12f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// template <class U> constexpr T optional<T>::value_or(U&& v) const&;
13f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
14f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include <optional>
15f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include <type_traits>
16f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include <cassert>
17f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
18f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if _LIBCPP_STD_VER > 11
19f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
20f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)struct Y
21f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){
22f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int i_;
23f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
24f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    constexpr Y(int i) : i_(i) {}
25f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
26f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
27f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)struct X
28f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){
29f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int i_;
30f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
31f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    constexpr X(int i) : i_(i) {}
32f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    constexpr X(const Y& y) : i_(y.i_) {}
33f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    constexpr X(Y&& y) : i_(y.i_+1) {}
34f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    friend constexpr bool operator==(const X& x, const X& y)
35f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        {return x.i_ == y.i_;}
36f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
37f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
38f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif  // _LIBCPP_STD_VER > 11
39f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
40f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)int main()
41f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){
42f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if _LIBCPP_STD_VER > 11
43f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    {
44f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        constexpr std::optional<X> opt(2);
45f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        constexpr Y y(3);
46f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        static_assert(opt.value_or(y) == 2, "");
47f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
48f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    {
49f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        constexpr std::optional<X> opt(2);
50f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        static_assert(opt.value_or(Y(3)) == 2, "");
51f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
52f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    {
53f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        constexpr std::optional<X> opt;
54f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        constexpr Y y(3);
55f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        static_assert(opt.value_or(y) == 3, "");
56f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
57f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    {
58f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        constexpr std::optional<X> opt;
59f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        static_assert(opt.value_or(Y(3)) == 4, "");
60f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
61f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    {
62f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        const std::optional<X> opt(2);
63f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        const Y y(3);
64f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        assert(opt.value_or(y) == 2);
65f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
66f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    {
67f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        const std::optional<X> opt(2);
68f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        assert(opt.value_or(Y(3)) == 2);
69f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
70f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    {
71f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        const std::optional<X> opt;
72f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        const Y y(3);
73f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        assert(opt.value_or(y) == 3);
74f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
75f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    {
76f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        const std::optional<X> opt;
77f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        assert(opt.value_or(Y(3)) == 4);
78f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
79f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif  // _LIBCPP_STD_VER > 11
80f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
81f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)