From 6e0c6f995fefb61bf9712ed267f252334d4d608f Mon Sep 17 00:00:00 2001 From: Hristo Hristov Date: Sat, 3 Aug 2024 17:29:01 +0300 Subject: [PATCH 1/3] [libc++][numeric][NFC] Cleanup *Saturation arithmetic* tests This simplifies the tests a little bit: Fixed -> TODO(LLVM20): remove [[maybe_unused]] and `{}` scope since all supported compilers support "Placeholder variables with no name" --- .../numeric.ops.sat/add_sat.pass.cpp | 6 +- .../numeric.ops.sat/div_sat.pass.cpp | 6 +- .../numeric.ops.sat/mul_sat.pass.cpp | 6 +- .../numeric.ops.sat/saturate_cast.pass.cpp | 131 +++++++++--------- .../numeric.ops.sat/sub_sat.pass.cpp | 6 +- 5 files changed, 72 insertions(+), 83 deletions(-) diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.pass.cpp index 036bf53e36dcd..8288378ab769e 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.pass.cpp @@ -25,8 +25,7 @@ constexpr bool test_signed() { constexpr auto minVal = std::numeric_limits::min(); constexpr auto maxVal = std::numeric_limits::max(); - // TODO(LLVM-20) remove [[maybe_unused]] since all supported compilers support "Placeholder variables with no name" - [[maybe_unused]] std::same_as decltype(auto) _ = std::add_sat(minVal, maxVal); + std::same_as decltype(auto) _ = std::add_sat(minVal, maxVal); static_assert(noexcept(std::add_sat(minVal, maxVal))); @@ -97,8 +96,7 @@ constexpr bool test_unsigned() { constexpr auto minVal = std::numeric_limits::min(); constexpr auto maxVal = std::numeric_limits::max(); - // TODO(LLVM-20) remove [[maybe_unused]] since all supported compilers support "Placeholder variables with no name" - [[maybe_unused]] std::same_as decltype(auto) _ = std::add_sat(minVal, maxVal); + std::same_as decltype(auto) _ = std::add_sat(minVal, maxVal); static_assert(noexcept(std::add_sat(minVal, maxVal))); diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.pass.cpp index b1cace74d8828..fa9841b24d27a 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.pass.cpp @@ -26,8 +26,7 @@ constexpr bool test_signed() { constexpr auto minVal = std::numeric_limits::min(); constexpr auto maxVal = std::numeric_limits::max(); - // TODO(LLVM-20) remove [[maybe_unused]] and `{}` scope since all supported compilers support "Placeholder variables with no name" - [[maybe_unused]] std::same_as decltype(auto) _ = std::div_sat(minVal, maxVal); + std::same_as decltype(auto) _ = std::div_sat(minVal, maxVal); static_assert(noexcept(std::div_sat(minVal, maxVal))); @@ -89,8 +88,7 @@ constexpr bool test_unsigned() { constexpr auto minVal = std::numeric_limits::min(); constexpr auto maxVal = std::numeric_limits::max(); - // TODO(LLVM-20) remove [[maybe_unused]] since all supported compilers support "Placeholder variables with no name" - [[maybe_unused]] std::same_as decltype(auto) _ = std::div_sat(minVal, maxVal); + std::same_as decltype(auto) _ = std::div_sat(minVal, maxVal); static_assert(noexcept(std::div_sat(minVal, maxVal))); // clang-format off diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.pass.cpp index 2c8eec57e1204..060eb52103a02 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.pass.cpp @@ -26,8 +26,7 @@ constexpr bool test_signed() { constexpr auto minVal = std::numeric_limits::min(); constexpr auto maxVal = std::numeric_limits::max(); - // TODO(LLVM-20) remove [[maybe_unused]] since all supported compilers support "Placeholder variables with no name" - [[maybe_unused]] std::same_as decltype(auto) _ = std::mul_sat(minVal, maxVal); + std::same_as decltype(auto) _ = std::mul_sat(minVal, maxVal); static_assert(noexcept(std::mul_sat(minVal, maxVal))); @@ -103,8 +102,7 @@ constexpr bool test_unsigned() { constexpr auto minVal = std::numeric_limits::min(); constexpr auto maxVal = std::numeric_limits::max(); - // TODO(LLVM-20) remove [[maybe_unused]] since all supported compilers support "Placeholder variables with no name" - [[maybe_unused]] std::same_as decltype(auto) _ = std::mul_sat(minVal, maxVal); + std::same_as decltype(auto) _ = std::mul_sat(minVal, maxVal); static_assert(noexcept(std::mul_sat(minVal, maxVal))); diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.pass.cpp index cbca37e3a6613..4ba27d6636894 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.pass.cpp @@ -20,7 +20,6 @@ #include #include "test_macros.h" -#include // Smaller to larger static_assert(noexcept(std::saturate_cast(std::numeric_limits::max()))); @@ -72,314 +71,312 @@ constexpr bool test() { // signed char - // TODO(LLVM-20) remove [[maybe_unused]] and `{}` scope since all supported compilers support "Placeholder variables with no name", - // here and below... - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); assert(std::saturate_cast(SCHAR_MIN) == SCHAR_MIN); assert(std::saturate_cast( O_C) == O_C); assert(std::saturate_cast(SCHAR_MAX) == SCHAR_MAX); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); assert(std::saturate_cast( O_UC) == O_C); assert(std::saturate_cast(UCHAR_MAX) == SCHAR_MAX); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); assert(std::saturate_cast(sBigMin) == SCHAR_MIN); // saturated assert(std::saturate_cast( sZero) == O_C); assert(std::saturate_cast(sBigMax) == SCHAR_MAX); // saturated - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); assert(std::saturate_cast( uZero) == O_C); assert(std::saturate_cast(uBigMax) == SCHAR_MAX); // saturated // short - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); assert(std::saturate_cast(SCHAR_MIN) == static_cast(SCHAR_MIN)); assert(std::saturate_cast( O_C) == O_S); assert(std::saturate_cast(SCHAR_MAX) == static_cast(SCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); assert(std::saturate_cast( O_UC) == O_S); assert(std::saturate_cast(UCHAR_MAX) == static_cast(UCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(SHRT_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(SHRT_MAX); assert(std::saturate_cast( SHRT_MIN) == SHRT_MIN); assert(std::saturate_cast( O_S) == O_S); assert(std::saturate_cast( SHRT_MAX) == SHRT_MAX); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(USHRT_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(USHRT_MAX); assert(std::saturate_cast( O_US) == O_S); assert(std::saturate_cast(USHRT_MAX) == SHRT_MAX); // saturated - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); assert(std::saturate_cast( sBigMin) == SHRT_MIN); // saturated assert(std::saturate_cast( sZero) == O_S); assert(std::saturate_cast( sBigMax) == SHRT_MAX); // saturated - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); assert(std::saturate_cast( uZero) == O_S); assert(std::saturate_cast( uBigMax) == SHRT_MAX); // saturated // int - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); assert(std::saturate_cast(SCHAR_MIN) == static_cast(SCHAR_MIN)); assert(std::saturate_cast( O_C) == 0); assert(std::saturate_cast(SCHAR_MAX) == static_cast(SCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); assert(std::saturate_cast( O_UC) == 0); assert(std::saturate_cast(UCHAR_MAX) == static_cast(UCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(INT_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(INT_MAX); assert(std::saturate_cast( INT_MIN) == INT_MIN); assert(std::saturate_cast( 0) == 0); assert(std::saturate_cast( INT_MAX) == INT_MAX); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(UINT_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(UINT_MAX); assert(std::saturate_cast( 0) == 0); assert(std::saturate_cast(UINT_MAX) == INT_MAX); // saturated - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); assert(std::saturate_cast( sBigMin) == INT_MIN); // saturated assert(std::saturate_cast( sZero) == 0); assert(std::saturate_cast( sBigMax) == INT_MAX); // saturated - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); assert(std::saturate_cast( uZero) == 0); assert(std::saturate_cast( uBigMax) == INT_MAX); // saturated // long - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); assert(std::saturate_cast(SCHAR_MIN) == static_cast(SCHAR_MIN)); assert(std::saturate_cast( O_C) == 0L); assert(std::saturate_cast(SCHAR_MAX) == static_cast(SCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); assert(std::saturate_cast( O_UC) == 0L); assert(std::saturate_cast(UCHAR_MAX) == static_cast(UCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(LONG_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(LONG_MAX); assert(std::saturate_cast( LONG_MIN) == LONG_MIN); assert(std::saturate_cast( 0L) == 0L); assert(std::saturate_cast( LONG_MAX) == LONG_MAX); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(ULONG_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(ULONG_MAX); assert(std::saturate_cast( 0UL) == 0L); assert(std::saturate_cast(ULONG_MAX) == LONG_MAX); // saturated - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); assert(std::saturate_cast( sBigMin) == LONG_MIN); // saturated assert(std::saturate_cast( sZero) == 0L); assert(std::saturate_cast( sBigMax) == LONG_MAX); // saturated - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); assert(std::saturate_cast( uZero) == 0L); assert(std::saturate_cast( uBigMax) == LONG_MAX); // saturated // long long - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); assert(std::saturate_cast(SCHAR_MIN) == static_cast(SCHAR_MIN)); assert(std::saturate_cast( 0LL) == 0LL); assert(std::saturate_cast(SCHAR_MAX) == static_cast(SCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); assert(std::saturate_cast( O_UC) == 0LL); assert(std::saturate_cast(UCHAR_MAX) == static_cast(UCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(LLONG_MIN); } + std::same_as decltype(auto) _ = std::saturate_cast(LLONG_MIN); assert(std::saturate_cast(LLONG_MIN) == LLONG_MIN); assert(std::saturate_cast( 0LL) == 0LL); assert(std::saturate_cast(LLONG_MAX) == LLONG_MAX); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(ULLONG_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(ULLONG_MAX); assert(std::saturate_cast( 0ULL) == 0LL); assert(std::saturate_cast(ULLONG_MAX) == LLONG_MAX); // saturated #ifndef TEST_HAS_NO_INT128 - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); assert(std::saturate_cast( sBigMin) == LLONG_MIN); // (128-bit) saturated assert(std::saturate_cast( sZero) == 0LL); assert(std::saturate_cast( sBigMax) == LLONG_MAX); // (128-bit) saturated - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); assert(std::saturate_cast( uZero) == 0LL); assert(std::saturate_cast( uBigMax) == LLONG_MAX); // (128-bit) saturated - { [[maybe_unused]] std::same_as<__int128_t> decltype(auto) _ = std::saturate_cast<__int128_t>(SCHAR_MAX); } + std::same_as<__int128_t> decltype(auto) _ = std::saturate_cast<__int128_t>(SCHAR_MAX); assert(std::saturate_cast<__int128_t>(SCHAR_MIN) == static_cast<__int128_t>(SCHAR_MIN)); assert(std::saturate_cast<__int128_t>( O_C) == sZero); assert(std::saturate_cast<__int128_t>(SCHAR_MAX) == static_cast<__int128_t>(SCHAR_MAX)); - { [[maybe_unused]] std::same_as<__int128_t> decltype(auto) _ = std::saturate_cast<__int128_t>(UCHAR_MAX); } + std::same_as<__int128_t> decltype(auto) _ = std::saturate_cast<__int128_t>(UCHAR_MAX); assert(std::saturate_cast<__int128_t>( O_UC) == sZero); assert(std::saturate_cast<__int128_t>(UCHAR_MAX) == static_cast<__int128_t>(UCHAR_MAX)); - { [[maybe_unused]] std::same_as<__int128_t> decltype(auto) _ = std::saturate_cast<__int128_t>(sBigMax); } + std::same_as<__int128_t> decltype(auto) _ = std::saturate_cast<__int128_t>(sBigMax); assert(std::saturate_cast<__int128_t>( sBigMin) == sBigMin); assert(std::saturate_cast<__int128_t>( sZero) == sZero); assert(std::saturate_cast<__int128_t>( sBigMax) == sBigMax); - { [[maybe_unused]] std::same_as<__int128_t> decltype(auto) _ = std::saturate_cast<__int128_t>(uBigMax); } + std::same_as<__int128_t> decltype(auto) _ = std::saturate_cast<__int128_t>(uBigMax); assert(std::saturate_cast<__int128_t>( uZero) == sZero); assert(std::saturate_cast<__int128_t>( uBigMax) == sBigMax); // saturated #endif // unsigned char - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); assert(std::saturate_cast(SCHAR_MIN) == O_UC); assert(std::saturate_cast( O_C) == O_UC); assert(std::saturate_cast(SCHAR_MAX) == static_cast(SCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); assert(std::saturate_cast( O_UC) == O_UC); assert(std::saturate_cast(UCHAR_MAX) == UCHAR_MAX); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); assert(std::saturate_cast( sBigMin) == O_UC); // saturated assert(std::saturate_cast( sZero) == O_UC); assert(std::saturate_cast( sBigMax) == UCHAR_MAX); // saturated - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); assert(std::saturate_cast( uZero) == O_UC); assert(std::saturate_cast( uBigMax) == UCHAR_MAX); // saturated // unsigned short - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); assert(std::saturate_cast(SCHAR_MIN) == O_US); assert(std::saturate_cast( O_C) == O_US); assert(std::saturate_cast(SCHAR_MAX) == static_cast(SCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); assert(std::saturate_cast( O_UC) == O_US); assert(std::saturate_cast(UCHAR_MAX) == static_cast(UCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MIN); } + std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MIN); assert(std::saturate_cast( SHRT_MIN) == O_US); assert(std::saturate_cast( O_S) == O_US); assert(std::saturate_cast( SHRT_MAX) == static_cast(SHRT_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); assert(std::saturate_cast( O_US) == O_US); assert(std::saturate_cast(USHRT_MAX) == USHRT_MAX); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); assert(std::saturate_cast( sBigMin) == O_US); // saturated assert(std::saturate_cast( sZero) == O_US); assert(std::saturate_cast( sBigMax) == USHRT_MAX); // saturated - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); assert(std::saturate_cast( uZero) == O_US); assert(std::saturate_cast( uBigMax) == USHRT_MAX); // saturated // unsigned int - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); assert(std::saturate_cast(SCHAR_MIN) == O_US); assert(std::saturate_cast( O_UC) == 0U); assert(std::saturate_cast(SCHAR_MAX) == static_cast(SCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); assert(std::saturate_cast( O_UC) == 0U); assert(std::saturate_cast(UCHAR_MAX) == static_cast(UCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(INT_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(INT_MAX); assert(std::saturate_cast( INT_MIN) == 0U); assert(std::saturate_cast( 0) == 0U); assert(std::saturate_cast( INT_MAX) == static_cast(INT_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(UINT_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(UINT_MAX); assert(std::saturate_cast( 0U) == 0U); assert(std::saturate_cast( UINT_MAX) == UINT_MAX); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); assert(std::saturate_cast( sBigMin) == 0U); // saturated assert(std::saturate_cast( sZero) == 0U); assert(std::saturate_cast( sBigMax) == UINT_MAX); // saturated - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); assert(std::saturate_cast( uZero) == 0U); assert(std::saturate_cast( uBigMax) == UINT_MAX); // saturated // unsigned long - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); assert(std::saturate_cast(SCHAR_MIN) == 0UL); assert(std::saturate_cast( O_C) == 0UL); assert(std::saturate_cast(SCHAR_MAX) == static_cast(SCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); assert(std::saturate_cast( O_UC) == 0UL); assert(std::saturate_cast(UCHAR_MAX) == static_cast(UCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(LONG_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(LONG_MAX); assert(std::saturate_cast( LONG_MIN) == 0UL); assert(std::saturate_cast( 0L) == 0UL); assert(std::saturate_cast( LONG_MAX) == static_cast(LONG_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(ULONG_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(ULONG_MAX); assert(std::saturate_cast( 0UL) == 0UL); assert(std::saturate_cast(ULONG_MAX) == ULONG_MAX); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); assert(std::saturate_cast( sBigMin) == 0UL); // saturated assert(std::saturate_cast( sZero) == 0UL); assert(std::saturate_cast( sBigMax) == (sizeof(UIntT) > sizeof(unsigned long int) ? ULONG_MAX : LONG_MAX)); // saturated depending on underlying types - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); assert(std::saturate_cast( uZero) == 0UL); assert(std::saturate_cast( uBigMax) == ULONG_MAX); // saturated // unsigned long long - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(SCHAR_MAX); assert(std::saturate_cast( SCHAR_MIN) == 0ULL); assert(std::saturate_cast( O_C) == 0ULL); assert(std::saturate_cast( SCHAR_MAX) == static_cast(SCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(UCHAR_MAX); assert(std::saturate_cast( O_UC) == 0ULL); assert(std::saturate_cast( UCHAR_MAX) == static_cast(UCHAR_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(LLONG_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(LLONG_MAX); assert(std::saturate_cast( LLONG_MIN) == 0ULL); assert(std::saturate_cast( 0LL) == 0ULL); assert(std::saturate_cast( LLONG_MAX) == static_cast(LLONG_MAX)); - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(ULLONG_MAX); } + std::same_as decltype(auto) _ = std::saturate_cast(ULLONG_MAX); assert(std::saturate_cast( 0ULL) == 0ULL); assert(std::saturate_cast(ULLONG_MAX) == ULLONG_MAX); #ifndef TEST_HAS_NO_INT128 - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(sBigMax); assert(std::saturate_cast( sBigMin) == 0ULL); // (128-bit) saturated assert(std::saturate_cast( sZero) == 0ULL); assert(std::saturate_cast( sBigMax) == ULLONG_MAX); // (128-bit) saturated - { [[maybe_unused]] std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); } + std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); assert(std::saturate_cast( uZero) == 0ULL); assert(std::saturate_cast( uBigMax) == ULLONG_MAX); // (128-bit) saturated - { [[maybe_unused]] std::same_as<__uint128_t> decltype(auto) _ = std::saturate_cast<__uint128_t>(SCHAR_MIN); } + std::same_as<__uint128_t> decltype(auto) _ = std::saturate_cast<__uint128_t>(SCHAR_MIN); assert(std::saturate_cast<__uint128_t>(SCHAR_MIN) == uZero); assert(std::saturate_cast<__uint128_t>( O_C) == uZero); assert(std::saturate_cast<__uint128_t>(SCHAR_MAX) == static_cast<__uint128_t>(SCHAR_MAX)); - { [[maybe_unused]] std::same_as<__uint128_t> decltype(auto) _ = std::saturate_cast<__uint128_t>(UCHAR_MAX); } + std::same_as<__uint128_t> decltype(auto) _ = std::saturate_cast<__uint128_t>(UCHAR_MAX); assert(std::saturate_cast<__uint128_t>( O_UC) == uZero); assert(std::saturate_cast<__uint128_t>(UCHAR_MAX) == static_cast<__uint128_t>(UCHAR_MAX)); - { [[maybe_unused]] std::same_as<__uint128_t> decltype(auto) _ = std::saturate_cast<__uint128_t>(sBigMax); } + std::same_as<__uint128_t> decltype(auto) _ = std::saturate_cast<__uint128_t>(sBigMax); assert(std::saturate_cast<__uint128_t>( sBigMin) == uZero); // saturated assert(std::saturate_cast<__uint128_t>( sZero) == uZero); assert(std::saturate_cast<__uint128_t>( sBigMax) == static_cast<__uint128_t>(sBigMax)); - { [[maybe_unused]] std::same_as<__uint128_t> decltype(auto) _ = std::saturate_cast<__uint128_t>(uBigMax); } + std::same_as<__uint128_t> decltype(auto) _ = std::saturate_cast<__uint128_t>(uBigMax); assert(std::saturate_cast<__uint128_t>( uZero) == uZero); assert(std::saturate_cast<__uint128_t>( uBigMax) == uBigMax); #endif diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.pass.cpp index d7bdf2c0271ac..fe4255c1f7a6b 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.pass.cpp @@ -26,8 +26,7 @@ constexpr bool test_signed() { constexpr auto minVal = std::numeric_limits::min(); constexpr auto maxVal = std::numeric_limits::max(); - // TODO(LLVM-20) remove [[maybe_unused]] since all supported compilers support "Placeholder variables with no name" - [[maybe_unused]] std::same_as decltype(auto) _ = std::sub_sat(minVal, maxVal); + std::same_as decltype(auto) _ = std::sub_sat(minVal, maxVal); static_assert(noexcept(std::sub_sat(minVal, maxVal))); @@ -89,8 +88,7 @@ constexpr bool test_unsigned() { constexpr auto minVal = std::numeric_limits::min(); constexpr auto maxVal = std::numeric_limits::max(); - // TODO(LLVM-20) remove [[maybe_unused]] since all supported compilers support "Placeholder variables with no name" - [[maybe_unused]] std::same_as decltype(auto) _ = std::sub_sat(minVal, maxVal); + std::same_as decltype(auto) _ = std::sub_sat(minVal, maxVal); static_assert(noexcept(std::sub_sat(minVal, maxVal))); From 9f0ae82abb74b81bd5e0cac1a2bec0e3530333b4 Mon Sep 17 00:00:00 2001 From: Hristo Hristov Date: Sat, 15 Mar 2025 06:22:28 +0200 Subject: [PATCH 2/3] Minor tweaks fix CI for AppleClang --- .../numeric.ops/numeric.ops.sat/add_sat.compile.pass.cpp | 2 +- .../numerics/numeric.ops/numeric.ops.sat/add_sat.pass.cpp | 5 ++++- .../numeric.ops/numeric.ops.sat/div_sat.assert.pass.cpp | 2 +- .../numeric.ops/numeric.ops.sat/div_sat.compile.pass.cpp | 2 +- .../numerics/numeric.ops/numeric.ops.sat/div_sat.pass.cpp | 4 +++- .../numeric.ops/numeric.ops.sat/mul_sat.compile.pass.cpp | 2 +- .../numerics/numeric.ops/numeric.ops.sat/mul_sat.pass.cpp | 4 +++- .../numeric.ops.sat/saturate_cast.compile.pass.cpp | 2 +- .../numeric.ops/numeric.ops.sat/saturate_cast.pass.cpp | 7 +++++-- .../numeric.ops/numeric.ops.sat/sub_sat.compile.pass.cpp | 2 +- .../numerics/numeric.ops/numeric.ops.sat/sub_sat.pass.cpp | 4 +++- 11 files changed, 24 insertions(+), 12 deletions(-) diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.compile.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.compile.pass.cpp index 38b6d627869a0..23f780cfc2b5e 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.compile.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.compile.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 +// REQUIRES: std-at-least-c++26 // diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.pass.cpp index 8288378ab769e..7493f44e7a8be 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.pass.cpp @@ -6,7 +6,10 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 +// REQUIRES: std-at-least-c++26 + +// The test uses "Placeholder variables with no name" +// UNSUPPORTED: Apple-Clang-15, Apple-Clang-16 // diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.assert.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.assert.pass.cpp index b1ef8345d51e6..50bc29bee4d53 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.assert.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.assert.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 +// REQUIRES: std-at-least-c++26 // REQUIRES: has-unix-headers // REQUIRES: libcpp-hardening-mode={{extensive|debug}} diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.compile.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.compile.pass.cpp index 32d77f710bd70..02ffb17292164 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.compile.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.compile.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 +// REQUIRES: std-at-least-c++26 // diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.pass.cpp index fa9841b24d27a..2fcb331633de0 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.pass.cpp @@ -6,8 +6,10 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 +// REQUIRES: std-at-least-c++26 + // The test uses "Placeholder variables with no name" +// UNSUPPORTED: Apple-Clang-15, Apple-Clang-16 // diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.compile.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.compile.pass.cpp index f1762d2591199..cd572a73006a8 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.compile.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.compile.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 +// REQUIRES: std-at-least-c++26 // diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.pass.cpp index 060eb52103a02..a0c3bd7a529ba 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.pass.cpp @@ -6,8 +6,10 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 +// REQUIRES: std-at-least-c++26 + // The test uses "Placeholder variables with no name" +// UNSUPPORTED: Apple-Clang-15, Apple-Clang-16 // diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.compile.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.compile.pass.cpp index 9b035c1e3c4e5..237deb0c7c138 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.compile.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.compile.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 +// REQUIRES: std-at-least-c++26 // diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.pass.cpp index 4ba27d6636894..36530f9fef47d 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.pass.cpp @@ -6,7 +6,10 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 +// REQUIRES: std-at-least-c++26 + +// The test uses "Placeholder variables with no name" +// UNSUPPORTED: Apple-Clang-15, Apple-Clang-16 // @@ -298,7 +301,7 @@ constexpr bool test() { assert(std::saturate_cast( sBigMin) == 0U); // saturated assert(std::saturate_cast( sZero) == 0U); assert(std::saturate_cast( sBigMax) == UINT_MAX); // saturated - + std::same_as decltype(auto) _ = std::saturate_cast(uBigMax); assert(std::saturate_cast( uZero) == 0U); assert(std::saturate_cast( uBigMax) == UINT_MAX); // saturated diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.compile.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.compile.pass.cpp index 9234819d9ec24..453b9b3600f8a 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.compile.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.compile.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 +// REQUIRES: std-at-least-c++26 // diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.pass.cpp index fe4255c1f7a6b..c9d3c44b390a2 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.pass.cpp @@ -6,8 +6,10 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 +// REQUIRES: std-at-least-c++26 + // The test uses "Placeholder variables with no name" +// UNSUPPORTED: Apple-Clang-15, Apple-Clang-16 // From 6837f7d9c72c966519ce9e52e8b00b45b497b072 Mon Sep 17 00:00:00 2001 From: Hristo Hristov Date: Sat, 15 Mar 2025 06:28:55 +0200 Subject: [PATCH 3/3] Minor tweaks --- .../std/numerics/numeric.ops/numeric.ops.sat/add_sat.pass.cpp | 2 +- .../std/numerics/numeric.ops/numeric.ops.sat/div_sat.pass.cpp | 2 +- .../std/numerics/numeric.ops/numeric.ops.sat/mul_sat.pass.cpp | 2 +- .../numerics/numeric.ops/numeric.ops.sat/saturate_cast.pass.cpp | 2 +- .../std/numerics/numeric.ops/numeric.ops.sat/sub_sat.pass.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.pass.cpp index 7493f44e7a8be..43481323e800c 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/add_sat.pass.cpp @@ -9,7 +9,7 @@ // REQUIRES: std-at-least-c++26 // The test uses "Placeholder variables with no name" -// UNSUPPORTED: Apple-Clang-15, Apple-Clang-16 +// UNSUPPORTED: apple-clang-15, apple-clang-16 // diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.pass.cpp index 2fcb331633de0..ef312b7e3a911 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/div_sat.pass.cpp @@ -9,7 +9,7 @@ // REQUIRES: std-at-least-c++26 // The test uses "Placeholder variables with no name" -// UNSUPPORTED: Apple-Clang-15, Apple-Clang-16 +// UNSUPPORTED: apple-clang-15, apple-clang-16 // diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.pass.cpp index a0c3bd7a529ba..94bc7ad7c48d4 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/mul_sat.pass.cpp @@ -9,7 +9,7 @@ // REQUIRES: std-at-least-c++26 // The test uses "Placeholder variables with no name" -// UNSUPPORTED: Apple-Clang-15, Apple-Clang-16 +// UNSUPPORTED: apple-clang-15, apple-clang-16 // diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.pass.cpp index 36530f9fef47d..79d6e2643fc4e 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/saturate_cast.pass.cpp @@ -9,7 +9,7 @@ // REQUIRES: std-at-least-c++26 // The test uses "Placeholder variables with no name" -// UNSUPPORTED: Apple-Clang-15, Apple-Clang-16 +// UNSUPPORTED: apple-clang-15, apple-clang-16 // diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.pass.cpp index c9d3c44b390a2..92ddc30aefc66 100644 --- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.sat/sub_sat.pass.cpp @@ -9,7 +9,7 @@ // REQUIRES: std-at-least-c++26 // The test uses "Placeholder variables with no name" -// UNSUPPORTED: Apple-Clang-15, Apple-Clang-16 +// UNSUPPORTED: apple-clang-15, apple-clang-16 //