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:
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.
>
> libstdc++-v3/doc/html/manual/api.html | 5 ++
> libstdc++-v3/doc/xml/manual/evolution.xml | 8 +++
> libstdc++-v3/include/bits/max_size_type.h | 10 ++++
> libstdc++-v3/include/std/limits | 59 +++++++++++++++++--
> .../18_support/numeric_limits/char16_32_t.cc | 3 +
> .../18_support/numeric_limits/char8_t.cc | 3 +
> .../18_support/numeric_limits/denorm_min.cc | 2 +
> .../18_support/numeric_limits/dr559.cc | 2 +
> .../requirements/constexpr_data.cc | 3 +
> .../specialization_default_values.cc | 2 +
> .../std/ranges/iota/max_size_type.cc | 2 +
> 11 files changed, 95 insertions(+), 4 deletions(-)
>
> diff --git a/libstdc++-v3/doc/html/manual/api.html
> b/libstdc++-v3/doc/html/manual/api.html
> index 4fce14127ef8..2398bf495361 100644
> --- a/libstdc++-v3/doc/html/manual/api.html
> +++ b/libstdc++-v3/doc/html/manual/api.html
> @@ -519,4 +519,9 @@ Made <code
> class="code">std::is_integral_v<__int128></code> true for stric
> Removed allocator-extended constructors and support for uses-allocator
> construction from <code class="classname">std::promise</code> and
> <code class="classname">std::packaged_task</code>.
> +</p><p>
> +<code class="code">std::numeric_limits::has_denorm</code>,
> +<code class="code">std::numeric_limits::has_denorm_loss</code>,
> +and <code class="code">enum std::float_denorm_style</code> and its
> enumerators
> +were deprecated for C++23.
> </p></div></div><div class="navfooter"><hr /><table width="100%"
> summary="Navigation footer"><tr><td width="40%" align="left"><a
> accesskey="p" href="abi.html">Prev</a> </td><td width="20%"
> align="center"><a accesskey="u" href="appendix_porting.html">Up</a></td><td
> width="40%" align="right"> <a accesskey="n"
> href="backwards.html">Next</a></td></tr><tr><td width="40%" align="left"
> valign="top">ABI Policy and Guidelines </td><td width="20%"
> align="center"><a accesskey="h" href="../index.html">Home</a></td><td
> width="40%" align="right" valign="top"> Backwards
> Compatibility</td></tr></table></div></body></html>
> \ No newline at end of file
> diff --git a/libstdc++-v3/doc/xml/manual/evolution.xml
> b/libstdc++-v3/doc/xml/manual/evolution.xml
> index 2ebdebc98204..8c471cca5b89 100644
> --- a/libstdc++-v3/doc/xml/manual/evolution.xml
> +++ b/libstdc++-v3/doc/xml/manual/evolution.xml
> @@ -1170,6 +1170,14 @@ Removed allocator-extended constructors and support
> for uses-allocator
> construction from <classname>std::promise</classname> and
> <classname>std::packaged_task</classname>.
> </para>
> +
> +<para>
> +<code>std::numeric_limits::has_denorm</code>,
> +<code>std::numeric_limits::has_denorm_loss</code>,
> +and <code>enum std::float_denorm_style</code> and its enumerators
> +were deprecated for C++23.
> +</para>
> +
> </section>
>
> </section>
> diff --git a/libstdc++-v3/include/bits/max_size_type.h
> b/libstdc++-v3/include/bits/max_size_type.h
> index 042aad10a138..28596f0dd51f 100644
> --- a/libstdc++-v3/include/bits/max_size_type.h
> +++ b/libstdc++-v3/include/bits/max_size_type.h
> @@ -791,9 +791,14 @@ namespace ranges
> static constexpr bool has_infinity = false;
> static constexpr bool has_quiet_NaN = false;
> static constexpr bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static constexpr bool has_denorm_loss = false;
> static constexpr bool tinyness_before = false;
> +#pragma GCC diagnostic push
> +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" //
> denorm_absent
> + _GLIBCXX23_DEPRECATED
> static constexpr float_denorm_style has_denorm = denorm_absent;
> +#pragma GCC diagnostic pop
> static constexpr float_round_style round_style = round_toward_zero;
>
> static constexpr _Sp
> @@ -858,9 +863,14 @@ namespace ranges
> static constexpr bool has_infinity = false;
> static constexpr bool has_quiet_NaN = false;
> static constexpr bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static constexpr bool has_denorm_loss = false;
> static constexpr bool tinyness_before = false;
> +#pragma GCC diagnostic push
> +#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
> + _GLIBCXX23_DEPRECATED
> static constexpr float_denorm_style has_denorm = denorm_absent;
> +#pragma GCC diagnostic pop
> static constexpr float_round_style round_style = round_toward_zero;
>
> static constexpr _Dp
> diff --git a/libstdc++-v3/include/std/limits
> b/libstdc++-v3/include/std/limits
> index cfdbe02c844c..4dc9c643bba6 100644
> --- a/libstdc++-v3/include/std/limits
> +++ b/libstdc++-v3/include/std/limits
> @@ -45,6 +45,7 @@
> #pragma GCC diagnostic ignored "-Wpedantic" // Q suffix
> #pragma GCC diagnostic ignored "-Wlong-long"
> #pragma GCC diagnostic ignored "-Wc++23-extensions"
> +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" // denorm enums
>
> #include <bits/c++config.h>
>
> @@ -191,14 +192,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> * These values represent the presence or absence of a variable number
> * of exponent bits. This type is used in the std::numeric_limits
> class.
> */
> - enum float_denorm_style
> + enum _GLIBCXX23_DEPRECATED float_denorm_style
> {
> /// Indeterminate at compile time whether denormalized values are
> allowed.
> - denorm_indeterminate = -1,
> + denorm_indeterminate _GLIBCXX23_DEPRECATED = -1,
> /// The type does not allow denormalized values.
> - denorm_absent = 0,
> + denorm_absent _GLIBCXX23_DEPRECATED = 0,
> /// The type allows denormalized values.
> - denorm_present = 1
> + denorm_present _GLIBCXX23_DEPRECATED = 1
> };
>
> /**
> @@ -275,10 +276,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
>
> /** See std::float_denorm_style for more information. */
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm =
> denorm_absent;
>
> /** True if loss of accuracy is detected as a denormalization loss,
> rather than as an inexact result. */
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> /** True if-and-only-if the type adheres to the IEC 559 standard, also
> @@ -431,8 +434,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR bool
> @@ -498,8 +503,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR
> @@ -566,8 +573,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR signed char
> @@ -637,8 +646,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR unsigned char
> @@ -709,8 +720,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR wchar_t
> @@ -773,8 +786,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR char8_t
> @@ -838,7 +853,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static constexpr bool has_infinity = false;
> static constexpr bool has_quiet_NaN = false;
> static constexpr bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static constexpr float_denorm_style has_denorm = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static constexpr bool has_denorm_loss = false;
>
> static constexpr char16_t
> @@ -899,7 +916,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static constexpr bool has_infinity = false;
> static constexpr bool has_quiet_NaN = false;
> static constexpr bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static constexpr float_denorm_style has_denorm = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static constexpr bool has_denorm_loss = false;
>
> static constexpr char32_t
> @@ -965,8 +984,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR short
> @@ -1034,8 +1055,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR unsigned short
> @@ -1105,8 +1128,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR int
> @@ -1174,8 +1199,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR unsigned int
> @@ -1244,8 +1271,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR long
> @@ -1313,8 +1342,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR unsigned long
> @@ -1386,8 +1417,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR long long
> @@ -1456,8 +1489,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR unsigned long long
> @@ -1525,8 +1560,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false; \
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> \
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false; \
> + _GLIBCXX23_DEPRECATED \
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm \
> = denorm_absent; \
> + _GLIBCXX23_DEPRECATED \
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false; \
> \
> static _GLIBCXX_CONSTEXPR TYPE \
> @@ -1594,8 +1631,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false; \
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
> \
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false; \
> + _GLIBCXX23_DEPRECATED \
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm \
> = denorm_absent; \
> + _GLIBCXX23_DEPRECATED \
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false; \
> \
> static _GLIBCXX_CONSTEXPR unsigned TYPE \
> @@ -1715,8 +1754,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity =
> __FLT_HAS_INFINITY__;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN =
> __FLT_HAS_QUIET_NAN__;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN =
> has_quiet_NaN;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = bool(__FLT_HAS_DENORM__) ? denorm_present : denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss
> = __glibcxx_float_has_denorm_loss;
>
> @@ -1790,8 +1831,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity =
> __DBL_HAS_INFINITY__;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN =
> __DBL_HAS_QUIET_NAN__;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN =
> has_quiet_NaN;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = bool(__DBL_HAS_DENORM__) ? denorm_present : denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss
> = __glibcxx_double_has_denorm_loss;
>
> @@ -1865,8 +1908,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> static _GLIBCXX_USE_CONSTEXPR bool has_infinity =
> __LDBL_HAS_INFINITY__;
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN =
> __LDBL_HAS_QUIET_NAN__;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN =
> has_quiet_NaN;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = bool(__LDBL_HAS_DENORM__) ? denorm_present : denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss
> = __glibcxx_long_double_has_denorm_loss;
>
> @@ -1958,9 +2003,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> = __glibcxx_concat3 (__FLT, BITSIZE, _HAS_QUIET_NAN__); \
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN \
> = has_quiet_NaN; \
> + _GLIBCXX23_DEPRECATED \
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm \
> = bool(__glibcxx_concat3 (__FLT, BITSIZE, _HAS_DENORM__)) \
> ? denorm_present : denorm_absent; \
> + _GLIBCXX23_DEPRECATED \
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false; \
> \
> static _GLIBCXX_CONSTEXPR _Float##BITSIZE
> \
> @@ -2057,8 +2104,10 @@ __glibcxx_float_n(128)
> static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN
> = __BFLT16_HAS_QUIET_NAN__;
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN =
> has_quiet_NaN;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = bool(__BFLT16_HAS_DENORM__) ? denorm_present : denorm_absent;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR __gnu_cxx::__bfloat16_t
> @@ -2157,8 +2206,10 @@ __glibcxx_float_n(128)
> #else
> static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
> #endif
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
> = denorm_present;
> + _GLIBCXX23_DEPRECATED
> static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
>
> static _GLIBCXX_CONSTEXPR __float128
> diff --git
> a/libstdc++-v3/testsuite/18_support/numeric_limits/char16_32_t.cc
> b/libstdc++-v3/testsuite/18_support/numeric_limits/char16_32_t.cc
> index 2c8712c861cd..8bedf48ceb4a 100644
> --- a/libstdc++-v3/testsuite/18_support/numeric_limits/char16_32_t.cc
> +++ b/libstdc++-v3/testsuite/18_support/numeric_limits/char16_32_t.cc
> @@ -66,6 +66,9 @@ template<typename T, typename R>
> VERIFY( char_type::round_style == impl_type::round_style );
> }
>
> +// { dg-warning "has_denorm' is deprecated" "" { target c++23 } 55 }
> +// { dg-warning "has_denorm_loss' is deprecated" "" { target c++23 } 56 }
> +
> int main()
> {
> do_test<char16_t, std::uint_least16_t>();
> diff --git a/libstdc++-v3/testsuite/18_support/numeric_limits/char8_t.cc
> b/libstdc++-v3/testsuite/18_support/numeric_limits/char8_t.cc
> index e23dbb7adbf6..a114860610e8 100644
> --- a/libstdc++-v3/testsuite/18_support/numeric_limits/char8_t.cc
> +++ b/libstdc++-v3/testsuite/18_support/numeric_limits/char8_t.cc
> @@ -63,6 +63,9 @@ template<typename T, typename R>
> VERIFY( char_type::round_style == impl_type::round_style );
> }
>
> +// { dg-warning "has_denorm' is deprecated" "" { target c++23 } 52 }
> +// { dg-warning "has_denorm_loss' is deprecated" "" { target c++23 } 53 }
> +
> int main()
> {
> do_test<char8_t, unsigned char>();
> diff --git
> a/libstdc++-v3/testsuite/18_support/numeric_limits/denorm_min.cc
> b/libstdc++-v3/testsuite/18_support/numeric_limits/denorm_min.cc
> index b508d082b8e7..d4113ebf3d8d 100644
> --- a/libstdc++-v3/testsuite/18_support/numeric_limits/denorm_min.cc
> +++ b/libstdc++-v3/testsuite/18_support/numeric_limits/denorm_min.cc
> @@ -43,6 +43,8 @@ test_denorm_min()
>
> VERIFY (test);
> }
> +// { dg-warning "has_denorm' is deprecated" "" { target c++23 } 36 }
> +// { dg-warning "denorm_present' is deprecated" "" { target c++23 } 36 }
>
> int main()
> {
> diff --git a/libstdc++-v3/testsuite/18_support/numeric_limits/dr559.cc
> b/libstdc++-v3/testsuite/18_support/numeric_limits/dr559.cc
> index 88c0ca505f28..a329b80fc8e5 100644
> --- a/libstdc++-v3/testsuite/18_support/numeric_limits/dr559.cc
> +++ b/libstdc++-v3/testsuite/18_support/numeric_limits/dr559.cc
> @@ -65,6 +65,8 @@ template<typename T>
> VERIFY( cv_limits::tinyness_before == limits::tinyness_before );
> VERIFY( cv_limits::round_style == limits::round_style );
> }
> +// { dg-warning "has_denorm' is deprecated" "" { target c++23 } 52 }
> +// { dg-warning "has_denorm_loss' is deprecated" "" { target c++23 } 53 }
>
> template<typename T>
> void
> diff --git
> a/libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_data.cc
> b/libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_data.cc
> index 43985b5b7348..5cd53b35f5ed 100644
> ---
> a/libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_data.cc
> +++
> b/libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_data.cc
> @@ -88,6 +88,9 @@ namespace __gnu_test
> }
> };
> }
> +// { dg-warning "float_denorm_style' is deprecated" "" { target c++23 }
> 67 }
> +// { dg-warning "has_denorm' is deprecated" "" { target c++23 } 68 }
> +// { dg-warning "has_denorm_loss' is deprecated" "" { target c++23 } 70 }
>
> int main()
> {
> diff --git
> a/libstdc++-v3/testsuite/18_support/numeric_limits/specialization_default_values.cc
> b/libstdc++-v3/testsuite/18_support/numeric_limits/specialization_default_values.cc
> index 1bff0ad7f4d6..63a42bee0e15 100644
> ---
> a/libstdc++-v3/testsuite/18_support/numeric_limits/specialization_default_values.cc
> +++
> b/libstdc++-v3/testsuite/18_support/numeric_limits/specialization_default_values.cc
> @@ -78,6 +78,8 @@ void test01()
> VERIFY( !obj.tinyness_before );
> VERIFY( obj.round_style == std::round_toward_zero );
> }
> +// { dg-warning "has_denorm' is deprecated" "" { target c++23 } 68 }
> +// { dg-warning "has_denorm_loss' is deprecated" "" { target c++23 } 69 }
>
> // test linkage of the generic bits
> template struct std::numeric_limits<B>;
> 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 af53718a95b3..d200554cbd16 100644
> --- a/libstdc++-v3/testsuite/std/ranges/iota/max_size_type.cc
> +++ b/libstdc++-v3/testsuite/std/ranges/iota/max_size_type.cc
> @@ -428,6 +428,8 @@ constexpr bool
> verify_numeric_limits_values_not_meaningful_for = true
> && (numeric_limits<integer_class>::quiet_NaN() == 0)
> && (numeric_limits<integer_class>::signaling_NaN() == 0);
>
> +// { 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>);
>
> --
> 2.54.0
>
>