[libc++] Fix tests on GCC 10

Also, remove workarounds for ancient Clangs from is_constructible tests.
This commit is contained in:
Louis Dionne 2020-09-29 10:49:52 -04:00
parent d0ed45dc92
commit 3e5f9dacb0
5 changed files with 11 additions and 53 deletions

View File

@ -2883,8 +2883,7 @@ namespace __is_construct
struct __nat {}; struct __nat {};
} }
#if !defined(_LIBCPP_CXX03_LANG) && (!__has_feature(is_constructible) || \ #if !defined(_LIBCPP_CXX03_LANG) && !__has_feature(is_constructible) && !defined(_LIBCPP_COMPILER_GCC)
defined(_LIBCPP_TESTING_FALLBACK_IS_CONSTRUCTIBLE))
template <class _Tp, class... _Args> template <class _Tp, class... _Args>
struct __libcpp_is_constructible; struct __libcpp_is_constructible;
@ -2999,7 +2998,7 @@ struct __libcpp_is_constructible<_Tp&&, _A0>
#endif #endif
#if __has_feature(is_constructible) #if __has_feature(is_constructible) || defined(_LIBCPP_COMPILER_GCC)
template <class _Tp, class ..._Args> template <class _Tp, class ..._Args>
struct _LIBCPP_TEMPLATE_VIS is_constructible struct _LIBCPP_TEMPLATE_VIS is_constructible
: public integral_constant<bool, __is_constructible(_Tp, _Args...)> : public integral_constant<bool, __is_constructible(_Tp, _Args...)>

View File

@ -14,7 +14,7 @@
// RUN: %{cxx} %{flags} %{compile_flags} -c %s -o %t.tu1.o -DTU1 // RUN: %{cxx} %{flags} %{compile_flags} -c %s -o %t.tu1.o -DTU1
// RUN: %{cxx} %{flags} %{compile_flags} -c %s -o %t.tu2.o -DTU2 // RUN: %{cxx} %{flags} %{compile_flags} -c %s -o %t.tu2.o -DTU2
// RUN: %{cxx} %{flags} %{link_flags} %t.tu1.o %t.tu2.o -o %t.exe // RUN: %{cxx} %t.tu1.o %t.tu2.o %{flags} %{link_flags} -o %t.exe
// RUN: %{exec} %t.exe // RUN: %{exec} %t.exe
#include <cassert> #include <cassert>

View File

