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)