diff options
| author | Louis Dionne <ldionne@apple.com> | 2018-11-26 16:14:56 +0000 |
|---|---|---|
| committer | Louis Dionne <ldionne@apple.com> | 2018-11-26 16:14:56 +0000 |
| commit | 20883fc20fa3d04c3f524c653f532fbd50e9f4ee (patch) | |
| tree | a00685c3ef2ce91183ddcc710f3b258f3e0230f6 /libcxx/test/std | |
| parent | 422c828dfce022a87fe28473743c0111f582a0ee (diff) | |
| download | bcm5719-llvm-20883fc20fa3d04c3f524c653f532fbd50e9f4ee.tar.gz bcm5719-llvm-20883fc20fa3d04c3f524c653f532fbd50e9f4ee.zip | |
[libcxx] Use a type that is always an aggregate in variant's tests
Summary:
In PR39232, we noticed that some variant tests started failing in C++2a mode
with recent Clangs, because the rules for literal types changed in C++2a. As
a result, a temporary fix was checked in (enabling the test only in C++17).
This commit is what I believe should be the long term fix: I removed the
tests that checked constexpr default-constructibility with a weird type
from the tests for index() and valueless_by_exception(), and instead I
added tests for those using an obviously literal type in the test for the
default constructor.
Reviewers: EricWF, mclow.lists
Subscribers: christof, jkorous, dexonsmith, arphaman, libcxx-commits, rsmith
Differential Revision: https://reviews.llvm.org/D54767
llvm-svn: 347568
Diffstat (limited to 'libcxx/test/std')
3 files changed, 28 insertions, 25 deletions
diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/default.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/default.pass.cpp index 26221e8a1f4..e4278f0e0ab 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/default.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/default.pass.cpp @@ -32,7 +32,7 @@ #include "variant_test_helpers.hpp" struct NonDefaultConstructible { - NonDefaultConstructible(int) {} + constexpr NonDefaultConstructible(int) {} }; struct NotNoexcept { @@ -99,6 +99,11 @@ void test_default_ctor_basic() { assert(std::get<0>(v) == 0); } { + std::variant<int, NonDefaultConstructible> v; + assert(v.index() == 0); + assert(std::get<0>(v) == 0); + } + { using V = std::variant<int, long>; constexpr V v; static_assert(v.index() == 0, ""); @@ -110,6 +115,12 @@ void test_default_ctor_basic() { static_assert(v.index() == 0, ""); static_assert(std::get<0>(v) == 0, ""); } + { + using V = std::variant<int, NonDefaultConstructible>; + constexpr V v; + static_assert(v.index() == 0, ""); + static_assert(std::get<0>(v) == 0, ""); + } } int main() { 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 7ab828eb0bf..6d78de3a48b 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,14 +10,6 @@ // UNSUPPORTED: c++98, c++03, c++11, c++14 -// The following compilers don't consider a type an aggregate type (and -// consequently not a literal type) if it has a base class at all. -// In C++17, an aggregate type is allowed to have a base class if it's not -// virtual, private, nor protected (e.g. ConstexprTestTypes:::NoCtors). -// XFAIL: gcc-5, gcc-6 -// XFAIL: clang-3.5, clang-3.6, clang-3.7, clang-3.8 -// XFAIL: apple-clang-6, apple-clang-7, apple-clang-8.0 - // <variant> // template <class ...Types> class variant; @@ -33,14 +25,18 @@ #include "test_macros.h" #include "variant_test_helpers.hpp" + int main() { -#if TEST_STD_VER == 17 - { // This test does not pass on C++20 or later; see https://bugs.llvm.org/show_bug.cgi?id=39232 - using V = std::variant<int, ConstexprTestTypes::NoCtors>; + { + using V = std::variant<int, long>; constexpr V v; static_assert(v.index() == 0, ""); } -#endif + { + using V = std::variant<int, long>; + V v; + assert(v.index() == 0); + } { using V = std::variant<int, long>; constexpr V v(std::in_place_index<1>); 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 be021917d6d..9ccdc222199 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,14 +10,6 @@ // UNSUPPORTED: c++98, c++03, c++11, c++14 -// The following compilers don't consider a type an aggregate type (and -// consequently not a literal type) if it has a base class at all. -// In C++17, an aggregate type is allowed to have a base class if it's not -// virtual, private, nor protected (e.g. ConstexprTestTypes:::NoCtors). -// XFAIL: gcc-5, gcc-6 -// XFAIL: clang-3.5, clang-3.6, clang-3.7, clang-3.8 -// XFAIL: apple-clang-6, apple-clang-7, apple-clang-8.0 - // <variant> // template <class ...Types> class variant; @@ -33,14 +25,18 @@ #include "test_macros.h" #include "variant_test_helpers.hpp" + int main() { -#if TEST_STD_VER == 17 - { // This test does not pass on C++20 or later; see https://bugs.llvm.org/show_bug.cgi?id=39232 - using V = std::variant<int, ConstexprTestTypes::NoCtors>; + { + using V = std::variant<int, long>; constexpr V v; static_assert(!v.valueless_by_exception(), ""); } -#endif + { + using V = std::variant<int, long>; + V v; + assert(!v.valueless_by_exception()); + } { using V = std::variant<int, long, std::string>; const V v("abc"); |