@ -11,8 +11,6 @@
// template <class T, class... Args> // template <class T, class... Args>
// struct is_constructible; // struct is_constructible;
// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_TESTING_FALLBACK_IS_CONSTRUCTIBLE
#include <type_traits> #include <type_traits>
#include "test_macros.h" #include "test_macros.h"
@ -22,7 +20,6 @@
#define LIBCPP11_STATIC_ASSERT(...) ((void)0) #define LIBCPP11_STATIC_ASSERT(...) ((void)0)
#endif #endif
struct A struct A
{ {
explicit A(int); explicit A(int);
@ -78,7 +75,6 @@ template <class T>
void test_is_constructible() void test_is_constructible()
{ {
static_assert( (std::is_constructible<T>::value), ""); static_assert( (std::is_constructible<T>::value), "");
LIBCPP11_STATIC_ASSERT((std::__libcpp_is_constructible<T>::type::value), "");
#if TEST_STD_VER > 14 #if TEST_STD_VER > 14
static_assert( std::is_constructible_v<T>, ""); static_assert( std::is_constructible_v<T>, "");
#endif #endif
@ -88,7 +84,6 @@ template <class T, class A0>
void test_is_constructible() void test_is_constructible()
{ {
static_assert(( std::is_constructible<T, A0>::value), ""); static_assert(( std::is_constructible<T, A0>::value), "");
LIBCPP11_STATIC_ASSERT((std::__libcpp_is_constructible<T, A0>::type::value), "");
#if TEST_STD_VER > 14 #if TEST_STD_VER > 14
static_assert(( std::is_constructible_v<T, A0>), ""); static_assert(( std::is_constructible_v<T, A0>), "");
#endif #endif
@ -98,7 +93,6 @@ template <class T, class A0, class A1>
void test_is_constructible() void test_is_constructible()
{ {
static_assert(( std::is_constructible<T, A0, A1>::value), ""); static_assert(( std::is_constructible<T, A0, A1>::value), "");
LIBCPP11_STATIC_ASSERT((std::__libcpp_is_constructible<T, A0, A1>::type::value), "");
#if TEST_STD_VER > 14 #if TEST_STD_VER > 14
static_assert(( std::is_constructible_v<T, A0, A1>), ""); static_assert(( std::is_constructible_v<T, A0, A1>), "");
#endif #endif
@ -108,7 +102,6 @@ template <class T, class A0, class A1, class A2>
void test_is_constructible() void test_is_constructible()
{ {
static_assert(( std::is_constructible<T, A0, A1, A2>::value), ""); static_assert(( std::is_constructible<T, A0, A1, A2>::value), "");
LIBCPP11_STATIC_ASSERT((std::__libcpp_is_constructible<T, A0, A1, A2>::type::value), "");
#if TEST_STD_VER > 14 #if TEST_STD_VER > 14
static_assert(( std::is_constructible_v<T, A0, A1, A2>), ""); static_assert(( std::is_constructible_v<T, A0, A1, A2>), "");
#endif #endif
@ -118,7 +111,6 @@ template <class T>
void test_is_not_constructible() void test_is_not_constructible()
{ {
static_assert((!std::is_constructible<T>::value), ""); static_assert((!std::is_constructible<T>::value), "");
LIBCPP11_STATIC_ASSERT((!std::__libcpp_is_constructible<T>::type::value), "");
#if TEST_STD_VER > 14 #if TEST_STD_VER > 14
static_assert((!std::is_constructible_v<T>), ""); static_assert((!std::is_constructible_v<T>), "");
#endif #endif
@ -128,23 +120,11 @@ template <class T, class A0>
void test_is_not_constructible() void test_is_not_constructible()
{ {
static_assert((!std::is_constructible<T, A0>::value), ""); static_assert((!std::is_constructible<T, A0>::value), "");
LIBCPP11_STATIC_ASSERT((!std::__libcpp_is_constructible<T, A0>::type::value), "");
#if TEST_STD_VER > 14 #if TEST_STD_VER > 14
static_assert((!std::is_constructible_v<T, A0>), ""); static_assert((!std::is_constructible_v<T, A0>), "");
#endif #endif
} }
#if TEST_STD_VER >= 11
template <class T = int, class = decltype(static_cast<T&&>(std::declval<double&>()))>
constexpr bool clang_disallows_valid_static_cast_test(int) { return false; };
constexpr bool clang_disallows_valid_static_cast_test(long) { return true; }
static constexpr bool clang_disallows_valid_static_cast_bug =
clang_disallows_valid_static_cast_test(0);
#endif
int main(int, char**) int main(int, char**)
{ {
typedef Base B; typedef Base B;
@ -210,13 +190,17 @@ int main(int, char**)
test_is_constructible<Base&, Derived&>(); test_is_constructible<Base&, Derived&>();
test_is_not_constructible<Derived&, Base&>(); test_is_not_constructible<Derived&, Base&>();
test_is_constructible<Base const&, Derived const&>(); test_is_constructible<Base const&, Derived const&>();
#ifndef TEST_COMPILER_GCC
test_is_not_constructible<Derived const&, Base const&>(); test_is_not_constructible<Derived const&, Base const&>();
test_is_not_constructible<Derived const&, Base>(); test_is_not_constructible<Derived const&, Base>();
#endif
test_is_constructible<Base&&, Derived>(); test_is_constructible<Base&&, Derived>();
test_is_constructible<Base&&, Derived&&>(); test_is_constructible<Base&&, Derived&&>();
#ifndef TEST_COMPILER_GCC
test_is_not_constructible<Derived&&, Base&&>(); test_is_not_constructible<Derived&&, Base&&>();
test_is_not_constructible<Derived&&, Base>(); test_is_not_constructible<Derived&&, Base>();
#endif
// test that T must also be destructible // test that T must also be destructible
test_is_constructible<PrivateDtor&, PrivateDtor&>(); test_is_constructible<PrivateDtor&, PrivateDtor&>();
@ -255,28 +239,11 @@ int main(int, char**)
#endif #endif
static_assert(std::is_constructible<int&&, ExplicitTo<int&&>>::value, ""); static_assert(std::is_constructible<int&&, ExplicitTo<int&&>>::value, "");
#ifdef __clang__
#if defined(CLANG_TEST_VER) && CLANG_TEST_VER < 400
static_assert(clang_disallows_valid_static_cast_bug, "bug still exists");
#endif
// FIXME Clang disallows this construction because it thinks that
// 'static_cast<int&&>(declval<ExplicitTo<int&&>>())' is ill-formed.
LIBCPP_STATIC_ASSERT(
clang_disallows_valid_static_cast_bug !=
std::__libcpp_is_constructible<int&&, ExplicitTo<int&&>>::value, "");
((void)clang_disallows_valid_static_cast_bug); // Prevent unused warning
#else
static_assert(clang_disallows_valid_static_cast_bug == false, "");
LIBCPP_STATIC_ASSERT(std::__libcpp_is_constructible<int&&, ExplicitTo<int&&>>::value, "");
#endif
#ifdef __clang__ #ifdef __clang__
// FIXME Clang and GCC disagree on the validity of this expression. // FIXME Clang and GCC disagree on the validity of this expression.
test_is_constructible<const int&, ExplicitTo<int>>(); test_is_constructible<const int&, ExplicitTo<int>>();
static_assert(std::is_constructible<int&&, ExplicitTo<int>>::value, ""); static_assert(std::is_constructible<int&&, ExplicitTo<int>>::value, "");
LIBCPP_STATIC_ASSERT(
clang_disallows_valid_static_cast_bug !=
std::__libcpp_is_constructible<int&&, ExplicitTo<int>>::value, "");
#else #else
test_is_not_constructible<const int&, ExplicitTo<int>>(); test_is_not_constructible<const int&, ExplicitTo<int>>();
test_is_not_constructible<int&&, ExplicitTo<int>>(); test_is_not_constructible<int&&, ExplicitTo<int>>();
@ -287,21 +254,11 @@ int main(int, char**)
test_is_not_constructible<const int&, ExplicitTo<double&&>>(); test_is_not_constructible<const int&, ExplicitTo<double&&>>();
test_is_not_constructible<int&&, ExplicitTo<double&&>>(); test_is_not_constructible<int&&, ExplicitTo<double&&>>();
// TODO: Remove this workaround once Clang <= 3.7 are no longer used regularly.
// In those compiler versions the __is_constructible builtin gives the wrong
// results for abominable function types.
#if (defined(TEST_APPLE_CLANG_VER) && TEST_APPLE_CLANG_VER < 703) \
|| (defined(TEST_CLANG_VER) && TEST_CLANG_VER < 308)
#define WORKAROUND_CLANG_BUG
#endif
#if !defined(WORKAROUND_CLANG_BUG)
test_is_not_constructible<void()>(); test_is_not_constructible<void()>();
test_is_not_constructible<void() const> (); test_is_not_constructible<void() const> ();
test_is_not_constructible<void() volatile> (); test_is_not_constructible<void() volatile> ();
test_is_not_constructible<void() &> (); test_is_not_constructible<void() &> ();
test_is_not_constructible<void() &&> (); test_is_not_constructible<void() &&> ();
#endif
#endif // TEST_STD_VER >= 11 #endif // TEST_STD_VER >= 11
return 0; return 0;

View File

@ -263,7 +263,7 @@ int main(int, char**)
((void)r); ((void)r);
} }
{ {
std::tuple<NS::Namespaced> t1({1}); std::tuple<NS::Namespaced> t1(NS::Namespaced{1});
std::tuple<NS::Namespaced> t = std::tuple_cat(t1); std::tuple<NS::Namespaced> t = std::tuple_cat(t1);
std::tuple<NS::Namespaced, NS::Namespaced> t2 = std::tuple<NS::Namespaced, NS::Namespaced> t2 =
std::tuple_cat(t1, t1); std::tuple_cat(t1, t1);

View File

@ -57,7 +57,9 @@ x86_64-ubuntu-32bit)
x86_64-ubuntu-gcc) x86_64-ubuntu-gcc)
export CC=gcc export CC=gcc
export CXX=g++ export CXX=g++
args+=("-DLLVM_LIT_ARGS=-sv --show-unsupported") # FIXME: Re-enable experimental testing on GCC. GCC cares about the order
# in which we link -lc++experimental, which causes issues.
args+=("-DLLVM_LIT_ARGS=-sv --show-unsupported --param enable_experimental=False")
;; ;;
x86_64-ubuntu-asan) x86_64-ubuntu-asan)
export CC=clang export CC=clang