forked from OSchip/llvm-project
[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
This commit is contained in:
parent
422c828dfc
commit
20883fc20f
|
@ -32,7 +32,7 @@
|
||||||
#include "variant_test_helpers.hpp"
|
#include "variant_test_helpers.hpp"
|
||||||
|
|
||||||
struct NonDefaultConstructible {
|
struct NonDefaultConstructible {
|
||||||
NonDefaultConstructible(int) {}
|
constexpr NonDefaultConstructible(int) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NotNoexcept {
|
struct NotNoexcept {
|
||||||
|
@ -98,6 +98,11 @@ void test_default_ctor_basic() {
|
||||||
assert(v.index() == 0);
|
assert(v.index() == 0);
|
||||||
assert(std::get<0>(v) == 0);
|
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>;
|
using V = std::variant<int, long>;
|
||||||
constexpr V v;
|
constexpr V v;
|
||||||
|
@ -110,6 +115,12 @@ void test_default_ctor_basic() {
|
||||||
static_assert(v.index() == 0, "");
|
static_assert(v.index() == 0, "");
|
||||||
static_assert(std::get<0>(v) == 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() {
|
int main() {
|
||||||
|
|
|
@ -10,14 +10,6 @@
|
||||||
|
|
||||||
// UNSUPPORTED: c++98, c++03, c++11, c++14
|
// 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>
|
// <variant>
|
||||||
|
|
||||||
// template <class ...Types> class variant;
|
// template <class ...Types> class variant;
|
||||||
|
@ -33,14 +25,18 @@
|
||||||
#include "test_macros.h"
|
#include "test_macros.h"
|
||||||
#include "variant_test_helpers.hpp"
|
#include "variant_test_helpers.hpp"
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
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, long>;
|
||||||
using V = std::variant<int, ConstexprTestTypes::NoCtors>;
|
|
||||||
constexpr V v;
|
constexpr V v;
|
||||||
static_assert(v.index() == 0, "");
|
static_assert(v.index() == 0, "");
|
||||||
}
|
}
|
||||||
#endif
|
{
|
||||||
|
using V = std::variant<int, long>;
|
||||||
|
V v;
|
||||||
|
assert(v.index() == 0);
|
||||||
|
}
|
||||||
{
|
{
|
||||||
using V = std::variant<int, long>;
|
using V = std::variant<int, long>;
|
||||||
constexpr V v(std::in_place_index<1>);
|
constexpr V v(std::in_place_index<1>);
|
||||||
|
|
|
@ -10,14 +10,6 @@
|
||||||
|
|
||||||
// UNSUPPORTED: c++98, c++03, c++11, c++14
|
// 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>
|
// <variant>
|
||||||
|
|
||||||
// template <class ...Types> class variant;
|
// template <class ...Types> class variant;
|
||||||
|
@ -33,14 +25,18 @@
|
||||||
#include "test_macros.h"
|
#include "test_macros.h"
|
||||||
#include "variant_test_helpers.hpp"
|
#include "variant_test_helpers.hpp"
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
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, long>;
|
||||||
using V = std::variant<int, ConstexprTestTypes::NoCtors>;
|
|
||||||
constexpr V v;
|
constexpr V v;
|
||||||
static_assert(!v.valueless_by_exception(), "");
|
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>;
|
using V = std::variant<int, long, std::string>;
|
||||||
const V v("abc");
|
const V v("abc");
|
||||||
|
|
Loading…
Reference in New Issue