[libc++] Convert test-suite workarounds for some C11 features to XFAILs

Instead of trying to sniff out what features are supported by the
library being tested, the way we normally handle these things is with
Lit annotations. This should not be treated differently.

Differential Revision: https://reviews.llvm.org/D108209
This commit is contained in:
Louis Dionne 2021-08-17 11:21:09 -04:00
parent df1033d8db
commit ed7c81d172
11 changed files with 43 additions and 190 deletions

View File

@ -1,19 +0,0 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++03, c++11, c++14
// Make sure TEST_HAS_ALIGNED_ALLOC (defined by the test suite) and
// _LIBCPP_HAS_ALIGNED_ALLOC (defined by libc++) stay in sync.
#include <__config>
#include "test_macros.h"
#if defined(TEST_HAS_ALIGNED_ALLOC) != defined(_LIBCPP_HAS_ALIGNED_ALLOC)
# error "TEST_HAS_ALIGNED_ALLOC and _LIBCPP_HAS_ALIGNED_ALLOC are out of sync"
#endif

View File

@ -1,19 +0,0 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++03, c++11, c++14
// Make sure TEST_HAS_QUICK_EXIT (defined by the test suite) and
// _LIBCPP_HAS_QUICK_EXIT (defined by libc++) stay in sync.
#include <__config>
#include "test_macros.h"
#if defined(TEST_HAS_QUICK_EXIT) != defined(_LIBCPP_HAS_QUICK_EXIT)
# error "TEST_HAS_QUICK_EXIT and _LIBCPP_HAS_QUICK_EXIT are out of sync"
#endif

View File

@ -1,19 +0,0 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++03, c++11, c++14
// Make sure TEST_HAS_TIMESPEC_GET (defined by the test suite) and
// _LIBCPP_HAS_TIMESPEC_GET (defined by libc++) stay in sync.
#include <__config>
#include "test_macros.h"
#if defined(TEST_HAS_TIMESPEC_GET) != defined(_LIBCPP_HAS_TIMESPEC_GET)
# error "TEST_HAS_TIMESPEC_GET and _LIBCPP_HAS_TIMESPEC_GET are out of sync"
#endif

View File

@ -8,6 +8,13 @@
// test <stdlib.h>
// ::aligned_alloc is provided by the C library, but it's marked as unavailable
// until macOS 10.15
// XFAIL: use_system_cxx_lib && target={{.+}}-apple-macosx10.{{9|10|11|12|13|14}}
// ::aligned_alloc is not implemented on Windows
// XFAIL: target={{.+}}-pc-windows-{{.+}}
#include <stdlib.h>
#include <type_traits>
#include <cassert>
@ -132,9 +139,8 @@ int main(int, char**)
static_assert((std::is_same<decltype(rand()), int>::value), "");
static_assert((std::is_same<decltype(srand(0)), void>::value), "");
#if TEST_STD_VER > 14 && defined(TEST_HAS_ALIGNED_ALLOC)
static_assert((std::is_same<decltype(aligned_alloc(1, 0)), void*>::value),
"");
#if TEST_STD_VER > 14
static_assert((std::is_same<decltype(aligned_alloc(1, 0)), void*>::value), "");
#endif
void* pv = 0;

View File

@ -8,6 +8,13 @@
// test <cstdlib>
// ::aligned_alloc is provided by the C library, but it's marked as unavailable
// until macOS 10.15
// XFAIL: use_system_cxx_lib && target={{.+}}-apple-macosx10.{{9|10|11|12|13|14}}
// ::aligned_alloc is not implemented on Windows
// XFAIL: target={{.+}}-pc-windows-{{.+}}
#include <cstdlib>
#include <type_traits>
#include <cassert>
@ -119,9 +126,8 @@ int main(int, char**)
static_assert((std::is_same<decltype(std::rand()), int>::value), "");
static_assert((std::is_same<decltype(std::srand(0)), void>::value), "");
#if TEST_STD_VER > 14 && defined(TEST_HAS_ALIGNED_ALLOC)
static_assert(
(std::is_same<decltype(std::aligned_alloc(1, 0)), void*>::value), "");
#if TEST_STD_VER > 14
static_assert((std::is_same<decltype(std::aligned_alloc(1, 0)), void*>::value), "");
#endif
void* pv = 0;

