diff --git a/libcxx/include/__config b/libcxx/include/__config --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -340,9 +340,22 @@ #if __ISO_C_VISIBLE >= 2011 || __cplusplus >= 201103L # if defined(__FreeBSD__) +# define _LIBCPP_HAS_ALIGNED_ALLOC # define _LIBCPP_HAS_QUICK_EXIT # define _LIBCPP_HAS_C11_FEATURES +# elif defined(__BIONIC__) +# define _LIBCPP_HAS_C11_FEATURES +# if __ANDROID_API__ >= 21 +# define _LIBCPP_HAS_QUICK_EXIT +# endif +# if __ANDROID_API__ >= 28 +# define _LIBCPP_HAS_ALIGNED_ALLOC +# endif +# if __ANDROID_API__ >= 29 +# define _LIBCPP_HAS_TIMESPEC_GET +# endif # elif defined(__Fuchsia__) || defined(__wasi__) +# define _LIBCPP_HAS_ALIGNED_ALLOC # define _LIBCPP_HAS_QUICK_EXIT # define _LIBCPP_HAS_TIMESPEC_GET # define _LIBCPP_HAS_C11_FEATURES @@ -352,10 +365,12 @@ # define _LIBCPP_HAS_QUICK_EXIT # endif # if _LIBCPP_GLIBC_PREREQ(2, 17) +# define _LIBCPP_HAS_ALIGNED_ALLOC # define _LIBCPP_HAS_C11_FEATURES # define _LIBCPP_HAS_TIMESPEC_GET # endif # else // defined(_LIBCPP_HAS_MUSL_LIBC) +# define _LIBCPP_HAS_ALIGNED_ALLOC # define _LIBCPP_HAS_QUICK_EXIT # define _LIBCPP_HAS_TIMESPEC_GET # define _LIBCPP_HAS_C11_FEATURES diff --git a/libcxx/include/cstdlib b/libcxx/include/cstdlib --- a/libcxx/include/cstdlib +++ b/libcxx/include/cstdlib @@ -154,7 +154,7 @@ using ::at_quick_exit; using ::quick_exit; #endif -#if _LIBCPP_STD_VER > 14 && defined(_LIBCPP_HAS_C11_FEATURES) +#if _LIBCPP_STD_VER > 14 && defined(_LIBCPP_HAS_ALIGNED_ALLOC) using ::aligned_alloc; #endif diff --git a/libcxx/include/ctime b/libcxx/include/ctime --- a/libcxx/include/ctime +++ b/libcxx/include/ctime @@ -58,7 +58,7 @@ using ::size_t; using ::time_t; using ::tm; -#if _LIBCPP_STD_VER > 14 && defined(_LIBCPP_HAS_C11_FEATURES) +#if _LIBCPP_STD_VER > 14 && defined(_LIBCPP_HAS_TIMESPEC_GET) using ::timespec; #endif using ::clock; diff --git a/libcxx/test/std/depr/depr.c.headers/stdlib_h.pass.cpp b/libcxx/test/std/depr/depr.c.headers/stdlib_h.pass.cpp --- a/libcxx/test/std/depr/depr.c.headers/stdlib_h.pass.cpp +++ b/libcxx/test/std/depr/depr.c.headers/stdlib_h.pass.cpp @@ -132,8 +132,7 @@ static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); -// Microsoft does not implement aligned_alloc in their C library -#if TEST_STD_VER > 14 && defined(TEST_HAS_C11_FEATURES) && !defined(_WIN32) +#if TEST_STD_VER > 14 && defined(TEST_HAS_ALIGNED_ALLOC) static_assert((std::is_same::value), ""); #endif diff --git a/libcxx/test/std/language.support/support.runtime/cstdlib.pass.cpp b/libcxx/test/std/language.support/support.runtime/cstdlib.pass.cpp --- a/libcxx/test/std/language.support/support.runtime/cstdlib.pass.cpp +++ b/libcxx/test/std/language.support/support.runtime/cstdlib.pass.cpp @@ -119,9 +119,8 @@ static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); -// Microsoft does not implement aligned_alloc in their C library -#if TEST_STD_VER > 14 && defined(TEST_HAS_C11_FEATURES) && !defined(_WIN32) - static_assert((std::is_same::value), ""); +#if TEST_STD_VER > 14 && defined(TEST_HAS_ALIGNED_ALLOC) + static_assert((std::is_same::value), ""); #endif static_assert((std::is_same::value), ""); diff --git a/libcxx/test/std/language.support/support.runtime/ctime.pass.cpp b/libcxx/test/std/language.support/support.runtime/ctime.pass.cpp --- a/libcxx/test/std/language.support/support.runtime/ctime.pass.cpp +++ b/libcxx/test/std/language.support/support.runtime/ctime.pass.cpp @@ -20,7 +20,7 @@ #error CLOCKS_PER_SEC not defined #endif -#if TEST_STD_VER > 14 && defined(TEST_HAS_C11_FEATURES) +#if TEST_STD_VER > 14 && defined(TEST_HAS_TIMESPEC_GET) #ifndef TIME_UTC #error TIME_UTC not defined #endif @@ -32,7 +32,7 @@ std::size_t s = 0; std::time_t t = 0; std::tm tm = {}; -#if TEST_STD_VER > 14 && defined(TEST_HAS_C11_FEATURES) +#if TEST_STD_VER > 14 && defined(TEST_HAS_TIMESPEC_GET) std::timespec tmspec = {}; ((void)tmspec); // Prevent unused warning #endif diff --git a/libcxx/test/std/utilities/time/date.time/ctime.pass.cpp b/libcxx/test/std/utilities/time/date.time/ctime.pass.cpp --- a/libcxx/test/std/utilities/time/date.time/ctime.pass.cpp +++ b/libcxx/test/std/utilities/time/date.time/ctime.pass.cpp @@ -19,7 +19,7 @@ #error CLOCKS_PER_SEC not defined #endif -#if TEST_STD_VER > 14 && defined(TEST_HAS_C11_FEATURES) +#if TEST_STD_VER > 14 && defined(TEST_HAS_TIMESPEC_GET) #ifndef TIME_UTC #error TIME_UTC not defined #endif @@ -41,7 +41,7 @@ ((void)t); // Prevent unused warning ((void)tm); // Prevent unused warning ((void)str); // Prevent unused warning -#if TEST_STD_VER > 14 && defined(TEST_HAS_C11_FEATURES) +#if TEST_STD_VER > 14 && defined(TEST_HAS_TIMESPEC_GET) std::timespec tmspec = {}; ((void)tmspec); // Prevent unused warning #endif diff --git a/libcxx/test/support/test_macros.h b/libcxx/test/support/test_macros.h --- a/libcxx/test/support/test_macros.h +++ b/libcxx/test/support/test_macros.h @@ -153,8 +153,18 @@ # if defined(__FreeBSD__) // Specifically, FreeBSD does NOT have timespec_get, even though they have all // the rest of C11 - this is PR#38495 +# define TEST_HAS_ALIGNED_ALLOC # define TEST_HAS_C11_FEATURES +# elif defined(__BIONIC__) +# define TEST_HAS_C11_FEATURES +# 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__) +# define TEST_HAS_ALIGNED_ALLOC # define TEST_HAS_C11_FEATURES # define TEST_HAS_TIMESPEC_GET # elif defined(__linux__) @@ -164,15 +174,18 @@ // newlib, etc may all support these features but need to be configured. # if defined(TEST_GLIBC_PREREQ) # if TEST_GLIBC_PREREQ(2, 17) +# define TEST_HAS_ALIGNED_ALLOC # define TEST_HAS_TIMESPEC_GET # define TEST_HAS_C11_FEATURES # endif # elif defined(_LIBCPP_HAS_MUSL_LIBC) +# define TEST_HAS_ALIGNED_ALLOC # define TEST_HAS_C11_FEATURES # define TEST_HAS_TIMESPEC_GET # endif # elif defined(_WIN32) # if defined(_MSC_VER) && !defined(__MINGW32__) +# define TEST_HAS_ALIGNED_ALLOC # define TEST_HAS_C11_FEATURES // Using Microsoft's C Runtime library # define TEST_HAS_TIMESPEC_GET # endif