From: Eric Fiselier Date: Sat, 3 Dec 2016 00:13:33 +0000 (+0000) Subject: Work around Clang 3.8 bugs X-Git-Tag: llvmorg-4.0.0-rc1~3107 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d7a50d1d6b097d5fbf64d7aaa4d76adede1a5106;p=platform%2Fupstream%2Fllvm.git Work around Clang 3.8 bugs llvm-svn: 288556 --- diff --git a/libcxx/test/libcxx/utilities/variant/variant.variant/variant.assign/copy.pass.cpp b/libcxx/test/libcxx/utilities/variant/variant.variant/variant.assign/copy.pass.cpp index c0084e0b..3295e5c 100644 --- a/libcxx/test/libcxx/utilities/variant/variant.variant/variant.assign/copy.pass.cpp +++ b/libcxx/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 + // // template class variant; @@ -174,8 +177,32 @@ void test_copy_assignment_different_index() { } } +template +constexpr bool test_constexpr_assign_extension_imp( + std::variant&& v, ValueType&& new_value) +{ + const std::variant cp( + std::forward(new_value)); + v = cp; + return v.index() == NewIdx && + std::get(v) == std::get(cp); +} + +void test_constexpr_copy_assignment_extension() { +#ifdef _LIBCPP_VERSION + using V = std::variant; + static_assert(std::is_trivially_copyable::value, ""); + static_assert(std::is_trivially_copy_assignable::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/libcxx/test/libcxx/utilities/variant/variant.variant/variant.assign/move.pass.cpp b/libcxx/test/libcxx/utilities/variant/variant.variant/variant.assign/move.pass.cpp index 3c8436d..44a9f3b 100644 --- a/libcxx/test/libcxx/utilities/variant/variant.variant/variant.assign/move.pass.cpp +++ b/libcxx/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 + // // template class variant; @@ -160,8 +163,34 @@ void test_move_assignment_different_index() { } } + +template +constexpr bool test_constexpr_assign_extension_imp( + std::variant&& v, ValueType&& new_value) +{ + std::variant v2( + std::forward(new_value)); + const auto cp = v2; + v = std::move(v2); + return v.index() == NewIdx && + std::get(v) == std::get(cp); +} + +void test_constexpr_move_assignment_extension() { +#ifdef _LIBCPP_VERSION + using V = std::variant; + static_assert(std::is_trivially_copyable::value, ""); + static_assert(std::is_trivially_move_assignable::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(); } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/copy.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/copy.pass.cpp index 0e1a0cd..d92f16f 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/copy.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/copy.pass.cpp @@ -385,28 +385,6 @@ void test_copy_assignment_different_index() { #endif } -template -constexpr bool test_constexpr_assign_extension_imp( - std::variant&& v, ValueType&& new_value) -{ - const std::variant cp( - std::forward(new_value)); - v = cp; - return v.index() == NewIdx && - std::get(v) == std::get(cp); -} - -void test_constexpr_copy_assignment_extension() { -#ifdef _LIBCPP_VERSION - using V = std::variant; - static_assert(std::is_trivially_copyable::value, ""); - static_assert(std::is_trivially_copy_assignable::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_empty_empty(); @@ -416,5 +394,4 @@ int main() { test_copy_assignment_different_index(); test_copy_assignment_sfinae(); test_copy_assignment_not_noexcept(); - test_constexpr_copy_assignment_extension(); } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/move.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/move.pass.cpp index f3dc815..232d77c 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/move.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/move.pass.cpp @@ -308,29 +308,6 @@ void test_move_assignment_different_index() { #endif } -template -constexpr bool test_constexpr_assign_extension_imp( - std::variant&& v, ValueType&& new_value) -{ - std::variant v2( - std::forward(new_value)); - const auto cp = v2; - v = std::move(v2); - return v.index() == NewIdx && - std::get(v) == std::get(cp); -} - -void test_constexpr_move_assignment_extension() { -#ifdef _LIBCPP_VERSION - using V = std::variant; - static_assert(std::is_trivially_copyable::value, ""); - static_assert(std::is_trivially_move_assignable::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_empty_empty(); test_move_assignment_non_empty_empty(); @@ -339,5 +316,4 @@ int main() { test_move_assignment_different_index(); test_move_assignment_sfinae(); test_move_assignment_noexcept(); - test_constexpr_move_assignment_extension(); } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.status/index.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.status/index.pass.cpp index fab1850..de9dde7 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.status/index.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.status/index.pass.cpp @@ -10,6 +10,9 @@ // UNSUPPORTED: c++98, c++03, c++11, c++14 +// Clang 3.8 doesn't allow constexpr variables of non-literal type +// XFAIL: clang-3.8 + // // template class variant; diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.status/valueless_by_exception.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.status/valueless_by_exception.pass.cpp index c0e7030..88b128b 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.status/valueless_by_exception.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.status/valueless_by_exception.pass.cpp @@ -10,6 +10,9 @@ // UNSUPPORTED: c++98, c++03, c++11, c++14 +// Clang 3.8 doesn't allow constexpr variables of non-literal type +// XFAIL: clang-3.8 + // // template class variant;