//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11 // // template // constexpr // explicit optional(in_place_t, initializer_list il, Args&&... args); #include #include #include #include #include "test_macros.h" using std::experimental::optional; using std::experimental::in_place_t; using std::experimental::in_place; class X { int i_; int j_ = 0; public: X() : i_(0) {} X(int i) : i_(i) {} X(int i, int j) : i_(i), j_(j) {} ~X() {} friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_ && x.j_ == y.j_;} }; class Y { int i_; int j_ = 0; public: constexpr Y() : i_(0) {} constexpr Y(int i) : i_(i) {} constexpr Y(std::initializer_list il) : i_(il.begin()[0]), j_(il.begin()[1]) {} friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_ && x.j_ == y.j_;} }; class Z { int i_; int j_ = 0; public: constexpr Z() : i_(0) {} constexpr Z(int i) : i_(i) {} Z(std::initializer_list il) : i_(il.begin()[0]), j_(il.begin()[1]) {TEST_THROW(6);} friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_ && x.j_ == y.j_;} }; int main() { { static_assert(!std::is_constructible&>::value, ""); static_assert(!std::is_constructible, std::initializer_list&>::value, ""); } { optional> opt(in_place, {3, 1}); assert(static_cast(opt) == true); assert((*opt == std::vector{3, 1})); assert(opt->size() == 2); } { optional> opt(in_place, {3, 1}, std::allocator()); assert(static_cast(opt) == true); assert((*opt == std::vector{3, 1})); assert(opt->size() == 2); } { static_assert(std::is_constructible, std::initializer_list&>::value, ""); constexpr optional opt(in_place, {3, 1}); static_assert(static_cast(opt) == true, ""); static_assert(*opt == Y{3, 1}, ""); struct test_constexpr_ctor : public optional { constexpr test_constexpr_ctor(in_place_t, std::initializer_list i) : optional(in_place, i) {} }; constexpr test_constexpr_ctor dopt(in_place, {42, 101, -1}); static_assert(*dopt == Y{42, 101, -1}, ""); } #ifndef TEST_HAS_NO_EXCEPTIONS { static_assert(std::is_constructible, std::initializer_list&>::value, ""); try { optional opt(in_place, {3, 1}); assert(false); } catch (int i) { assert(i == 6); } } #endif }