From 7135990e3b07d3f29de46e9ca7ddbb66c094d52e Mon Sep 17 00:00:00 2001 From: Mateusz Zych Date: Tue, 8 Jul 2025 10:51:07 +0100 Subject: libstdc++: Added missing members to numeric_limits specializations for integer-class types [iterator.concept.winc]/11 says that std::numeric_limits should be specialized for integer-class types, with each member defined appropriately. libstdc++-v3/ChangeLog: * include/bits/max_size_type.h (numeric_limits<__max_size_type>): New members. (numeric_limits<__max_diff_type>): Likewise. * testsuite/std/ranges/iota/max_size_type.cc: New test cases. Signed-off-by: Mateusz Zych --- .../testsuite/std/ranges/iota/max_size_type.cc | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'libstdc++-v3/testsuite/std') diff --git a/libstdc++-v3/testsuite/std/ranges/iota/max_size_type.cc b/libstdc++-v3/testsuite/std/ranges/iota/max_size_type.cc index 4739d9e..fbd783b 100644 --- a/libstdc++-v3/testsuite/std/ranges/iota/max_size_type.cc +++ b/libstdc++-v3/testsuite/std/ranges/iota/max_size_type.cc @@ -352,6 +352,9 @@ static_assert(numeric_limits::is_specialized); static_assert(!numeric_limits::is_signed); static_assert(numeric_limits::is_integer); static_assert(numeric_limits::is_exact); +static_assert(numeric_limits::is_bounded); +static_assert(numeric_limits::is_modulo); +static_assert(numeric_limits::radix == 2); // We can't unconditionally use numeric_limits here because __int128 is an // integral type only in GNU mode. #if __SIZEOF_INT128__ @@ -379,6 +382,9 @@ static_assert(numeric_limits::is_specialized); static_assert(numeric_limits::is_signed); static_assert(numeric_limits::is_integer); static_assert(numeric_limits::is_exact); +static_assert(numeric_limits::is_bounded); +static_assert(!numeric_limits::is_modulo); +static_assert(numeric_limits::radix == 2); static_assert(numeric_limits::digits == numeric_limits::digits - 1); static_assert(numeric_limits::digits10 @@ -400,6 +406,31 @@ static_assert(max_diff_t(max_size_t(1) << (numeric_limits::digits-1)) == numeric_limits::min()); +template +constexpr bool verify_numeric_limits_values_not_meaningful_for = true + && (numeric_limits::max_digits10 == 0) + && (numeric_limits::min_exponent == 0) + && (numeric_limits::min_exponent10 == 0) + && (numeric_limits::max_exponent == 0) + && (numeric_limits::max_exponent10 == 0) + && !numeric_limits::is_iec559 + && !numeric_limits::has_infinity + && !numeric_limits::has_quiet_NaN + && !numeric_limits::has_signaling_NaN + && !numeric_limits::has_denorm_loss + && !numeric_limits::tinyness_before + && (numeric_limits::has_denorm == std::denorm_absent) + && (numeric_limits::round_style == std::round_toward_zero) + && (numeric_limits::denorm_min() == 0) + && (numeric_limits::epsilon() == 0) + && (numeric_limits::round_error() == 0) + && (numeric_limits::infinity() == 0) + && (numeric_limits::quiet_NaN() == 0) + && (numeric_limits::signaling_NaN() == 0); + +static_assert(verify_numeric_limits_values_not_meaningful_for); +static_assert(verify_numeric_limits_values_not_meaningful_for); + // Verify that the types are structural types and can therefore be used // as NTTP types. template struct Su { static_assert(V*V == V+132); }; -- cgit v1.1