diff options
author | Eric Fiselier <eric@efcs.ca> | 2016-12-03 00:13:33 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2016-12-03 00:13:33 +0000 |
commit | ac5c826faf2fb996b6adcb6c829f404ca1188875 (patch) | |
tree | 859b1a811c6594ce2032d31b8d887625b9cbcb6a /test/libcxx/utilities | |
parent | a2ff7987451950c70dea4786272802fbbd8a3751 (diff) | |
download | external_libcxx-ac5c826faf2fb996b6adcb6c829f404ca1188875.tar.gz external_libcxx-ac5c826faf2fb996b6adcb6c829f404ca1188875.tar.bz2 external_libcxx-ac5c826faf2fb996b6adcb6c829f404ca1188875.zip |
Work around Clang 3.8 bugs
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@288556 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/libcxx/utilities')
-rw-r--r-- | test/libcxx/utilities/variant/variant.variant/variant.assign/copy.pass.cpp | 27 | ||||
-rw-r--r-- | test/libcxx/utilities/variant/variant.variant/variant.assign/move.pass.cpp | 29 |
2 files changed, 56 insertions, 0 deletions
diff --git a/test/libcxx/utilities/variant/variant.variant/variant.assign/copy.pass.cpp b/test/libcxx/utilities/variant/variant.variant/variant.assign/copy.pass.cpp index c0084e0b5..3295e5cf5 100644 --- a/test/libcxx/utilities/variant/variant.variant/variant.assign/copy.pass.cpp +++ b/test/libcxx/utilities/variant/variant.variant/variant.assign/copy.pass.cpp @@ -10,6 +10,9 @@ // UNSUPPORTED: c++98, c++03, c++11, c++14 +// Clang 3.8 doesn't generate constexpr special members correctly. +// XFAIL: clang-3.8 + // <variant> // template <class ...Types> class variant; @@ -174,8 +177,32 @@ void test_copy_assignment_different_index() { } } +template <size_t NewIdx, class ValueType> +constexpr bool test_constexpr_assign_extension_imp( + std::variant<long, void*, int>&& v, ValueType&& new_value) +{ + const std::variant<long, void*, int> cp( + std::forward<ValueType>(new_value)); + v = cp; + return v.index() == NewIdx && + std::get<NewIdx>(v) == std::get<NewIdx>(cp); +} + +void test_constexpr_copy_assignment_extension() { +#ifdef _LIBCPP_VERSION + using V = std::variant<long, void*, int>; + static_assert(std::is_trivially_copyable<V>::value, ""); + static_assert(std::is_trivially_copy_assignable<V>::value, ""); + static_assert(test_constexpr_assign_extension_imp<0>(V(42l), 101l), ""); + static_assert(test_constexpr_assign_extension_imp<0>(V(nullptr), 101l), ""); + static_assert(test_constexpr_assign_extension_imp<1>(V(42l), nullptr), ""); + static_assert(test_constexpr_assign_extension_imp<2>(V(42l), 101), ""); +#endif +} + int main() { test_copy_assignment_same_index(); test_copy_assignment_different_index(); test_copy_assignment_sfinae(); + test_constexpr_copy_assignment_extension(); } diff --git a/test/libcxx/utilities/variant/variant.variant/variant.assign/move.pass.cpp b/test/libcxx/utilities/variant/variant.variant/variant.assign/move.pass.cpp index 3c8436d5a..44a9f3b10 100644 --- a/test/libcxx/utilities/variant/variant.variant/variant.assign/move.pass.cpp +++ b/test/libcxx/utilities/variant/variant.variant/variant.assign/move.pass.cpp @@ -10,6 +10,9 @@ // UNSUPPORTED: c++98, c++03, c++11, c++14 +// Clang 3.8 doesn't generate constexpr special members correctly. +// XFAIL: clang-3.8 + // <variant> // template <class ...Types> class variant; @@ -160,8 +163,34 @@ void test_move_assignment_different_index() { } } + +template <size_t NewIdx, class ValueType> +constexpr bool test_constexpr_assign_extension_imp( + std::variant<long, void*, int>&& v, ValueType&& new_value) +{ + std::variant<long, void*, int> v2( + std::forward<ValueType>(new_value)); + const auto cp = v2; + v = std::move(v2); + return v.index() == NewIdx && + std::get<NewIdx>(v) == std::get<NewIdx>(cp); +} + +void test_constexpr_move_assignment_extension() { +#ifdef _LIBCPP_VERSION + using V = std::variant<long, void*, int>; + static_assert(std::is_trivially_copyable<V>::value, ""); + static_assert(std::is_trivially_move_assignable<V>::value, ""); + static_assert(test_constexpr_assign_extension_imp<0>(V(42l), 101l), ""); + static_assert(test_constexpr_assign_extension_imp<0>(V(nullptr), 101l), ""); + static_assert(test_constexpr_assign_extension_imp<1>(V(42l), nullptr), ""); + static_assert(test_constexpr_assign_extension_imp<2>(V(42l), 101), ""); +#endif +} + int main() { test_move_assignment_same_index(); test_move_assignment_different_index(); test_move_assignment_sfinae(); + test_constexpr_move_assignment_extension(); } |