View File

@ -8,6 +8,10 @@
// test <ctime>
// ::timespec_get is provided by the C library, but it's marked as
// unavailable until macOS 10.15
// XFAIL: use_system_cxx_lib && target={{.+}}-apple-macosx10.{{9|10|11|12|13|14}}
#include <ctime>
#include <type_traits>
#include "test_macros.h"
@ -20,7 +24,7 @@
#error CLOCKS_PER_SEC not defined
#endif
#if TEST_STD_VER > 14 && defined(TEST_HAS_TIMESPEC_GET)
#if TEST_STD_VER > 14
#ifndef TIME_UTC
#error TIME_UTC not defined
#endif
@ -32,7 +36,7 @@ int main(int, char**)
std::size_t s = 0;
std::time_t t = 0;
std::tm tm = {};
#if TEST_STD_VER > 14 && defined(TEST_HAS_TIMESPEC_GET)
#if TEST_STD_VER > 14
std::timespec tmspec = {};
((void)tmspec); // Prevent unused warning
#endif
@ -44,7 +48,7 @@ int main(int, char**)
static_assert((std::is_same<decltype(std::difftime(t,t)), double>::value), "");
static_assert((std::is_same<decltype(std::mktime(&tm)), std::time_t>::value), "");
static_assert((std::is_same<decltype(std::time(&t)), std::time_t>::value), "");
#if TEST_STD_VER > 14 && defined(TEST_HAS_TIMESPEC_GET)
#if TEST_STD_VER > 14
static_assert((std::is_same<decltype(std::timespec_get(&tmspec, 0)), int>::value), "");
#endif
#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS

View File

@ -1,27 +0,0 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++03
// test that referencing at_quick_exit when TEST_HAS_QUICK_EXIT is not defined
// results in a compile error.
#include <cstdlib>
#include "test_macros.h"
void f() { }
int main(int, char**) {
#if !defined(TEST_HAS_QUICK_EXIT)
std::at_quick_exit(f);
#else
# error
#endif
return 0;
}

View File

@ -1,25 +0,0 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++03
// test that referencing quick_exit when TEST_HAS_QUICK_EXIT is not defined
// results in a compile error.
#include <cstdlib>
#include "test_macros.h"
int main(int, char**) {
#if !defined(TEST_HAS_QUICK_EXIT)
std::quick_exit(0);
#else
# error
#endif
return 0;
}

View File

