diff options
Diffstat (limited to 'test/std/experimental/optional/optional.object')
15 files changed, 174 insertions, 27 deletions
diff --git a/test/std/experimental/optional/optional.object/optional.object.assign/assign_value.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.assign/assign_value.pass.cpp index 3d0d2e03158b..0215417ce0b2 100644 --- a/test/std/experimental/optional/optional.object/optional.object.assign/assign_value.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.assign/assign_value.pass.cpp @@ -19,6 +19,14 @@ using std::experimental::optional; +struct AllowConstAssign { + AllowConstAssign() {} + AllowConstAssign(AllowConstAssign const&) {} + AllowConstAssign const& operator=(AllowConstAssign const&) const { + return *this; + } +}; + struct X { }; @@ -53,6 +61,11 @@ int main() assert(*opt == i); } { + optional<const AllowConstAssign> opt; + const AllowConstAssign other; + opt = other; + } + { optional<std::unique_ptr<int>> opt; opt = std::unique_ptr<int>(new int(3)); assert(static_cast<bool>(opt) == true); diff --git a/test/std/experimental/optional/optional.object/optional.object.assign/copy.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.assign/copy.pass.cpp index 89ea345029c2..17ee9754531f 100644 --- a/test/std/experimental/optional/optional.object/optional.object.assign/copy.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.assign/copy.pass.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11 -// XFAIL: libcpp-no-exceptions // <optional> // optional<T>& operator=(const optional<T>& rhs); @@ -17,8 +16,17 @@ #include <type_traits> #include <cassert> +#include "test_macros.h" + using std::experimental::optional; +struct AllowConstAssign { + AllowConstAssign(AllowConstAssign const&) {} + AllowConstAssign const& operator=(AllowConstAssign const&) const { + return *this; + } +}; + struct X { static bool throw_now; @@ -27,7 +35,7 @@ struct X X(const X&) { if (throw_now) - throw 6; + TEST_THROW(6); } }; @@ -43,6 +51,11 @@ int main() assert(static_cast<bool>(opt) == static_cast<bool>(opt2)); } { + optional<const AllowConstAssign> opt; + optional<const AllowConstAssign> opt2; + opt = opt2; + } + { optional<int> opt; constexpr optional<int> opt2(2); opt = opt2; @@ -67,6 +80,7 @@ int main() assert(static_cast<bool>(opt) == static_cast<bool>(opt2)); assert(*opt == *opt2); } +#ifndef TEST_HAS_NO_EXCEPTIONS { optional<X> opt; optional<X> opt2(X{}); @@ -83,4 +97,5 @@ int main() assert(static_cast<bool>(opt) == false); } } +#endif } diff --git a/test/std/experimental/optional/optional.object/optional.object.assign/emplace.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.assign/emplace.pass.cpp index 94f2bb21a475..256396094a90 100644 --- a/test/std/experimental/optional/optional.object/optional.object.assign/emplace.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.assign/emplace.pass.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11 -// XFAIL: libcpp-no-exceptions // <optional> // template <class... Args> void optional<T>::emplace(Args&&... args); @@ -18,6 +17,8 @@ #include <cassert> #include <memory> +#include "test_macros.h" + using std::experimental::optional; class X @@ -48,7 +49,7 @@ class Z public: static bool dtor_called; Z() = default; - Z(int) {throw 6;} + Z(int) {TEST_THROW(6);} ~Z() {dtor_called = true;} }; @@ -81,6 +82,12 @@ int main() assert(*opt == 1); } { + optional<const int> opt(2); + opt.emplace(1); + assert(static_cast<bool>(opt) == true); + assert(*opt == 1); + } + { optional<X> opt; opt.emplace(); assert(static_cast<bool>(opt) == true); @@ -125,6 +132,7 @@ int main() assert(Y::dtor_called == true); } } +#ifndef TEST_HAS_NO_EXCEPTIONS { Z z; optional<Z> opt(z); @@ -141,4 +149,5 @@ int main() assert(Z::dtor_called == true); } } +#endif } diff --git a/test/std/experimental/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp index fec37408e43b..8a265808a3c3 100644 --- a/test/std/experimental/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11 -// XFAIL: libcpp-no-exceptions // <optional> // template <class U, class... Args> @@ -19,6 +18,8 @@ #include <cassert> #include <vector> +#include "test_macros.h" + using std::experimental::optional; class X @@ -60,7 +61,7 @@ public: constexpr Z() : i_(0) {} constexpr Z(int i) : i_(i) {} Z(std::initializer_list<int> il) : i_(il.begin()[0]), j_(il.begin()[1]) - {throw 6;} + {TEST_THROW(6);} ~Z() {dtor_called = true;} friend constexpr bool operator==(const Z& x, const Z& y) @@ -81,6 +82,17 @@ int main() assert(*opt == X({1, 2})); } } + X::dtor_called = false; + { + X x; + { + optional<const X> opt(x); + assert(X::dtor_called == false); + opt.emplace({1, 2}); + assert(X::dtor_called == true); + assert(*opt == X({1, 2})); + } + } { optional<std::vector<int>> opt; opt.emplace({1, 2, 3}, std::allocator<int>()); @@ -93,6 +105,7 @@ int main() assert(static_cast<bool>(opt) == true); assert(*opt == Y({1, 2})); } +#ifndef TEST_HAS_NO_EXCEPTIONS { Z z; optional<Z> opt(z); @@ -109,4 +122,5 @@ int main() assert(Z::dtor_called == true); } } +#endif } diff --git a/test/std/experimental/optional/optional.object/optional.object.assign/move.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.assign/move.pass.cpp index fa00f5602c7f..4e2aca978865 100644 --- a/test/std/experimental/optional/optional.object/optional.object.assign/move.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.assign/move.pass.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11 -// XFAIL: libcpp-no-exceptions // <optional> // optional<T>& operator=(optional<T>&& rhs) @@ -19,8 +18,17 @@ #include <type_traits> #include <cassert> +#include "test_macros.h" + using std::experimental::optional; +struct AllowConstAssign { + AllowConstAssign(AllowConstAssign const&) {} + AllowConstAssign const& operator=(AllowConstAssign const&) const { + return *this; + } +}; + struct X { static bool throw_now; @@ -29,7 +37,7 @@ struct X X(X&&) { if (throw_now) - throw 6; + TEST_THROW(6); } X& operator=(X&&) noexcept { @@ -37,10 +45,10 @@ struct X } }; -struct Y {}; - bool X::throw_now = false; +struct Y {}; + int main() { { @@ -77,6 +85,12 @@ int main() assert(*opt == *opt2); } { + optional<const AllowConstAssign> opt; + optional<const AllowConstAssign> opt2; + opt = std::move(opt2); + } +#ifndef TEST_HAS_NO_EXCEPTIONS + { static_assert(!std::is_nothrow_move_assignable<optional<X>>::value, ""); optional<X> opt; optional<X> opt2(X{}); @@ -93,6 +107,7 @@ int main() assert(static_cast<bool>(opt) == false); } } +#endif { static_assert(std::is_nothrow_move_assignable<optional<Y>>::value, ""); } diff --git a/test/std/experimental/optional/optional.object/optional.object.ctor/const_T.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.ctor/const_T.pass.cpp index 9b6511a0006d..6371dcb4e51c 100644 --- a/test/std/experimental/optional/optional.object/optional.object.ctor/const_T.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.ctor/const_T.pass.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: c++98, c++03, c++11 -// XFAIL: libcpp-no-exceptions // <optional> @@ -18,6 +17,8 @@ #include <type_traits> #include <cassert> +#include "test_macros.h" + using std::experimental::optional; class X @@ -42,7 +43,7 @@ class Z { public: Z(int) {} - Z(const Z&) {throw 6;} + Z(const Z&) {TEST_THROW(6);} }; @@ -97,6 +98,7 @@ int main() }; } +#ifndef TEST_HAS_NO_EXCEPTIONS { typedef Z T; try @@ -110,4 +112,5 @@ int main() assert(i == 6); } } +#endif } diff --git a/test/std/experimental/optional/optional.object/optional.object.ctor/copy.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.ctor/copy.pass.cpp index 144af2e3a7dc..4b66fe80bbb2 100644 --- a/test/std/experimental/optional/optional.object/optional.object.ctor/copy.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.ctor/copy.pass.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11 -// XFAIL: libcpp-no-exceptions // <optional> // optional(const optional<T>& rhs); @@ -17,6 +16,8 @@ #include <type_traits> #include <cassert> +#include "test_macros.h" + using std::experimental::optional; template <class T> @@ -24,7 +25,12 @@ void test(const optional<T>& rhs, bool is_going_to_throw = false) { bool rhs_engaged = static_cast<bool>(rhs); +#ifdef TEST_HAS_NO_EXCEPTIONS + if (is_going_to_throw) + return; +#else try +#endif { optional<T> lhs = rhs; assert(is_going_to_throw == false); @@ -32,10 +38,13 @@ test(const optional<T>& rhs, bool is_going_to_throw = false) if (rhs_engaged) assert(*lhs == *rhs); } +#ifndef TEST_HAS_NO_EXCEPTIONS catch (int i) { assert(i == 6); + assert(is_going_to_throw); } +#endif } class X @@ -68,7 +77,7 @@ public: Z(const Z&) { if (++count == 2) - throw 6; + TEST_THROW(6); } friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_;} @@ -88,6 +97,11 @@ int main() test(rhs); } { + typedef const int T; + optional<T> rhs(3); + test(rhs); + } + { typedef X T; optional<T> rhs; test(rhs); @@ -98,6 +112,11 @@ int main() test(rhs); } { + typedef const X T; + optional<T> rhs(X(3)); + test(rhs); + } + { typedef Y T; optional<T> rhs; test(rhs); diff --git a/test/std/experimental/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp index dc1666b10362..c46407896576 100644 --- a/test/std/experimental/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: c++98, c++03, c++11 -// XFAIL: libcpp-no-exceptions // <optional> @@ -19,6 +18,7 @@ #include <type_traits> #include <cassert> +#include "test_macros.h" using std::experimental::optional; using std::experimental::in_place_t; @@ -55,7 +55,7 @@ public: class Z { public: - Z(int i) {throw 6;} + Z(int) {TEST_THROW(6);} }; @@ -128,6 +128,7 @@ int main() }; } +#ifndef TEST_HAS_NO_EXCEPTIONS { try { @@ -139,4 +140,5 @@ int main() assert(i == 6); } } +#endif } diff --git a/test/std/experimental/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp index 9bd6b18989fc..b75c147df513 100644 --- a/test/std/experimental/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11 -// XFAIL: libcpp-no-exceptions // <optional> // template <class U, class... Args> @@ -20,6 +19,8 @@ #include <vector> #include <cassert> +#include "test_macros.h" + using std::experimental::optional; using std::experimental::in_place_t; using std::experimental::in_place; @@ -60,7 +61,7 @@ public: constexpr Z() : i_(0) {} constexpr Z(int i) : i_(i) {} Z(std::initializer_list<int> il) : i_(il.begin()[0]), j_(il.begin()[1]) - {throw 6;} + {TEST_THROW(6);} friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_ && x.j_ == y.j_;} @@ -100,6 +101,7 @@ int main() 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<optional<Z>, std::initializer_list<int>&>::value, ""); try @@ -112,4 +114,5 @@ int main() assert(i == 6); } } +#endif } diff --git a/test/std/experimental/optional/optional.object/optional.object.ctor/move.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.ctor/move.pass.cpp index 851157f960f9..a8bb6e9c275c 100644 --- a/test/std/experimental/optional/optional.object/optional.object.ctor/move.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.ctor/move.pass.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11 -// XFAIL: libcpp-no-exceptions // <optional> // optional(optional<T>&& rhs) noexcept(is_nothrow_move_constructible<T>::value); @@ -17,6 +16,8 @@ #include <type_traits> #include <cassert> +#include "test_macros.h" + using std::experimental::optional; template <class T> @@ -26,16 +27,24 @@ test(optional<T>& rhs, bool is_going_to_throw = false) static_assert(std::is_nothrow_move_constructible<optional<T>>::value == std::is_nothrow_move_constructible<T>::value, ""); bool rhs_engaged = static_cast<bool>(rhs); +#ifdef TEST_HAS_NO_EXCEPTIONS + if (is_going_to_throw) + return; +#else try +#endif { optional<T> lhs = std::move(rhs); assert(is_going_to_throw == false); assert(static_cast<bool>(lhs) == rhs_engaged); } +#ifndef TEST_HAS_NO_EXCEPTIONS catch (int i) { assert(i == 6); + assert(is_going_to_throw); } +#endif } class X @@ -68,12 +77,23 @@ public: Z(Z&&) { if (++count == 2) - throw 6; + TEST_THROW(6); } friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_;} }; + +class ConstMovable +{ + int i_; +public: + ConstMovable(int i) : i_(i) {} + ConstMovable(const ConstMovable&& x) : i_(x.i_) {} + ~ConstMovable() {i_ = 0;} + friend bool operator==(const ConstMovable& x, const ConstMovable& y) {return x.i_ == y.i_;} +}; + int main() { { @@ -87,6 +107,11 @@ int main() test(rhs); } { + typedef const int T; + optional<T> rhs(3); + test(rhs); + } + { typedef X T; optional<T> rhs; test(rhs); @@ -97,6 +122,11 @@ int main() test(rhs); } { + typedef const ConstMovable T; + optional<T> rhs(ConstMovable(3)); + test(rhs); + } + { typedef Y T; optional<T> rhs; test(rhs); diff --git a/test/std/experimental/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp index ef21fcdf9e6d..1941546a53f7 100644 --- a/test/std/experimental/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// // // UNSUPPORTED: c++98, c++03, c++11 -// XFAIL: libcpp-no-exceptions // <optional> @@ -18,6 +17,8 @@ #include <type_traits> #include <cassert> +#include "test_macros.h" + using std::experimental::optional; class X @@ -44,7 +45,7 @@ class Z { public: Z(int) {} - Z(Z&&) {throw 6;} + Z(Z&&) {TEST_THROW(6);} }; @@ -92,6 +93,7 @@ int main() constexpr test_constexpr_ctor(T&&) {} }; } +#ifndef TEST_HAS_NO_EXCEPTIONS { typedef Z T; try @@ -104,4 +106,5 @@ int main() assert(i == 6); } } +#endif } diff --git a/test/std/experimental/optional/optional.object/optional.object.observe/op_arrow_const.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.observe/op_arrow_const.pass.cpp index cf900d7029e1..46586c65a6e0 100644 --- a/test/std/experimental/optional/optional.object/optional.object.observe/op_arrow_const.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.observe/op_arrow_const.pass.cpp @@ -51,6 +51,9 @@ int main() { constexpr optional<Z> opt(Z{}); assert(opt->test() == 1); +#ifndef _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF + static_assert(opt->test() == 1, ""); +#endif } #ifdef _LIBCPP_DEBUG { diff --git a/test/std/experimental/optional/optional.object/optional.object.observe/value.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.observe/value.pass.cpp index b998f3067f4f..c8f07111c23d 100644 --- a/test/std/experimental/optional/optional.object/optional.object.observe/value.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.observe/value.pass.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11 -// XFAIL: libcpp-no-exceptions // <optional> // T& optional<T>::value(); @@ -17,6 +16,8 @@ #include <type_traits> #include <cassert> +#include "test_macros.h" + using std::experimental::optional; using std::experimental::bad_optional_access; @@ -35,6 +36,7 @@ int main() opt.emplace(); assert(opt.value().test() == 4); } +#ifndef TEST_HAS_NO_EXCEPTIONS { optional<X> opt; try @@ -46,4 +48,5 @@ int main() { } } +#endif } diff --git a/test/std/experimental/optional/optional.object/optional.object.observe/value_const.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.observe/value_const.pass.cpp index a38b1f930c72..98ff16e4d13b 100644 --- a/test/std/experimental/optional/optional.object/optional.object.observe/value_const.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.observe/value_const.pass.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11 -// XFAIL: libcpp-no-exceptions // <optional> // constexpr const T& optional<T>::value() const; @@ -17,6 +16,8 @@ #include <type_traits> #include <cassert> +#include "test_macros.h" + using std::experimental::optional; using std::experimental::in_place_t; using std::experimental::in_place; @@ -40,6 +41,7 @@ int main() const optional<X> opt(in_place); assert(opt.value().test() == 3); } +#ifndef TEST_HAS_NO_EXCEPTIONS { const optional<X> opt; try @@ -51,4 +53,5 @@ int main() { } } +#endif } diff --git a/test/std/experimental/optional/optional.object/optional.object.swap/swap.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.swap/swap.pass.cpp index 620dda19e3ff..f2d373c299bf 100644 --- a/test/std/experimental/optional/optional.object/optional.object.swap/swap.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.swap/swap.pass.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11 -// XFAIL: libcpp-no-exceptions // <optional> // void swap(optional&) @@ -19,6 +18,8 @@ #include <type_traits> #include <cassert> +#include "test_macros.h" + using std::experimental::optional; class X @@ -56,11 +57,15 @@ class Z int i_; public: Z(int i) : i_(i) {} - Z(Z&&) {throw 7;} + Z(Z&&) {TEST_THROW(7);} friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_;} - friend void swap(Z& x, Z& y) {throw 6;} + friend void swap(Z&, Z&) {TEST_THROW(6);} +}; + +struct ConstSwappable { }; +void swap(ConstSwappable const&, ConstSwappable const&) {} int main() { @@ -113,6 +118,11 @@ int main() assert(*opt2 == 1); } { + optional<const ConstSwappable> opt; + optional<const ConstSwappable> opt2; + opt.swap(opt2); + } + { optional<X> opt1; optional<X> opt2; static_assert(noexcept(opt1.swap(opt2)) == true, ""); @@ -222,6 +232,7 @@ int main() assert(static_cast<bool>(opt2) == true); assert(*opt2 == 1); } +#ifndef TEST_HAS_NO_EXCEPTIONS { optional<Z> opt1; optional<Z> opt2; @@ -298,4 +309,5 @@ int main() assert(static_cast<bool>(opt2) == true); assert(*opt2 == 2); } +#endif } |
