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.

Reply via email to