@ -5,22 +5,23 @@
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++03
// ::quick_exit and ::at_quick_exit are not implemented on macOS.
// TODO: We should never be using `darwin` as the triple, but LLVM's config.guess script
// guesses the host triple to be darwin instead of macosx when on macOS.
// XFAIL: target={{.+}}-apple-macosx{{.+}}
// XFAIL: target={{.+}}-apple-darwin{{.+}}
// test quick_exit and at_quick_exit
#include <cstdlib>
#include "test_macros.h"
void f() {}
int main(int, char**)
{
#ifdef TEST_HAS_QUICK_EXIT
int main(int, char**) {
std::at_quick_exit(f);
std::quick_exit(0);
#endif
return 0;
return 0;
}

View File

@ -6,6 +6,12 @@
//
//===----------------------------------------------------------------------===//
// test <ctime>
// ::timespec_get is provided by the C library, but it's marked as
// unavailable until macOS 10.15
// XFAIL: use_system_cxx_lib && target={{.+}}-apple-macosx10.{{9|10|11|12|13|14}}
#include <ctime>
#include <type_traits>
@ -19,7 +25,7 @@
#error CLOCKS_PER_SEC not defined
#endif
#if TEST_STD_VER > 14 && defined(TEST_HAS_TIMESPEC_GET)
#if TEST_STD_VER > 14
#ifndef TIME_UTC
#error TIME_UTC not defined
#endif
@ -41,7 +47,7 @@ int main(int, char**)
((void)t); // Prevent unused warning
((void)tm); // Prevent unused warning
((void)str); // Prevent unused warning
#if TEST_STD_VER > 14 && defined(TEST_HAS_TIMESPEC_GET)
#if TEST_STD_VER > 14
std::timespec tmspec = {};
((void)tmspec); // Prevent unused warning
#endif
@ -50,7 +56,7 @@ int main(int, char**)
static_assert((std::is_same<decltype(std::difftime(t,t)), double>::value), "");
static_assert((std::is_same<decltype(std::mktime(&tm)), std::time_t>::value), "");
static_assert((std::is_same<decltype(std::time(&t)), std::time_t>::value), "");
#if TEST_STD_VER > 14 && defined(TEST_HAS_TIMESPEC_GET)
#if TEST_STD_VER > 14
static_assert((std::is_same<decltype(std::timespec_get(&tmspec, 0)), int>::value), "");
#endif
#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS

View File

@ -163,67 +163,6 @@
# define TEST_CONSTEXPR_CXX20
#endif
// Sniff out to see if the underlying C library has C11 features
// This is cribbed from __config; but lives here as well because we can't assume libc++
#if (defined(__ISO_C_VISIBLE) && (__ISO_C_VISIBLE >= 2011)) || \
TEST_STD_VER >= 11
# if defined(__FreeBSD__)
# if __FreeBSD_version >= 1300064 || \
(__FreeBSD_version >= 1201504 && __FreeBSD_version < 1300000)
# define TEST_HAS_TIMESPEC_GET
# endif
# define TEST_HAS_ALIGNED_ALLOC
# define TEST_HAS_QUICK_EXIT
# elif defined(__BIONIC__)
# if __ANDROID_API__ >= 21
# define TEST_HAS_QUICK_EXIT
# endif
# if __ANDROID_API__ >= 28
# define TEST_HAS_ALIGNED_ALLOC
# endif
# if __ANDROID_API__ >= 29
# define TEST_HAS_TIMESPEC_GET
# endif
# elif defined(__Fuchsia__) || defined(__wasi__) || defined(__NetBSD__)
# define TEST_HAS_QUICK_EXIT
# define TEST_HAS_ALIGNED_ALLOC
# define TEST_HAS_TIMESPEC_GET
# elif defined(__linux__)
// This block preserves the old behavior used by include/__config:
// _LIBCPP_GLIBC_PREREQ would be defined to 0 if __GLIBC_PREREQ was not
// available. The configuration here may be too vague though, as Bionic, uClibc,
// newlib, etc may all support these features but need to be configured.
# if defined(TEST_GLIBC_PREREQ)
# if TEST_GLIBC_PREREQ(2, 15)
# define TEST_HAS_QUICK_EXIT
# endif
# if TEST_GLIBC_PREREQ(2, 17)
# define TEST_HAS_ALIGNED_ALLOC
# define TEST_HAS_TIMESPEC_GET
# endif
# elif defined(_LIBCPP_HAS_MUSL_LIBC)
# define TEST_HAS_QUICK_EXIT
# define TEST_HAS_ALIGNED_ALLOC
# define TEST_HAS_TIMESPEC_GET
# endif
# elif defined(_WIN32)
# if defined(_MSC_VER) && !defined(__MINGW32__)
# define TEST_HAS_QUICK_EXIT
# define TEST_HAS_TIMESPEC_GET
# endif
# elif defined(__APPLE__)
// timespec_get and aligned_alloc were introduced in macOS 10.15 and
// aligned releases
# if ((defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101500) || \
(defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 130000) || \
(defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ >= 130000) || \
(defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ >= 60000))
# define TEST_HAS_ALIGNED_ALLOC
# define TEST_HAS_TIMESPEC_GET
# endif
# endif // __APPLE__
#endif
/* Features that were introduced in C++14 */
#if TEST_STD_VER >= 14
#define TEST_HAS_EXTENDED_CONSTEXPR