On Thu, 21 May 2026 at 10:41, Tomasz Kaminski <[email protected]> wrote: > > > > On Wed, May 20, 2026 at 2:33 PM Jonathan Wakely <[email protected]> wrote: >> >> The paper P2614R2 was approved in Issaquah, 2023. It deprecates the >> float_denorm_style enumeration type, its enumerators, and the >> numeric_limits::has_denorm and numeric_limits::has_denorm_loss static >> data members. >> >> I don't understand why the std/ranges/iota/max_size_type.cc test doesn't >> get warnings for using numeric_limits::has_denorm{,_loss} only for using >> the enumerator. > > After changing the above from a variable template to functions with separate > static_assert for each check, I got warnings for has_denom{_loss}, so > seem to relate to this specific formulation:
Ah yes, thanks. I have opened https://gcc.gnu.org/PR125406 for that and will change the commit log to refer to that instead. > 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 d200554cbd1..b52fab2102b 100644 > --- a/libstdc++-v3/testsuite/std/ranges/iota/max_size_type.cc > +++ b/libstdc++-v3/testsuite/std/ranges/iota/max_size_type.cc > @@ -407,31 +407,34 @@ static_assert(max_diff_t(max_size_t(1) > == numeric_limits<max_diff_t>::min()); > > template <typename integer_class> > -constexpr bool verify_numeric_limits_values_not_meaningful_for = true > - && (numeric_limits<integer_class>::max_digits10 == 0) > - && (numeric_limits<integer_class>::min_exponent == 0) > - && (numeric_limits<integer_class>::min_exponent10 == 0) > - && (numeric_limits<integer_class>::max_exponent == 0) > - && (numeric_limits<integer_class>::max_exponent10 == 0) > - && !numeric_limits<integer_class>::is_iec559 > - && !numeric_limits<integer_class>::has_infinity > - && !numeric_limits<integer_class>::has_quiet_NaN > - && !numeric_limits<integer_class>::has_signaling_NaN > - && !numeric_limits<integer_class>::has_denorm_loss > - && !numeric_limits<integer_class>::tinyness_before > - && (numeric_limits<integer_class>::has_denorm == std::denorm_absent) > - && (numeric_limits<integer_class>::round_style == > std::round_toward_zero) > - && (numeric_limits<integer_class>::denorm_min() == 0) > - && (numeric_limits<integer_class>::epsilon() == 0) > - && (numeric_limits<integer_class>::round_error() == 0) > - && (numeric_limits<integer_class>::infinity() == 0) > - && (numeric_limits<integer_class>::quiet_NaN() == 0) > - && (numeric_limits<integer_class>::signaling_NaN() == 0); > +constexpr bool verify_numeric_limits_values_not_meaningful_for() > +{ > + static_assert(numeric_limits<integer_class>::max_digits10 == 0); > + static_assert(numeric_limits<integer_class>::min_exponent == 0); > + static_assert(numeric_limits<integer_class>::min_exponent10 == 0); > + static_assert(numeric_limits<integer_class>::max_exponent == 0); > + static_assert(numeric_limits<integer_class>::max_exponent10 == 0); > + static_assert(!numeric_limits<integer_class>::is_iec559); > + static_assert(!numeric_limits<integer_class>::has_infinity); > + static_assert(!numeric_limits<integer_class>::has_quiet_NaN); > + static_assert(!numeric_limits<integer_class>::has_signaling_NaN); > + static_assert(!numeric_limits<integer_class>::has_denorm_loss); > + static_assert(!numeric_limits<integer_class>::tinyness_before); > + static_assert(numeric_limits<integer_class>::has_denorm == > std::denorm_absent); > + static_assert(numeric_limits<integer_class>::round_style == > std::round_toward_zero); > + static_assert(numeric_limits<integer_class>::denorm_min() == 0); > + static_assert(numeric_limits<integer_class>::epsilon() == 0); > + static_assert(numeric_limits<integer_class>::round_error() == 0); > + static_assert(numeric_limits<integer_class>::infinity() == 0); > + static_assert(numeric_limits<integer_class>::quiet_NaN() == 0); > + static_assert(numeric_limits<integer_class>::signaling_NaN() == 0); > + return true; > +} > > // { dg-warning "denorm_absent' is deprecated" "" { target c++23 } 422 } > > -static_assert(verify_numeric_limits_values_not_meaningful_for<max_size_t>); > -static_assert(verify_numeric_limits_values_not_meaningful_for<max_diff_t>); > +static_assert(verify_numeric_limits_values_not_meaningful_for<max_size_t>()); > +static_assert(verify_numeric_limits_values_not_meaningful_for<max_diff_t>()); > >> >> libstdc++-v3/ChangeLog: >> >> * doc/xml/manual/evolution.xml: Document deprecations. >> * doc/html/manual/api.html: Regenerate. >> * include/bits/max_size_type.h (numeric_limits::has_denorm): >> Mark as deprecated. >> (numeric_limits::has_denorm_loss): Likewise. >> * include/std/limits (float_denorm_style): Mark as deprecated. >> (numeric_limits::has_denorm, numeric_limits::has_denorm_loss): >> Mark as deprecated. >> * testsuite/18_support/numeric_limits/char16_32_t.cc: Add >> dg-warning for expected deprecation warnings. >> * testsuite/18_support/numeric_limits/char8_t.cc: Likewise. >> * testsuite/18_support/numeric_limits/denorm_min.cc: Likewise. >> * testsuite/18_support/numeric_limits/dr559.cc: Likewise. >> * testsuite/18_support/numeric_limits/requirements/constexpr_data.cc: >> Likewise. >> * >> testsuite/18_support/numeric_limits/specialization_default_values.cc: >> Likewise. >> * testsuite/std/ranges/iota/max_size_type.cc: Likewise. >> --- >> >> Tested x86_64-linux. > > LTGM. I like separate static_asserts inside a function for ranges > max_size_type, > as they would it clear what check failed, if it fails, so would do that > change. > But not necessary, so I am OK either way. I agree in general, but for this specific test it's very unlikely that we'll ever change the numeric_limits specializations for the integer-class types, and very unlikely that those assertions will ever fail. So I don't think there's much benefit to changing them to be more clear about a problem that will never happen. So I'll just leave them as-is.
