From: Alejandro Colomar <alx.manpages@gmail.com>
To: Joseph Myers <joseph@codesourcery.com>, libc-alpha@sourceware.org
Subject: Re: C2x strtol binary constant handling
Date: Thu, 15 Dec 2022 13:25:26 +0100 [thread overview]
Message-ID: <4001418e-e9cb-af7e-047c-3731dd20574c@gmail.com> (raw)
In-Reply-To: <9dd1d581-2684-43cc-3d44-3d866b226c20@codesourcery.com>
[-- Attachment #1.1: Type: text/plain, Size: 115961 bytes --]
Hi Joseph,
On 12/15/22 02:37, Joseph Myers wrote:
> C2x adds binary integer constants starting with 0b or 0B, and supports
> those constants in strtol-family functions when the base passed is 0
> or 2. Implement that strtol support for glibc.
>
> As discussed at
> <https://sourceware.org/pipermail/libc-alpha/2020-December/120414.html>,
> this is incompatible with previous C standard versions, in that such
> an input string starting with 0b or 0B was previously required to be
> parsed as 0 (with the rest of the string unprocessed). Thus, as
> proposed there, this patch adds 20 new __isoc23_* functions with
> appropriate header redirection support. This patch does *not* do
> anything about scanf %i (which will need 12 new functions per long
> double variant, so 12, 24 or 36 depending on the glibc configuration),
> instead leaving that for a future patch. The function names would
> remain as __isoc23_* even if C2x ends up published in 2024 rather than
> 2023.
>
> Making this change leads to the question of what should happen to
> internal uses of these functions in glibc and its tests. The header
> redirection (which applies for _GNU_SOURCE or any other feature test
> macros enabling C2x features) has the effect of redirecting internal
> uses but without those uses then ending up at a hidden alias (see the
> comment in include/stdio.h about interaction with libc_hidden_proto).
> It seems desirable for the default for internal uses to be the same
> versions used by normal code using _GNU_SOURCE, so rather than doing
> anything to disable that redirection, similar macro definitions to
> those in include/stdio.h are added to the include/ headers for the new
> functions.
The changes of atoi->strtol seem to be severable from this patch into a
pre-patch, since they have little to do with base-2 changes. I'd separate the
patches.
Cheers,
Alex
>
> In one case, this does not suffice to avoid a localplt test failure:
> the atoi inline function is defined in the public stdlib.h header
> before the macro-based redirections in the include/ header can take
> effect, resulting in localplt test failures where atoi is used in libc
> (the redirection to __isoc23_strtol from the public header takes
> effect, not the macro-based on from the include/ header, and so there
> is no redirection to a hidden symbol).
>
> atoi has undefined behavior on out-of-range input, which certainly
> makes its use questionable in argp-help.c (shared with gnulib, so
> shouldn't depend on glibc implementation details, and processing
> user-provided input), and maybe also in argp-parse.c (I'm not sure
> what that code in argp-parse.c is meant to be used for), so I changed
> those places to use strtol instead, so avoiding that undefined
> behavior as well as avoiding the localplt test failure. I also
> changed inet/rexec.c and resolv/res_init.c similarly to use strtol to
> avoid such localplt failures, although given those files (in those
> versions) are only used in glibc it's not problematic for them to rely
> on the specific behavior of glibc's atoi on out-of-range input in the
> same way it's problematic for gnulib code to do so.
>
> Given that the default for uses in glibc is for the redirections to
> apply, the next question is whether the C2x semantics are correct for
> all those uses. Uses with the base fixed to 10, 16 or any other value
> other than 0 or 2 can be ignored. I think this leaves the following
> internal uses to consider (an important consideration for review of
> this patch will be both whether this list is complete and whether my
> conclusions on all entries in it are correct):
>
> benchtests/bench-malloc-simple.c
> benchtests/bench-string.h
> elf/sotruss-lib.c
> math/libm-test-support.c
> nptl/perf.c
> nscd/nscd_conf.c
> nss/nss_files/files-parse.c
> posix/tst-fnmatch.c
> posix/wordexp.c
> resolv/inet_addr.c
> rt/tst-mqueue7.c
> soft-fp/testit.c
> stdlib/fmtmsg.c
> support/support_test_main.c
> support/test-container.c
> sysdeps/pthread/tst-mutex10.c
>
> I think all of these places are OK with the new semantics, except for
> resolv/inet_addr.c, where the POSIX semantics of inet_addr do not
> allow for binary constants; thus, I changed that file (to use
> __strtoul_internal, whose semantics are unchanged) and added a test
> for this case. In the case of posix/wordexp.c I think accepting
> binary constants is OK since POSIX explicitly allows additional forms
> of shell arithmetic expressions, and in stdlib/fmtmsg.c SEV_LEVEL is
> not in POSIX so again I think accepting binary constants is OK.
>
> Functions such as __strtol_internal, which are only exported for
> compatibility with old binaries from when those were used in inline
> functions in headers, have unchanged semantics; the __*_l_internal
> versions (purely internal to libc and not exported) have a new
> argument to specify whether to accept binary constants.
>
> As well as for the standard functions, the header redirection also
> applies to the *_l versions (GNU extensions), and to legacy functions
> such as strtoq, to avoid confusing inconsistency (the *q functions
> redirect to __isoc23_*ll rather than needing their own __isoc23_*
> entry points). For the functions that are only declared with
> _GNU_SOURCE, this means the old versions are no longer available for
> normal user programs at all. An internal __GLIBC_USE_C2X_STRTOL macro
> is used to control the redirections in the headers, and cases in glibc
> that wish to avoid the redirections - the function implementations
> themselves and the tests of the old versions of the GNU functions -
> then undefine and redefine that macro to allow the old versions to be
> accessed. (There would of course be greater complexity should we wish
> to make any of the old versions into compat symbols / avoid them being
> defined at all for new glibc ABIs.)
>
> strtol_l.c has some similarity to strtol.c in gnulib, but has already
> diverged some way (and isn't listed at all at
> https://sourceware.org/glibc/wiki/SharedSourceFiles unlike strtoll.c
> and strtoul.c); I haven't made any attempts at gnulib compatibility in
> the changes to that file.
>
> I note incidentally that inttypes.h and wchar.h are missing the
> __nonnull present on declarations of this family of functions in
> stdlib.h; I didn't make any changes in that regard for the new
> declarations added.
>
> Tested for x86_64 and x86.
>
> diff --git a/NEWS b/NEWS
> index a10bb08fb0..75b69169b6 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -14,6 +14,13 @@ Major new features:
> configured on the current host i.e. as-if you had not passed
> AI_ADDRCONFIG to getaddrinfo calls.
>
> +* When C2X features are enabled and the base argument is 0 or 2, the
> + following functions support binary integers prefixed by 0b or 0B as
> + input: strtol, strtoll, strtoul, strtoull, strtol_l, strtoll_l,
> + strtoul_l, strtoull_l, strtoimax, strtoumax, strtoq, strtouq, wcstol,
> + wcstoll, wcstoul, wcstoull, wcstol_l, wcstoll_l, wcstoul_l,
> + wcstoull_l, wcstoimax, wcstoumax, wcstoq, wcstouq.
> +
> Deprecated and removed features, and other changes affecting compatibility:
>
> * The dynamic linker no longer loads shared objects from the "tls"
> diff --git a/argp/argp-help.c b/argp/argp-help.c
> index 90a2795cef..328b981374 100644
> --- a/argp/argp-help.c
> +++ b/argp/argp-help.c
> @@ -210,7 +210,7 @@ fill_in_uparams (const struct argp_state *state)
> }
> else if (isdigit ((unsigned char) *arg))
> {
> - val = atoi (arg);
> + val = strtol (arg, NULL, 10);
> while (isdigit ((unsigned char) *arg))
> arg++;
> SKIPWS (arg);
> diff --git a/argp/argp-parse.c b/argp/argp-parse.c
> index 68dc45417b..1533b43aaf 100644
> --- a/argp/argp-parse.c
> +++ b/argp/argp-parse.c
> @@ -147,7 +147,7 @@ argp_default_parser (int key, char *arg, struct argp_state *state)
> break;
>
> case OPT_HANG:
> - _argp_hang = atoi (arg ? arg : "3600");
> + _argp_hang = arg ? strtol (arg, NULL, 10) : 3600;
> while (_argp_hang-- > 0)
> __sleep (1);
> break;
> diff --git a/include/features.h b/include/features.h
> index 123de9fd47..378608e626 100644
> --- a/include/features.h
> +++ b/include/features.h
> @@ -150,6 +150,7 @@
> #undef __GLIBC_USE_ISOC2X
> #undef __GLIBC_USE_DEPRECATED_GETS
> #undef __GLIBC_USE_DEPRECATED_SCANF
> +#undef __GLIBC_USE_C2X_STRTOL
>
> /* Suppress kernel-name space pollution unless user expressedly asks
> for it. */
> @@ -463,6 +464,17 @@
> # define __GLIBC_USE_DEPRECATED_SCANF 0
> #endif
>
> +/* ISO C2X added support for a 0b or 0B prefix on binary constants as
> + inputs to strtol-family functions (base 0 or 2). This macro is
> + used to condition redirection in headers to allow that redirection
> + to be disabled when building those functions, despite _GNU_SOURCE
> + being defined. */
> +#if __GLIBC_USE (ISOC2X)
> +# define __GLIBC_USE_C2X_STRTOL 1
> +#else
> +# define __GLIBC_USE_C2X_STRTOL 0
> +#endif
> +
> /* Get definitions of __STDC_* predefined macros, if the compiler has
> not preincluded this header automatically. */
> #include <stdc-predef.h>
> diff --git a/include/stdlib.h b/include/stdlib.h
> index db51f4a4f6..92d64ca12d 100644
> --- a/include/stdlib.h
> +++ b/include/stdlib.h
> @@ -35,6 +35,45 @@ libc_hidden_proto (__strtod_l)
> libc_hidden_proto (__strtof_l)
> libc_hidden_proto (__strtold_l)
>
> +extern __typeof (strtol) __isoc23_strtol __attribute_copy__ (strtol);
> +extern __typeof (strtoul) __isoc23_strtoul __attribute_copy__ (strtoul);
> +extern __typeof (strtoll) __isoc23_strtoll __attribute_copy__ (strtoll);
> +extern __typeof (strtoull) __isoc23_strtoull __attribute_copy__ (strtoull);
> +extern __typeof (strtol_l) __isoc23_strtol_l __attribute_copy__ (strtol_l);
> +extern __typeof (strtoul_l) __isoc23_strtoul_l __attribute_copy__ (strtoul_l);
> +extern __typeof (strtoll_l) __isoc23_strtoll_l __attribute_copy__ (strtoll_l);
> +extern __typeof (strtoull_l) __isoc23_strtoull_l __attribute_copy__ (strtoull_l);
> +libc_hidden_proto (__isoc23_strtol)
> +libc_hidden_proto (__isoc23_strtoul)
> +libc_hidden_proto (__isoc23_strtoll)
> +libc_hidden_proto (__isoc23_strtoull)
> +libc_hidden_proto (__isoc23_strtol_l)
> +libc_hidden_proto (__isoc23_strtoul_l)
> +libc_hidden_proto (__isoc23_strtoll_l)
> +libc_hidden_proto (__isoc23_strtoull_l)
> +
> +#if __GLIBC_USE (C2X_STRTOL)
> +/* Redirect internal uses of these functions to the C2X versions; the
> + redirection in the installed header does not work with
> + libc_hidden_proto. */
> +# undef strtol
> +# define strtol __isoc23_strtol
> +# undef strtoul
> +# define strtoul __isoc23_strtoul
> +# undef strtoll
> +# define strtoll __isoc23_strtoll
> +# undef strtoull
> +# define strtoull __isoc23_strtoull
> +# undef strtol_l
> +# define strtol_l __isoc23_strtol_l
> +# undef strtoul_l
> +# define strtoul_l __isoc23_strtoul_l
> +# undef strtoll_l
> +# define strtoll_l __isoc23_strtoll_l
> +# undef strtoull_l
> +# define strtoull_l __isoc23_strtoull_l
> +#endif
> +
> libc_hidden_proto (exit)
> libc_hidden_proto (abort)
> libc_hidden_proto (getenv)
> @@ -202,23 +241,25 @@ extern long double ____strtold_l_internal (const char *__restrict __nptr,
> extern long int ____strtol_l_internal (const char *__restrict __nptr,
> char **__restrict __endptr,
> int __base, int __group,
> - locale_t __loc);
> + int __bin_cst, locale_t __loc);
> extern unsigned long int ____strtoul_l_internal (const char *
> __restrict __nptr,
> char **__restrict __endptr,
> int __base, int __group,
> + int __bin_cst,
> locale_t __loc);
> __extension__
> extern long long int ____strtoll_l_internal (const char *__restrict __nptr,
> char **__restrict __endptr,
> int __base, int __group,
> - locale_t __loc);
> + int __bin_cst, locale_t __loc);
> __extension__
> extern unsigned long long int ____strtoull_l_internal (const char *
> __restrict __nptr,
> char **
> __restrict __endptr,
> int __base, int __group,
> + int __bin_cst,
> locale_t __loc);
>
> libc_hidden_proto (____strtof_l_internal)
> diff --git a/include/wchar.h b/include/wchar.h
> index db83297bca..5fa821ac3f 100644
> --- a/include/wchar.h
> +++ b/include/wchar.h
> @@ -34,6 +34,45 @@ libc_hidden_proto (__wcstof_l)
> libc_hidden_proto (__wcstold_l)
> libc_hidden_proto (__wcsftime_l)
>
> +extern __typeof (wcstol) __isoc23_wcstol __attribute_copy__ (wcstol);
> +extern __typeof (wcstoul) __isoc23_wcstoul __attribute_copy__ (wcstoul);
> +extern __typeof (wcstoll) __isoc23_wcstoll __attribute_copy__ (wcstoll);
> +extern __typeof (wcstoull) __isoc23_wcstoull __attribute_copy__ (wcstoull);
> +extern __typeof (wcstol_l) __isoc23_wcstol_l __attribute_copy__ (wcstol_l);
> +extern __typeof (wcstoul_l) __isoc23_wcstoul_l __attribute_copy__ (wcstoul_l);
> +extern __typeof (wcstoll_l) __isoc23_wcstoll_l __attribute_copy__ (wcstoll_l);
> +extern __typeof (wcstoull_l) __isoc23_wcstoull_l __attribute_copy__ (wcstoull_l);
> +libc_hidden_proto (__isoc23_wcstol)
> +libc_hidden_proto (__isoc23_wcstoul)
> +libc_hidden_proto (__isoc23_wcstoll)
> +libc_hidden_proto (__isoc23_wcstoull)
> +libc_hidden_proto (__isoc23_wcstol_l)
> +libc_hidden_proto (__isoc23_wcstoul_l)
> +libc_hidden_proto (__isoc23_wcstoll_l)
> +libc_hidden_proto (__isoc23_wcstoull_l)
> +
> +#if __GLIBC_USE (C2X_STRTOL)
> +/* Redirect internal uses of these functions to the C2X versions; the
> + redirection in the installed header does not work with
> + libc_hidden_proto. */
> +# undef wcstol
> +# define wcstol __isoc23_wcstol
> +# undef wcstoul
> +# define wcstoul __isoc23_wcstoul
> +# undef wcstoll
> +# define wcstoll __isoc23_wcstoll
> +# undef wcstoull
> +# define wcstoull __isoc23_wcstoull
> +# undef wcstol_l
> +# define wcstol_l __isoc23_wcstol_l
> +# undef wcstoul_l
> +# define wcstoul_l __isoc23_wcstoul_l
> +# undef wcstoll_l
> +# define wcstoll_l __isoc23_wcstoll_l
> +# undef wcstoull_l
> +# define wcstoull_l __isoc23_wcstoull_l
> +#endif
> +
>
> extern double __wcstod_internal (const wchar_t *__restrict __nptr,
> wchar_t **__restrict __endptr, int __group)
> @@ -63,7 +102,7 @@ extern unsigned long long int __wcstoull_internal (const wchar_t *
> int __group) __THROW;
> extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
> wchar_t **, int, int,
> - locale_t);
> + int, locale_t);
> libc_hidden_proto (__wcstof_internal)
> libc_hidden_proto (__wcstod_internal)
> libc_hidden_proto (__wcstold_internal)
> @@ -86,17 +125,17 @@ extern double ____wcstod_l_internal (const wchar_t *, wchar_t **, int,
> extern long double ____wcstold_l_internal (const wchar_t *, wchar_t **,
> int, locale_t) attribute_hidden;
> extern long int ____wcstol_l_internal (const wchar_t *, wchar_t **, int,
> - int, locale_t) attribute_hidden;
> + int, int, locale_t) attribute_hidden;
> extern unsigned long int ____wcstoul_l_internal (const wchar_t *,
> wchar_t **,
> - int, int, locale_t)
> + int, int, int, locale_t)
> attribute_hidden;
> extern long long int ____wcstoll_l_internal (const wchar_t *, wchar_t **,
> - int, int, locale_t)
> + int, int, int, locale_t)
> attribute_hidden;
> extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
> wchar_t **, int, int,
> - locale_t)
> + int, locale_t)
> attribute_hidden;
>
> #if __HAVE_DISTINCT_FLOAT128
> diff --git a/inet/inet6_scopeid_pton.c b/inet/inet6_scopeid_pton.c
> index 13d3eabdc1..8000963364 100644
> --- a/inet/inet6_scopeid_pton.c
> +++ b/inet/inet6_scopeid_pton.c
> @@ -49,7 +49,7 @@ __inet6_scopeid_pton (const struct in6_addr *address, const char *scope,
> char *end;
> unsigned long long number
> = ____strtoull_l_internal (scope, &end, /*base */ 10, /* group */ 0,
> - _nl_C_locobj_ptr);
> + /* bin_cst */ 0, _nl_C_locobj_ptr);
> if (*end == '\0' && number <= UINT32_MAX)
> {
> *result = number;
> diff --git a/inet/rexec.c b/inet/rexec.c
> index 064e979d68..c647b7ac34 100644
> --- a/inet/rexec.c
> +++ b/inet/rexec.c
> @@ -134,7 +134,7 @@ retry:
> if (!getnameinfo(&sa2.sa, sa2len,
> NULL, 0, servbuff, sizeof(servbuff),
> NI_NUMERICSERV))
> - port = atoi(servbuff);
> + port = strtol(servbuff, NULL, 10);
> (void) sprintf(num, "%u", port);
> (void) __write(s, num, strlen(num)+1);
> { socklen_t len = sizeof (from);
> diff --git a/locale/Versions b/locale/Versions
> index 72119349c1..fe525c94a6 100644
> --- a/locale/Versions
> +++ b/locale/Versions
> @@ -66,6 +66,12 @@ libc {
> wcstoll_l; wcstoul_l; wcstoull_l; wcsxfrm_l; wctype_l;
> wctrans_l; nl_langinfo_l;
> }
> + GLIBC_2.37 {
> + __isoc23_strtol_l; __isoc23_strtoll_l;
> + __isoc23_strtoul_l; __isoc23_strtoull_l;
> + __isoc23_wcstol_l; __isoc23_wcstoll_l;
> + __isoc23_wcstoul_l; __isoc23_wcstoull_l;
> + }
> GLIBC_PRIVATE {
> # global variables
> __collate_element_hash; __collate_element_strings;
> diff --git a/manual/arith.texi b/manual/arith.texi
> index edb9cfdafb..002621f11e 100644
> --- a/manual/arith.texi
> +++ b/manual/arith.texi
> @@ -2656,12 +2656,15 @@ A nonempty sequence of digits in the radix specified by @var{base}.
>
> If @var{base} is zero, decimal radix is assumed unless the series of
> digits begins with @samp{0} (specifying octal radix), or @samp{0x} or
> -@samp{0X} (specifying hexadecimal radix); in other words, the same
> -syntax used for integer constants in C.
> +@samp{0X} (specifying hexadecimal radix), or @samp{0b} or @samp{0B}
> +(specifying binary radix; only supported when C2X features are
> +enabled); in other words, the same syntax used for integer constants in C.
>
> Otherwise @var{base} must have a value between @code{2} and @code{36}.
> If @var{base} is @code{16}, the digits may optionally be preceded by
> -@samp{0x} or @samp{0X}. If base has no legal value the value returned
> +@samp{0x} or @samp{0X}. If @var{base} is @code{2}, and C2X features
> +are enabled, the digits may optionally be preceded by
> +@samp{0b} or @samp{0B}. If base has no legal value the value returned
> is @code{0l} and the global variable @code{errno} is set to @code{EINVAL}.
>
> @item
> diff --git a/resolv/Makefile b/resolv/Makefile
> index d9d887a0d0..6b58877b74 100644
> --- a/resolv/Makefile
> +++ b/resolv/Makefile
> @@ -105,6 +105,7 @@ tests += \
> tst-resolv-res_init-multi \
> tst-resolv-search \
> tst-resolv-trailing \
> + tst-inet_addr-binary \
>
> # This test calls __res_context_send directly, which is not exported
> # from libresolv.
> diff --git a/resolv/inet_addr.c b/resolv/inet_addr.c
> index 8059a23ec9..e737f5bae8 100644
> --- a/resolv/inet_addr.c
> +++ b/resolv/inet_addr.c
> @@ -130,7 +130,7 @@ inet_aton_end (const char *cp, struct in_addr *addr, const char **endp)
> goto ret_0;
> {
> char *endp;
> - unsigned long ul = strtoul (cp, &endp, 0);
> + unsigned long ul = __strtoul_internal (cp, &endp, 0, 0);
> if (ul == ULONG_MAX && errno == ERANGE)
> goto ret_0;
> if (ul > 0xfffffffful)
> diff --git a/resolv/res_init.c b/resolv/res_init.c
> index 2c0bea658e..61b958a437 100644
> --- a/resolv/res_init.c
> +++ b/resolv/res_init.c
> @@ -654,7 +654,7 @@ res_setoptions (struct resolv_conf_parser *parser, const char *options)
> /* Search for and process individual options. */
> if (!strncmp (cp, "ndots:", sizeof ("ndots:") - 1))
> {
> - int i = atoi (cp + sizeof ("ndots:") - 1);
> + int i = strtol (cp + sizeof ("ndots:") - 1, NULL, 10);
> if (i <= RES_MAXNDOTS)
> parser->template.ndots = i;
> else
> @@ -662,7 +662,7 @@ res_setoptions (struct resolv_conf_parser *parser, const char *options)
> }
> else if (!strncmp (cp, "timeout:", sizeof ("timeout:") - 1))
> {
> - int i = atoi (cp + sizeof ("timeout:") - 1);
> + int i = strtol (cp + sizeof ("timeout:") - 1, NULL, 10);
> if (i <= RES_MAXRETRANS)
> parser->template.retrans = i;
> else
> @@ -670,7 +670,7 @@ res_setoptions (struct resolv_conf_parser *parser, const char *options)
> }
> else if (!strncmp (cp, "attempts:", sizeof ("attempts:") - 1))
> {
> - int i = atoi (cp + sizeof ("attempts:") - 1);
> + int i = strtol (cp + sizeof ("attempts:") - 1, NULL, 10);
> if (i <= RES_MAXRETRY)
> parser->template.retry = i;
> else
> diff --git a/resolv/tst-inet_addr-binary.c b/resolv/tst-inet_addr-binary.c
> new file mode 100644
> index 0000000000..945d836359
> --- /dev/null
> +++ b/resolv/tst-inet_addr-binary.c
> @@ -0,0 +1,30 @@
> +/* Test inet_addr does not accept C2X binary constants.
> + Copyright (C) 2022 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#include <arpa/inet.h>
> +
> +#include <support/check.h>
> +
> +static int
> +do_test (void)
> +{
> + TEST_COMPARE (inet_addr ("0b101"), (in_addr_t) -1);
> + return 0;
> +}
> +
> +#include <support/test-driver.c>
> diff --git a/stdlib/Makefile b/stdlib/Makefile
> index 417d525d8e..cdef153ff5 100644
> --- a/stdlib/Makefile
> +++ b/stdlib/Makefile
> @@ -243,6 +243,10 @@ tests := \
> tst-width \
> tst-width-stdint \
> tst-xpg-basename \
> + tst-strtol-binary-c11 \
> + tst-strtol-binary-c2x \
> + tst-strtol-binary-gnu11 \
> + tst-strtol-binary-gnu2x \
> # tests
>
> tests-internal := \
> @@ -394,6 +398,14 @@ CFLAGS-tst-makecontext2.c += $(stack-align-test-flags)
>
> CFLAGS-testmb.c += -D_FORTIFY_SOURCE=2 -Wall -Werror
>
> +# Some versions of GCC supported for building glibc do not support -std=c2x
> +# or -std=gnu2x, so the tests for those versions use -std=c11 and -std=gnu11
> +# and then _ISOC2X_SOURCE is defined in the test as needed.
> +CFLAGS-tst-strtol-binary-c11.c += -std=c11
> +CFLAGS-tst-strtol-binary-c2x.c += -std=c11
> +CFLAGS-tst-strtol-binary-c11.c += -std=gnu11
> +CFLAGS-tst-strtol-binary-c2x.c += -std=gnu11
> +
>
> # Run a test on the header files we use.
> tests-special += $(objpfx)isomac.out
> diff --git a/stdlib/Versions b/stdlib/Versions
> index ebc43263d6..5a856c7f8f 100644
> --- a/stdlib/Versions
> +++ b/stdlib/Versions
> @@ -142,6 +142,8 @@ libc {
> arc4random_uniform;
> }
> GLIBC_2.37 {
> + __isoc23_strtol; __isoc23_strtoll; __isoc23_strtoul; __isoc23_strtoull;
> + __isoc23_strtoimax; __isoc23_strtoumax;
> }
> GLIBC_PRIVATE {
> # functions which have an additional interface since they are
> diff --git a/stdlib/inttypes.h b/stdlib/inttypes.h
> index d550769f2a..26dbc77b1d 100644
> --- a/stdlib/inttypes.h
> +++ b/stdlib/inttypes.h
> @@ -311,6 +311,46 @@ extern uintmax_t wcstoumax (const __gwchar_t *__restrict __nptr,
> __gwchar_t ** __restrict __endptr, int __base)
> __THROW;
>
> +/* Versions of the above functions that handle '0b' and '0B' prefixes
> + in base 0 or 2. */
> +#if __GLIBC_USE (C2X_STRTOL)
> +# ifdef __REDIRECT
> +extern intmax_t __REDIRECT_NTH (strtoimax, (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base), __isoc23_strtoimax);
> +extern uintmax_t __REDIRECT_NTH (strtoumax, (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base), __isoc23_strtoumax);
> +extern intmax_t __REDIRECT_NTH (wcstoimax,
> + (const __gwchar_t *__restrict __nptr,
> + __gwchar_t **__restrict __endptr, int __base),
> + __isoc23_wcstoimax);
> +extern uintmax_t __REDIRECT_NTH (wcstoumax,
> + (const __gwchar_t *__restrict __nptr,
> + __gwchar_t **__restrict __endptr, int __base),
> + __isoc23_wcstoumax);
> +# else
> +extern intmax_t __isoc23_strtoimax (const char *__restrict __nptr,
> + char **__restrict __endptr, int __base)
> + __THROW;
> +extern uintmax_t __isoc23_strtoumax (const char *__restrict __nptr,
> + char ** __restrict __endptr, int __base)
> + __THROW;
> +extern intmax_t __isoc23_wcstoimax (const __gwchar_t *__restrict __nptr,
> + __gwchar_t **__restrict __endptr,
> + int __base)
> + __THROW;
> +extern uintmax_t __isoc23_wcstoumax (const __gwchar_t *__restrict __nptr,
> + __gwchar_t ** __restrict __endptr,
> + int __base)
> + __THROW;
> +# define strtoimax __isoc23_strtoimax
> +# define strtoumax __isoc23_strtoumax
> +# define wcstoimax __isoc23_wcstoimax
> +# define wcstoumax __isoc23_wcstoumax
> +# endif
> +#endif
> +
> __END_DECLS
>
> #endif /* inttypes.h */
> diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h
> index 3a630a0ce8..58355beb56 100644
> --- a/stdlib/stdlib.h
> +++ b/stdlib/stdlib.h
> @@ -208,6 +208,71 @@ extern unsigned long long int strtoull (const char *__restrict __nptr,
> __THROW __nonnull ((1));
> #endif /* ISO C99 or use MISC. */
>
> +/* Versions of the above functions that handle '0b' and '0B' prefixes
> + in base 0 or 2. */
> +#if __GLIBC_USE (C2X_STRTOL)
> +# ifdef __REDIRECT
> +extern long int __REDIRECT_NTH (strtol, (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base), __isoc23_strtol)
> + __nonnull ((1));
> +extern unsigned long int __REDIRECT_NTH (strtoul,
> + (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base), __isoc23_strtoul)
> + __nonnull ((1));
> +# ifdef __USE_MISC
> +__extension__
> +extern long long int __REDIRECT_NTH (strtoq, (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base), __isoc23_strtoll)
> + __nonnull ((1));
> +__extension__
> +extern unsigned long long int __REDIRECT_NTH (strtouq,
> + (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base), __isoc23_strtoull)
> + __nonnull ((1));
> +# endif
> +__extension__
> +extern long long int __REDIRECT_NTH (strtoll, (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base), __isoc23_strtoll)
> + __nonnull ((1));
> +__extension__
> +extern unsigned long long int __REDIRECT_NTH (strtoull,
> + (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base), __isoc23_strtoull)
> + __nonnull ((1));
> +# else
> +extern long int __isoc23_strtol (const char *__restrict __nptr,
> + char **__restrict __endptr, int __base)
> + __THROW __nonnull ((1));
> +extern unsigned long int __isoc23_strtoul (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base)
> + __THROW __nonnull ((1));
> +__extension__
> +extern long long int __isoc23_strtoll (const char *__restrict __nptr,
> + char **__restrict __endptr, int __base)
> + __THROW __nonnull ((1));
> +__extension__
> +extern unsigned long long int __isoc23_strtoull (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base)
> + __THROW __nonnull ((1));
> +# define strtol __isoc23_strtol
> +# define strtoul __isoc23_strtoul
> +# ifdef __USE_MISC
> +# define strtoq __isoc23_strtoll
> +# define strtouq __isoc23_strtoull
> +# endif
> +# define strtoll __isoc23_strtoll
> +# define strtoull __isoc23_strtoull
> +# endif
> +#endif
> +
> /* Convert a floating-point number to a string. */
> #if __GLIBC_USE (IEC_60559_BFP_EXT_C2X)
> extern int strfromd (char *__dest, size_t __size, const char *__format,
> @@ -293,6 +358,60 @@ extern unsigned long long int strtoull_l (const char *__restrict __nptr,
> int __base, locale_t __loc)
> __THROW __nonnull ((1, 4));
>
> +/* Versions of the above functions that handle '0b' and '0B' prefixes
> + in base 0 or 2. */
> +# if __GLIBC_USE (C2X_STRTOL)
> +# ifdef __REDIRECT
> +extern long int __REDIRECT_NTH (strtol_l, (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base, locale_t __loc),
> + __isoc23_strtol_l)
> + __nonnull ((1, 4));
> +extern unsigned long int __REDIRECT_NTH (strtoul_l,
> + (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base, locale_t __loc),
> + __isoc23_strtoul_l)
> + __nonnull ((1, 4));
> +__extension__
> +extern long long int __REDIRECT_NTH (strtoll_l, (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base,
> + locale_t __loc),
> + __isoc23_strtoll_l)
> + __nonnull ((1, 4));
> +__extension__
> +extern unsigned long long int __REDIRECT_NTH (strtoull_l,
> + (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base, locale_t __loc),
> + __isoc23_strtoull_l)
> + __nonnull ((1, 4));
> +# else
> +extern long int __isoc23_strtol_l (const char *__restrict __nptr,
> + char **__restrict __endptr, int __base,
> + locale_t __loc) __THROW __nonnull ((1, 4));
> +extern unsigned long int __isoc23_strtoul_l (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base, locale_t __loc)
> + __THROW __nonnull ((1, 4));
> +__extension__
> +extern long long int __isoc23_strtoll_l (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base, locale_t __loc)
> + __THROW __nonnull ((1, 4));
> +__extension__
> +extern unsigned long long int __isoc23_strtoull_l (const char *__restrict __nptr,
> + char **__restrict __endptr,
> + int __base, locale_t __loc)
> + __THROW __nonnull ((1, 4));
> +# define strtol_l __isoc23_strtol_l
> +# define strtoul_l __isoc23_strtoul_l
> +# define strtoll_l __isoc23_strtoll_l
> +# define strtoull_l __isoc23_strtoull_l
> +# endif
> +# endif
> +
> extern double strtod_l (const char *__restrict __nptr,
> char **__restrict __endptr, locale_t __loc)
> __THROW __nonnull ((1, 3));
> diff --git a/stdlib/strtod_nan_narrow.h b/stdlib/strtod_nan_narrow.h
> index 3d4aac5497..d591e5994e 100644
> --- a/stdlib/strtod_nan_narrow.h
> +++ b/stdlib/strtod_nan_narrow.h
> @@ -19,4 +19,4 @@
> #define STRING_TYPE char
> #define L_(Ch) Ch
> #define STRTOULL(S, E, B) ____strtoull_l_internal ((S), (E), (B), 0, \
> - _nl_C_locobj_ptr)
> + 0, _nl_C_locobj_ptr)
> diff --git a/stdlib/strtod_nan_wide.h b/stdlib/strtod_nan_wide.h
> index c06e91afa2..48a324dd92 100644
> --- a/stdlib/strtod_nan_wide.h
> +++ b/stdlib/strtod_nan_wide.h
> @@ -19,4 +19,4 @@
> #define STRING_TYPE wchar_t
> #define L_(Ch) L##Ch
> #define STRTOULL(S, E, B) ____wcstoull_l_internal ((S), (E), (B), 0, \
> - _nl_C_locobj_ptr)
> + 0, _nl_C_locobj_ptr)
> diff --git a/stdlib/strtol.c b/stdlib/strtol.c
> index be7719f493..e9479a6a34 100644
> --- a/stdlib/strtol.c
> +++ b/stdlib/strtol.c
> @@ -16,6 +16,9 @@
> License along with the GNU C Library; if not, see
> <https://www.gnu.org/licenses/>. */
>
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
> #include <stdlib.h>
> #include <wchar.h>
> #include <locale/localeinfo.h>
> @@ -32,17 +35,21 @@
> # ifdef QUAD
> # define strtol wcstoull
> # define __strtol_l __wcstoull_l
> +# define __isoc23_strtol __isoc23_wcstoull
> # else
> # define strtol wcstoul
> # define __strtol_l __wcstoul_l
> +# define __isoc23_strtol __isoc23_wcstoul
> # endif
> # else
> # ifdef QUAD
> # define strtol strtoull
> # define __strtol_l __strtoull_l
> +# define __isoc23_strtol __isoc23_strtoull
> # else
> # define strtol strtoul
> # define __strtol_l __strtoul_l
> +# define __isoc23_strtol __isoc23_strtoul
> # endif
> # endif
> #else
> @@ -50,14 +57,17 @@
> # ifdef QUAD
> # define strtol wcstoll
> # define __strtol_l __wcstoll_l
> +# define __isoc23_strtol __isoc23_wcstoll
> # else
> # define strtol wcstol
> # define __strtol_l __wcstol_l
> +# define __isoc23_strtol __isoc23_wcstol
> # endif
> # else
> # ifdef QUAD
> # define strtol strtoll
> # define __strtol_l __strtoll_l
> +# define __isoc23_strtol __isoc23_strtoll
> # endif
> # endif
> #endif
> @@ -88,14 +98,15 @@
>
>
> extern INT INTERNAL (__strtol_l) (const STRING_TYPE *, STRING_TYPE **, int,
> - int, locale_t);
> + int, int, locale_t);
>
>
> INT
> INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
> int base, int group)
> {
> - return INTERNAL (__strtol_l) (nptr, endptr, base, group, _NL_CURRENT_LOCALE);
> + return INTERNAL (__strtol_l) (nptr, endptr, base, group, 0,
> + _NL_CURRENT_LOCALE);
> }
> libc_hidden_def (INTERNAL (strtol))
>
> @@ -103,7 +114,14 @@ libc_hidden_def (INTERNAL (strtol))
> INT
> __strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr, int base)
> {
> - return INTERNAL (__strtol_l) (nptr, endptr, base, 0, _NL_CURRENT_LOCALE);
> + return INTERNAL (__strtol_l) (nptr, endptr, base, 0, 0, _NL_CURRENT_LOCALE);
> }
> weak_alias (__strtol, strtol)
> libc_hidden_weak (strtol)
> +
> +INT
> +__isoc23_strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr, int base)
> +{
> + return INTERNAL (__strtol_l) (nptr, endptr, base, 0, 1, _NL_CURRENT_LOCALE);
> +}
> +libc_hidden_def (__isoc23_strtol)
> diff --git a/stdlib/strtol_l.c b/stdlib/strtol_l.c
> index 3e310e91fb..b652de9497 100644
> --- a/stdlib/strtol_l.c
> +++ b/stdlib/strtol_l.c
> @@ -16,6 +16,9 @@
> License along with the GNU C Library; if not, see
> <https://www.gnu.org/licenses/>. */
>
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
>
> #if HAVE_CONFIG_H
> # include <config.h>
> @@ -61,28 +64,36 @@
> # ifdef USE_WIDE_CHAR
> # ifdef QUAD
> # define strtol_l wcstoull_l
> +# define __isoc23_strtol_l __isoc23_wcstoull_l
> # else
> # define strtol_l wcstoul_l
> +# define __isoc23_strtol_l __isoc23_wcstoul_l
> # endif
> # else
> # ifdef QUAD
> # define strtol_l strtoull_l
> +# define __isoc23_strtol_l __isoc23_strtoull_l
> # else
> # define strtol_l strtoul_l
> +# define __isoc23_strtol_l __isoc23_strtoul_l
> # endif
> # endif
> #else
> # ifdef USE_WIDE_CHAR
> # ifdef QUAD
> # define strtol_l wcstoll_l
> +# define __isoc23_strtol_l __isoc23_wcstoll_l
> # else
> # define strtol_l wcstol_l
> +# define __isoc23_strtol_l __isoc23_wcstol_l
> # endif
> # else
> # ifdef QUAD
> # define strtol_l strtoll_l
> +# define __isoc23_strtol_l __isoc23_strtoll_l
> # else
> # define strtol_l strtol_l
> +# define __isoc23_strtol_l __isoc23_strtol_l
> # endif
> # endif
> #endif
> @@ -216,12 +227,14 @@ extern const unsigned char __strtol_ull_rem_tab[] attribute_hidden;
> If BASE is 0 the base is determined by the presence of a leading
> zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
> If BASE is < 2 or > 36, it is reset to 10.
> + If BIN_CST is nonzero, binary constants starting "0b" or "0B" are accepted
> + in base 0 and 2.
> If ENDPTR is not NULL, a pointer to the character after the last
> one converted is stored in *ENDPTR. */
>
> INT
> INTERNAL (__strtol_l) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
> - int base, int group, locale_t loc)
> + int base, int group, int bin_cst, locale_t loc)
> {
> int negative;
> unsigned LONG int cutoff;
> @@ -311,6 +324,11 @@ INTERNAL (__strtol_l) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
> s += 2;
> base = 16;
> }
> + else if (bin_cst && (base == 0 || base == 2) && TOUPPER (s[1]) == L_('B'))
> + {
> + s += 2;
> + base = 2;
> + }
> else if (base == 0)
> base = 8;
> }
> @@ -543,7 +561,15 @@ weak_function
> __strtol_l (const STRING_TYPE *nptr, STRING_TYPE **endptr,
> int base, locale_t loc)
> {
> - return INTERNAL (__strtol_l) (nptr, endptr, base, 0, loc);
> + return INTERNAL (__strtol_l) (nptr, endptr, base, 0, 0, loc);
> }
> libc_hidden_def (__strtol_l)
> weak_alias (__strtol_l, strtol_l)
> +
> +INT
> +__isoc23_strtol_l (const STRING_TYPE *nptr, STRING_TYPE **endptr,
> + int base, locale_t loc)
> +{
> + return INTERNAL (__strtol_l) (nptr, endptr, base, 0, 1, loc);
> +}
> +libc_hidden_def (__isoc23_strtol_l)
> diff --git a/stdlib/strtoll.c b/stdlib/strtoll.c
> index ad1bce12d6..684985243e 100644
> --- a/stdlib/strtoll.c
> +++ b/stdlib/strtoll.c
> @@ -31,4 +31,5 @@ compat_symbol (libc, __strtoll_internal, __strtoq_internal, GLIBC_2_0);
> # endif
> weak_alias (strtoll, strtoq)
> weak_alias (strtoll, strtoimax)
> +weak_alias (__isoc23_strtoll, __isoc23_strtoimax)
> #endif
> diff --git a/stdlib/strtoll_l.c b/stdlib/strtoll_l.c
> index 310497f523..2ca4e23146 100644
> --- a/stdlib/strtoll_l.c
> +++ b/stdlib/strtoll_l.c
> @@ -18,9 +18,12 @@
>
> #define QUAD 1
>
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
> #include <locale.h>
>
> extern long long int ____strtoll_l_internal (const char *, char **, int, int,
> - locale_t);
> + int, locale_t);
>
> #include <strtol_l.c>
> diff --git a/stdlib/strtoul_l.c b/stdlib/strtoul_l.c
> index 29c075d7eb..650972750f 100644
> --- a/stdlib/strtoul_l.c
> +++ b/stdlib/strtoul_l.c
> @@ -18,9 +18,12 @@
>
> #define UNSIGNED 1
>
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
> #include <locale.h>
>
> extern unsigned long int ____strtoul_l_internal (const char *, char **, int,
> - int, locale_t);
> + int, int, locale_t);
>
> #include "strtol_l.c"
> diff --git a/stdlib/strtoull.c b/stdlib/strtoull.c
> index 20e97a0a56..466524bcf8 100644
> --- a/stdlib/strtoull.c
> +++ b/stdlib/strtoull.c
> @@ -31,4 +31,5 @@ compat_symbol (libc, __strtoull_internal, __strtouq_internal, GLIBC_2_0);
> # endif
> weak_alias (strtoull, strtouq)
> weak_alias (strtoull, strtoumax)
> +weak_alias (__isoc23_strtoull, __isoc23_strtoumax)
> #endif
> diff --git a/stdlib/strtoull_l.c b/stdlib/strtoull_l.c
> index c680d629d3..3c57b0c092 100644
> --- a/stdlib/strtoull_l.c
> +++ b/stdlib/strtoull_l.c
> @@ -19,9 +19,13 @@
> #define QUAD 1
> #define UNSIGNED 1
>
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
> #include <locale.h>
>
> extern unsigned long long int ____strtoull_l_internal (const char *, char **,
> - int, int, locale_t);
> + int, int, int,
> + locale_t);
>
> #include <strtol_l.c>
> diff --git a/stdlib/tst-strtol-binary-c11.c b/stdlib/tst-strtol-binary-c11.c
> new file mode 100644
> index 0000000000..7dcd711e3b
> --- /dev/null
> +++ b/stdlib/tst-strtol-binary-c11.c
> @@ -0,0 +1,29 @@
> +/* Test strtol functions with C2X binary integers (narrow strings,
> + no extensions to C11).
> + Copyright (C) 2022 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#undef _GNU_SOURCE
> +
> +#define CHAR char
> +#define FNPFX strto
> +#define L_(C) C
> +#define TEST_C2X 0
> +#define TEST_Q 0
> +#define TEST_LOCALE 0
> +
> +#include <tst-strtol-binary-main.c>
> diff --git a/stdlib/tst-strtol-binary-c2x.c b/stdlib/tst-strtol-binary-c2x.c
> new file mode 100644
> index 0000000000..185193ea75
> --- /dev/null
> +++ b/stdlib/tst-strtol-binary-c2x.c
> @@ -0,0 +1,32 @@
> +/* Test strtol functions with C2X binary integers (narrow strings,
> + no extensions).
> + Copyright (C) 2022 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +/* Some versions of GCC supported for building glibc do not support
> + -std=c2x. */
> +#undef _GNU_SOURCE
> +#define _ISOC2X_SOURCE
> +
> +#define CHAR char
> +#define FNPFX strto
> +#define L_(C) C
> +#define TEST_C2X 1
> +#define TEST_Q 0
> +#define TEST_LOCALE 0
> +
> +#include <tst-strtol-binary-main.c>
> diff --git a/stdlib/tst-strtol-binary-gnu11.c b/stdlib/tst-strtol-binary-gnu11.c
> new file mode 100644
> index 0000000000..89575a5f8f
> --- /dev/null
> +++ b/stdlib/tst-strtol-binary-gnu11.c
> @@ -0,0 +1,34 @@
> +/* Test strtol functions with C2X binary integers (narrow strings, GNU
> + extensions, C2X strtol features disabled).
> + Copyright (C) 2022 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#include <features.h>
> +/* This file tests the old versions of GNU extension functions, which
> + are not normally available to new binaries because GNU extensions
> + normally imply C2X strtol features. */
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
> +
> +#define CHAR char
> +#define FNPFX strto
> +#define L_(C) C
> +#define TEST_C2X 0
> +#define TEST_Q 1
> +#define TEST_LOCALE 1
> +
> +#include <tst-strtol-binary-main.c>
> diff --git a/stdlib/tst-strtol-binary-gnu2x.c b/stdlib/tst-strtol-binary-gnu2x.c
> new file mode 100644
> index 0000000000..cad4dfb670
> --- /dev/null
> +++ b/stdlib/tst-strtol-binary-gnu2x.c
> @@ -0,0 +1,27 @@
> +/* Test strtol functions with C2X binary integers (narrow strings, GNU
> + extensions).
> + Copyright (C) 2022 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#define CHAR char
> +#define FNPFX strto
> +#define L_(C) C
> +#define TEST_C2X 1
> +#define TEST_Q 1
> +#define TEST_LOCALE 1
> +
> +#include <tst-strtol-binary-main.c>
> diff --git a/stdlib/tst-strtol-binary-main.c b/stdlib/tst-strtol-binary-main.c
> new file mode 100644
> index 0000000000..4b0ceed78d
> --- /dev/null
> +++ b/stdlib/tst-strtol-binary-main.c
> @@ -0,0 +1,123 @@
> +/* Test strtol functions with C2X binary integers.
> + Copyright (C) 2022 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#include <inttypes.h>
> +#include <locale.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <wchar.h>
> +
> +#include <support/check.h>
> +
> +#define CONCAT_(X, Y) X ## Y
> +#define CONCAT(X, Y) CONCAT_ (X, Y)
> +#define FNX(FN) CONCAT (FNPFX, FN)
> +
> +#define CHECK_RES(ARG, RES, EP, EXPECTED) \
> + do \
> + { \
> + if (TEST_C2X) \
> + { \
> + TEST_COMPARE ((RES), EXPECTED); \
> + TEST_COMPARE (*(EP), 0); \
> + } \
> + else \
> + { \
> + TEST_COMPARE ((RES), 0); \
> + TEST_VERIFY ((EP) == ((ARG)[0] == L_('-') \
> + ? (ARG) + 2 \
> + : (ARG) + 1)); \
> + } \
> + } \
> + while (0)
> +
> +static void
> +one_check (const CHAR *s, int expected)
> +{
> + CHAR *ep;
> + long int ret_l;
> + unsigned long int ret_ul;
> + long long int ret_ll;
> + unsigned long long int ret_ull;
> + ret_l = FNX (l) (s, &ep, 0);
> + CHECK_RES (s, ret_l, ep, (long int) expected);
> + ret_l = FNX (l) (s, &ep, 2);
> + CHECK_RES (s, ret_l, ep, (long int) expected);
> + ret_ul = FNX (ul) (s, &ep, 0);
> + CHECK_RES (s, ret_ul, ep, (unsigned long int) expected);
> + ret_ul = FNX (ul) (s, &ep, 2);
> + CHECK_RES (s, ret_ul, ep, (unsigned long int) expected);
> + ret_ll = FNX (ll) (s, &ep, 0);
> + CHECK_RES (s, ret_ll, ep, (long long int) expected);
> + ret_ll = FNX (ll) (s, &ep, 2);
> + CHECK_RES (s, ret_ll, ep, (long long int) expected);
> + ret_ull = FNX (ull) (s, &ep, 0);
> + CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> + ret_ull = FNX (ull) (s, &ep, 2);
> + CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> + ret_ll = FNX (imax) (s, &ep, 0);
> + CHECK_RES (s, ret_ll, ep, (long long int) expected);
> + ret_ll = FNX (imax) (s, &ep, 2);
> + CHECK_RES (s, ret_ll, ep, (long long int) expected);
> + ret_ull = FNX (umax) (s, &ep, 0);
> + CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> + ret_ull = FNX (umax) (s, &ep, 2);
> + CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> +#if TEST_Q
> + ret_ll = FNX (q) (s, &ep, 0);
> + CHECK_RES (s, ret_ll, ep, (long long int) expected);
> + ret_ll = FNX (q) (s, &ep, 2);
> + CHECK_RES (s, ret_ll, ep, (long long int) expected);
> + ret_ull = FNX (uq) (s, &ep, 0);
> + CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> + ret_ull = FNX (uq) (s, &ep, 2);
> + CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> +#endif
> +#if TEST_LOCALE
> + locale_t loc = newlocale (LC_NUMERIC_MASK, "C", (locale_t) 0);
> + TEST_VERIFY_EXIT (loc != (locale_t) 0);
> + ret_l = FNX (l_l) (s, &ep, 0, loc);
> + CHECK_RES (s, ret_l, ep, (long int) expected);
> + ret_l = FNX (l_l) (s, &ep, 2, loc);
> + CHECK_RES (s, ret_l, ep, (long int) expected);
> + ret_ul = FNX (ul_l) (s, &ep, 0, loc);
> + CHECK_RES (s, ret_ul, ep, (unsigned long int) expected);
> + ret_ul = FNX (ul_l) (s, &ep, 2, loc);
> + CHECK_RES (s, ret_ul, ep, (unsigned long int) expected);
> + ret_ll = FNX (ll_l) (s, &ep, 0, loc);
> + CHECK_RES (s, ret_ll, ep, (long long int) expected);
> + ret_ll = FNX (ll_l) (s, &ep, 2, loc);
> + CHECK_RES (s, ret_ll, ep, (long long int) expected);
> + ret_ull = FNX (ull_l) (s, &ep, 0, loc);
> + CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> + ret_ull = FNX (ull_l) (s, &ep, 2, loc);
> + CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> +#endif
> +}
> +
> +static int
> +do_test (void)
> +{
> + one_check (L_("0b101"), 5);
> + one_check (L_("0B101"), 5);
> + one_check (L_("-0b11111"), -31);
> + one_check (L_("-0B11111"), -31);
> + return 0;
> +}
> +
> +#include <support/test-driver.c>
> diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
> index 4e3200ef55..340d330352 100644
> --- a/sysdeps/mach/hurd/i386/libc.abilist
> +++ b/sysdeps/mach/hurd/i386/libc.abilist
> @@ -2294,6 +2294,26 @@ GLIBC_2.36 arc4random_buf F
> GLIBC_2.36 arc4random_uniform F
> GLIBC_2.36 c8rtomb F
> GLIBC_2.36 mbrtoc8 F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> index b66fadef40..0b7d5bfd0a 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> @@ -2633,3 +2633,23 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> index f918bb2d48..70f8f457f3 100644
> --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> @@ -2730,6 +2730,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.4 _IO_fprintf F
> GLIBC_2.4 _IO_printf F
> GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/libc.abilist
> index 093043a533..5ecb023dcf 100644
> --- a/sysdeps/unix/sysv/linux/arc/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arc/libc.abilist
> @@ -2394,3 +2394,23 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> index f28402fe03..84b380c8e5 100644
> --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> @@ -513,6 +513,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> GLIBC_2.4 _Exit F
> GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
> diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> index e2f56880ed..a32367ffb3 100644
> --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> @@ -510,6 +510,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> GLIBC_2.4 _Exit F
> GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
> diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
> index 319d92356e..915e490b43 100644
> --- a/sysdeps/unix/sysv/linux/csky/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
> @@ -2669,4 +2669,24 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> index 6450e17ebe..51241bae74 100644
> --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> @@ -2618,6 +2618,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
> index 0a24ec9afd..79f1435daa 100644
> --- a/sysdeps/unix/sysv/linux/i386/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
> @@ -2802,6 +2802,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> index 02c65b6482..d4ebdf48d3 100644
> --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> @@ -2568,6 +2568,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
> index 62faaf4c00..acc324b44e 100644
> --- a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
> @@ -2154,3 +2154,23 @@ GLIBC_2.36 wprintf F
> GLIBC_2.36 write F
> GLIBC_2.36 writev F
> GLIBC_2.36 wscanf F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> index 16243a7a92..7ecf9323e8 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> @@ -514,6 +514,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> GLIBC_2.4 _Exit F
> GLIBC_2.4 _IO_2_1_stderr_ D 0x98
> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> index 564a553b27..3ef3564853 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> @@ -2745,6 +2745,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> index e850f47b21..251981d9bb 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> @@ -2718,4 +2718,24 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> index 37178c503f..577cd189cb 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> @@ -2715,4 +2715,24 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> index 3b30b31466..3feb978017 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> @@ -2710,6 +2710,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> index 0e358570a2..32f6411658 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> @@ -2708,6 +2708,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> index 59c598b98f..cc8329c0d8 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> @@ -2716,6 +2716,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> index 2f7f1ccaf7..6cac0c3c4d 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> @@ -2619,6 +2619,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> index 463e01ab84..923eae8e9e 100644
> --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> @@ -2757,4 +2757,24 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> diff --git a/sysdeps/unix/sysv/linux/or1k/libc.abilist b/sysdeps/unix/sysv/linux/or1k/libc.abilist
> index ffdb8819d5..da607a3cc0 100644
> --- a/sysdeps/unix/sysv/linux/or1k/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/or1k/libc.abilist
> @@ -2140,3 +2140,23 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> index 405d40d11c..bf4be05150 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> @@ -2772,6 +2772,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> GLIBC_2.4 _IO_fprintf F
> GLIBC_2.4 _IO_printf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> index ce89602b93..a5e1f40c79 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> @@ -2805,6 +2805,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> GLIBC_2.4 _IO_fprintf F
> GLIBC_2.4 _IO_printf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> index 849863e639..25938d48ad 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> @@ -2527,6 +2527,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.4 _IO_fprintf F
> GLIBC_2.4 _IO_printf F
> GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> index b2ccee08c6..98666d8293 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> @@ -2829,3 +2829,23 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> index ff90d1bff2..96e503b850 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> @@ -2396,3 +2396,23 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> index f1017f6ec5..13d9b2414b 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> @@ -2596,3 +2596,23 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> index 5ca051a9eb..a38ff8cdd3 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> @@ -2770,6 +2770,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> GLIBC_2.4 _IO_fprintf F
> GLIBC_2.4 _IO_printf F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> index 0e0b3df973..cf4e85e4e5 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> @@ -2564,6 +2564,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.4 _IO_fprintf F
> GLIBC_2.4 _IO_printf F
> GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> index 5b48168ec6..cd4ed8377b 100644
> --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> @@ -2625,6 +2625,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> index c42b39cea8..27cb9532b9 100644
> --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> @@ -2622,6 +2622,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> index 5a0a662dee..4bfb40d957 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> @@ -2765,6 +2765,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.37 __ppoll64_chk F
> GLIBC_2.4 _IO_fprintf F
> GLIBC_2.4 _IO_printf F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> index 9ec4a0bc7f..36d2262766 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> @@ -2591,6 +2591,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> index 367c8d0a03..e86bc7cbd4 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> @@ -2542,6 +2542,26 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> index 6a614efb62..ee95b6a2b6 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> @@ -2648,3 +2648,23 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/wordsize-64/strtol.c b/sysdeps/wordsize-64/strtol.c
> index a1b2374153..a21fa8da10 100644
> --- a/sysdeps/wordsize-64/strtol.c
> +++ b/sysdeps/wordsize-64/strtol.c
> @@ -2,12 +2,14 @@
> #define __strtoll_internal __strtoll_internal_XXX
> #define strtoll strtoll_XXX
> #define strtoq strtoq_XXX
> +#define __isoc23_strtoll __isoc23_strtoll_XXX
>
> #include <stdlib/strtol.c>
>
> #undef __strtoll_internal
> #undef strtoll
> #undef strtoq
> +#undef __isoc23_strtoll
> strong_alias (__strtol_internal, __strtoll_internal)
> libc_hidden_ver (__strtol_internal, __strtoll_internal)
> weak_alias (strtol, strtoll)
> @@ -15,3 +17,6 @@ libc_hidden_ver (strtol, strtoll)
> weak_alias (strtol, strtoq)
> libc_hidden_ver (strtol, strtoq)
> weak_alias (strtol, strtoimax)
> +weak_alias (__isoc23_strtol, __isoc23_strtoll)
> +libc_hidden_ver (__isoc23_strtol, __isoc23_strtoll)
> +weak_alias (__isoc23_strtol, __isoc23_strtoimax)
> diff --git a/sysdeps/wordsize-64/strtol_l.c b/sysdeps/wordsize-64/strtol_l.c
> index b2cd102add..a44afa2e44 100644
> --- a/sysdeps/wordsize-64/strtol_l.c
> +++ b/sysdeps/wordsize-64/strtol_l.c
> @@ -2,13 +2,17 @@
> #define ____strtoll_l_internal ____strtoll_l_internal_XXX
> #define __strtoll_l __strtoll_l_XXX
> #define strtoll_l strtoll_l_XXX
> +#define __isoc23_strtoll_l __isoc23_strtoll_l_XXX
>
> #include <stdlib/strtol_l.c>
>
> #undef ____strtoll_l_internal
> #undef __strtoll_l
> #undef strtoll_l
> +#undef __isoc23_strtoll_l
> strong_alias (____strtol_l_internal, ____strtoll_l_internal)
> libc_hidden_ver (____strtol_l_internal, ____strtoll_l_internal)
> weak_alias (__strtol_l, __strtoll_l)
> weak_alias (__strtol_l, strtoll_l)
> +weak_alias (__isoc23_strtol_l, __isoc23_strtoll_l)
> +libc_hidden_ver (__isoc23_strtol_l, __isoc23_strtoll_l)
> diff --git a/sysdeps/wordsize-64/strtoul.c b/sysdeps/wordsize-64/strtoul.c
> index 856aa11dee..60c82b89d9 100644
> --- a/sysdeps/wordsize-64/strtoul.c
> +++ b/sysdeps/wordsize-64/strtoul.c
> @@ -2,14 +2,19 @@
> #define __strtoull_internal __strtoull_internal_XXX
> #define strtoull strtoull_XXX
> #define strtouq strtouq_XXX
> +#define __isoc23_strtoull __isoc23_strtoull_XXX
>
> #include <stdlib/strtoul.c>
>
> #undef __strtoull_internal
> #undef strtoull
> #undef strtouq
> +#undef __isoc23_strtoull
> strong_alias (__strtoul_internal, __strtoull_internal)
> libc_hidden_ver (__strtoul_internal, __strtoull_internal)
> weak_alias (strtoul, strtoull)
> weak_alias (strtoul, strtouq)
> weak_alias (strtoul, strtoumax)
> +weak_alias (__isoc23_strtoul, __isoc23_strtoull)
> +libc_hidden_ver (__isoc23_strtoul, __isoc23_strtoull)
> +weak_alias (__isoc23_strtoul, __isoc23_strtoumax)
> diff --git a/sysdeps/wordsize-64/strtoul_l.c b/sysdeps/wordsize-64/strtoul_l.c
> index 80cca332b1..b3b74f44b3 100644
> --- a/sysdeps/wordsize-64/strtoul_l.c
> +++ b/sysdeps/wordsize-64/strtoul_l.c
> @@ -2,13 +2,17 @@
> #define ____strtoull_l_internal ____strtoull_l_internal_XXX
> #define __strtoull_l __strtoull_l_XXX
> #define strtoull_l strtoull_l_XXX
> +#define __isoc23_strtoull_l __isoc23_strtoull_l_XXX
>
> #include <stdlib/strtoul_l.c>
>
> #undef ____strtoull_l_internal
> #undef __strtoull_l
> #undef strtoull_l
> +#undef __isoc23_strtoull_l
> strong_alias (____strtoul_l_internal, ____strtoull_l_internal)
> libc_hidden_ver (____strtoul_l_internal, ____strtoull_l_internal)
> weak_alias (__strtoul_l, __strtoull_l)
> weak_alias (__strtoul_l, strtoull_l)
> +weak_alias (__isoc23_strtoul_l, __isoc23_strtoull_l)
> +libc_hidden_ver (__isoc23_strtoul_l, __isoc23_strtoull_l)
> diff --git a/sysdeps/wordsize-64/wcstol.c b/sysdeps/wordsize-64/wcstol.c
> index f99c273d95..557c763941 100644
> --- a/sysdeps/wordsize-64/wcstol.c
> +++ b/sysdeps/wordsize-64/wcstol.c
> @@ -2,14 +2,19 @@
> #define __wcstoll_internal __wcstoll_internal_XXX
> #define wcstoll wcstoll_XXX
> #define wcstoq wcstoq_XXX
> +#define __isoc23_wcstoll __isoc23_wcstoll_XXX
>
> #include <wcsmbs/wcstol.c>
>
> #undef __wcstoll_internal
> #undef wcstoll
> #undef wcstoq
> +#undef __isoc23_wcstoll
> strong_alias (__wcstol_internal, __wcstoll_internal)
> libc_hidden_ver (__wcstol_internal, __wcstoll_internal)
> weak_alias (wcstol, wcstoll)
> weak_alias (wcstol, wcstoq)
> weak_alias (wcstol, wcstoimax)
> +weak_alias (__isoc23_wcstol, __isoc23_wcstoll)
> +libc_hidden_ver (__isoc23_wcstol, __isoc23_wcstoll)
> +weak_alias (__isoc23_wcstol, __isoc23_wcstoimax)
> diff --git a/sysdeps/wordsize-64/wcstol_l.c b/sysdeps/wordsize-64/wcstol_l.c
> index 4f48f60c65..b402790fdd 100644
> --- a/sysdeps/wordsize-64/wcstol_l.c
> +++ b/sysdeps/wordsize-64/wcstol_l.c
> @@ -2,12 +2,16 @@
> #define ____wcstoll_l_internal ____wcstoll_l_internal_XXX
> #define __wcstoll_l ___wcstoll_l_XXX
> #define wcstoll_l __wcstoll_l_XX
> +#define __isoc23_wcstoll_l __isoc23_wcstoll_l_XXX
>
> #include <wcsmbs/wcstol_l.c>
>
> #undef ____wcstoll_l_internal
> #undef __wcstoll_l
> #undef wcstoll_l
> +#undef __isoc23_wcstoll_l
> strong_alias (____wcstol_l_internal, ____wcstoll_l_internal)
> weak_alias (__wcstol_l, __wcstoll_l)
> weak_alias (__wcstol_l, wcstoll_l)
> +weak_alias (__isoc23_wcstol_l, __isoc23_wcstoll_l)
> +libc_hidden_ver (__isoc23_wcstol_l, __isoc23_wcstoll_l)
> diff --git a/sysdeps/wordsize-64/wcstoul.c b/sysdeps/wordsize-64/wcstoul.c
> index e1458e17f3..9b48ca6ab2 100644
> --- a/sysdeps/wordsize-64/wcstoul.c
> +++ b/sysdeps/wordsize-64/wcstoul.c
> @@ -2,14 +2,19 @@
> #define __wcstoull_internal __wcstoull_internal_XXX
> #define wcstoull wcstoull_XXX
> #define wcstouq wcstouq_XXX
> +#define __isoc23_wcstoull __isoc23_wcstoull_XXX
>
> #include <wcsmbs/wcstoul.c>
>
> #undef __wcstoull_internal
> #undef wcstoull
> #undef wcstouq
> +#undef __isoc23_wcstoull
> strong_alias (__wcstoul_internal, __wcstoull_internal)
> libc_hidden_ver (__wcstoul_internal, __wcstoull_internal)
> weak_alias (wcstoul, wcstoull)
> weak_alias (wcstoul, wcstouq)
> weak_alias (wcstoul, wcstoumax)
> +weak_alias (__isoc23_wcstoul, __isoc23_wcstoull)
> +libc_hidden_ver (__isoc23_wcstoul, __isoc23_wcstoull)
> +weak_alias (__isoc23_wcstoul, __isoc23_wcstoumax)
> diff --git a/sysdeps/wordsize-64/wcstoul_l.c b/sysdeps/wordsize-64/wcstoul_l.c
> index c376fa0e81..a5001ba83f 100644
> --- a/sysdeps/wordsize-64/wcstoul_l.c
> +++ b/sysdeps/wordsize-64/wcstoul_l.c
> @@ -2,12 +2,16 @@
> #define ____wcstoull_l_internal ____wcstoull_l_internal_XXX
> #define __wcstoull_l ___wcstoull_l_XXX
> #define wcstoull_l __wcstoull_l_XXX
> +#define __isoc23_wcstoull_l __isoc23_wcstoull_l_XXX
>
> #include <wcsmbs/wcstoul_l.c>
>
> #undef ____wcstoull_l_internal
> #undef __wcstoull_l
> #undef wcstoull_l
> +#undef __isoc23_wcstoull_l
> strong_alias (____wcstoul_l_internal, ____wcstoull_l_internal)
> weak_alias (__wcstoul_l, __wcstoull_l)
> weak_alias (__wcstoul_l, wcstoull_l)
> +weak_alias (__isoc23_wcstoul_l, __isoc23_wcstoull_l)
> +libc_hidden_ver (__isoc23_wcstoul_l, __isoc23_wcstoull_l)
> diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
> index aaa067fc69..6448b826fb 100644
> --- a/wcsmbs/Makefile
> +++ b/wcsmbs/Makefile
> @@ -55,7 +55,8 @@ tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \
> tst-wcstod-nan-sign tst-c16-surrogate tst-c32-state \
> test-mbrtoc8 test-c8rtomb \
> $(addprefix test-,$(strop-tests)) tst-mbstowcs \
> - tst-wprintf-binary
> + tst-wprintf-binary tst-wcstol-binary-c11 tst-wcstol-binary-c2x \
> + tst-wcstol-binary-gnu11 tst-wcstol-binary-gnu2x
>
> include ../Rules
>
> @@ -122,3 +123,11 @@ CPPFLAGS-wcstold_l.c += -I../stdlib
>
> $(objpfx)tst-wcstod-nan-locale: $(libm)
> $(objpfx)tst-wcstod-nan-sign: $(libm)
> +
> +# Some versions of GCC supported for building glibc do not support -std=c2x
> +# or -std=gnu2x, so the tests for those versions use -std=c11 and -std=gnu11
> +# and then _ISOC2X_SOURCE is defined in the test as needed.
> +CFLAGS-tst-wcstol-binary-c11.c += -std=c11
> +CFLAGS-tst-wcstol-binary-c2x.c += -std=c11
> +CFLAGS-tst-wcstol-binary-c11.c += -std=gnu11
> +CFLAGS-tst-wcstol-binary-c2x.c += -std=gnu11
> diff --git a/wcsmbs/Versions b/wcsmbs/Versions
> index ec28acfb73..90c730abde 100644
> --- a/wcsmbs/Versions
> +++ b/wcsmbs/Versions
> @@ -52,4 +52,8 @@ libc {
> GLIBC_2.36 {
> c8rtomb; mbrtoc8;
> }
> + GLIBC_2.37 {
> + __isoc23_wcstol; __isoc23_wcstoll; __isoc23_wcstoul; __isoc23_wcstoull;
> + __isoc23_wcstoimax; __isoc23_wcstoumax;
> + }
> }
> diff --git a/wcsmbs/tst-wcstol-binary-c11.c b/wcsmbs/tst-wcstol-binary-c11.c
> new file mode 100644
> index 0000000000..8333df3c66
> --- /dev/null
> +++ b/wcsmbs/tst-wcstol-binary-c11.c
> @@ -0,0 +1,29 @@
> +/* Test wcstol functions with C2X binary integers (wide strings,
> + no extensions to C11).
> + Copyright (C) 2022 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#undef _GNU_SOURCE
> +
> +#define CHAR wchar_t
> +#define FNPFX wcsto
> +#define L_(C) L ## C
> +#define TEST_C2X 0
> +#define TEST_Q 0
> +#define TEST_LOCALE 0
> +
> +#include "../stdlib/tst-strtol-binary-main.c"
> diff --git a/wcsmbs/tst-wcstol-binary-c2x.c b/wcsmbs/tst-wcstol-binary-c2x.c
> new file mode 100644
> index 0000000000..aa36315f30
> --- /dev/null
> +++ b/wcsmbs/tst-wcstol-binary-c2x.c
> @@ -0,0 +1,32 @@
> +/* Test wcstol functions with C2X binary integers (wide strings,
> + no extensions).
> + Copyright (C) 2022 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +/* Some versions of GCC supported for building glibc do not support
> + -std=c2x. */
> +#undef _GNU_SOURCE
> +#define _ISOC2X_SOURCE
> +
> +#define CHAR wchar_t
> +#define FNPFX wcsto
> +#define L_(C) L ## C
> +#define TEST_C2X 1
> +#define TEST_Q 0
> +#define TEST_LOCALE 0
> +
> +#include "../stdlib/tst-strtol-binary-main.c"
> diff --git a/wcsmbs/tst-wcstol-binary-gnu11.c b/wcsmbs/tst-wcstol-binary-gnu11.c
> new file mode 100644
> index 0000000000..1a04233629
> --- /dev/null
> +++ b/wcsmbs/tst-wcstol-binary-gnu11.c
> @@ -0,0 +1,34 @@
> +/* Test wcstol functions with C2X binary integers (wide strings, GNU
> + extensions, C2X wcstol features disabled).
> + Copyright (C) 2022 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#include <features.h>
> +/* This file tests the old versions of GNU extension functions, which
> + are not normally available to new binaries because GNU extensions
> + normally imply C2X wcstol features. */
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
> +
> +#define CHAR wchar_t
> +#define FNPFX wcsto
> +#define L_(C) L ## C
> +#define TEST_C2X 0
> +#define TEST_Q 1
> +#define TEST_LOCALE 1
> +
> +#include "../stdlib/tst-strtol-binary-main.c"
> diff --git a/wcsmbs/tst-wcstol-binary-gnu2x.c b/wcsmbs/tst-wcstol-binary-gnu2x.c
> new file mode 100644
> index 0000000000..36bc075025
> --- /dev/null
> +++ b/wcsmbs/tst-wcstol-binary-gnu2x.c
> @@ -0,0 +1,27 @@
> +/* Test wcstol functions with C2X binary integers (wide strings, GNU
> + extensions).
> + Copyright (C) 2022 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#define CHAR wchar_t
> +#define FNPFX wcsto
> +#define L_(C) L ## C
> +#define TEST_C2X 1
> +#define TEST_Q 1
> +#define TEST_LOCALE 1
> +
> +#include "../stdlib/tst-strtol-binary-main.c"
> diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h
> index c1321c7518..44d493a56c 100644
> --- a/wcsmbs/wchar.h
> +++ b/wcsmbs/wchar.h
> @@ -467,6 +467,67 @@ extern unsigned long long int wcstouq (const wchar_t *__restrict __nptr,
> int __base) __THROW;
> #endif /* Use GNU. */
>
> +/* Versions of the above functions that handle '0b' and '0B' prefixes
> + in base 0 or 2. */
> +#if __GLIBC_USE (C2X_STRTOL)
> +# ifdef __REDIRECT
> +extern long int __REDIRECT_NTH (wcstol, (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base), __isoc23_wcstol);
> +extern unsigned long int __REDIRECT_NTH (wcstoul,
> + (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base), __isoc23_wcstoul);
> +__extension__
> +extern long long int __REDIRECT_NTH (wcstoll,
> + (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base), __isoc23_wcstoll);
> +__extension__
> +extern unsigned long long int __REDIRECT_NTH (wcstoull,
> + (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base), __isoc23_wcstoull);
> +# ifdef __USE_GNU
> +__extension__
> +extern long long int __REDIRECT_NTH (wcstoq, (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base), __isoc23_wcstoll);
> +__extension__
> +extern unsigned long long int __REDIRECT_NTH (wcstouq,
> + (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base), __isoc23_wcstoull);
> +# endif
> +# else
> +extern long int __isoc23_wcstol (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr, int __base)
> + __THROW;
> +extern unsigned long int __isoc23_wcstoul (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base)
> + __THROW;
> +__extension__
> +extern long long int __isoc23_wcstoll (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base)
> + __THROW;
> +__extension__
> +extern unsigned long long int __isoc23_wcstoull (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base)
> + __THROW;
> +# define wcstol __isoc23_wcstol
> +# define wcstoul __isoc23_wcstoul
> +# define wcstoll __isoc23_wcstoll
> +# define wcstoull __isoc23_wcstoull
> +# ifdef __USE_GNU
> +# define wcstoq __isoc23_wcstoll
> +# define wcstouq __isoc23_wcstoull
> +# endif
> +# endif
> +#endif
> +
> #ifdef __USE_GNU
> /* Parallel versions of the functions above which take the locale to
> use as an additional parameter. These are GNU extensions inspired
> @@ -490,6 +551,56 @@ extern unsigned long long int wcstoull_l (const wchar_t *__restrict __nptr,
> int __base, locale_t __loc)
> __THROW;
>
> +/* Versions of the above functions that handle '0b' and '0B' prefixes
> + in base 0 or 2. */
> +# if __GLIBC_USE (C2X_STRTOL)
> +# ifdef __REDIRECT
> +extern long int __REDIRECT_NTH (wcstol_l, (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base, locale_t __loc),
> + __isoc23_wcstol_l);
> +extern unsigned long int __REDIRECT_NTH (wcstoul_l,
> + (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base, locale_t __loc),
> + __isoc23_wcstoul_l);
> +__extension__
> +extern long long int __REDIRECT_NTH (wcstoll_l,
> + (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base, locale_t __loc),
> + __isoc23_wcstoll_l);
> +__extension__
> +extern unsigned long long int __REDIRECT_NTH (wcstoull_l,
> + (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base, locale_t __loc),
> + __isoc23_wcstoull_l);
> +# else
> +extern long int __isoc23_wcstol_l (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr, int __base,
> + locale_t __loc) __THROW;
> +extern unsigned long int __isoc23_wcstoul_l (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base, locale_t __loc)
> + __THROW;
> +__extension__
> +extern long long int __isoc23_wcstoll_l (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base, locale_t __loc)
> + __THROW;
> +__extension__
> +extern unsigned long long int __isoc23_wcstoull_l (const wchar_t *__restrict __nptr,
> + wchar_t **__restrict __endptr,
> + int __base, locale_t __loc)
> + __THROW;
> +# define wcstol_l __isoc23_wcstol_l
> +# define wcstoul_l __isoc23_wcstoul_l
> +# define wcstoll_l __isoc23_wcstoll_l
> +# define wcstoull_l __isoc23_wcstoull_l
> +# endif
> +# endif
> +
> extern double wcstod_l (const wchar_t *__restrict __nptr,
> wchar_t **__restrict __endptr, locale_t __loc)
> __THROW;
> diff --git a/wcsmbs/wcstol_l.c b/wcsmbs/wcstol_l.c
> index 2325808b23..2d6226184b 100644
> --- a/wcsmbs/wcstol_l.c
> +++ b/wcsmbs/wcstol_l.c
> @@ -16,6 +16,9 @@
> License along with the GNU C Library; if not, see
> <https://www.gnu.org/licenses/>. */
>
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
> #define __need_wchar_t
> #include <stddef.h>
> #include <locale.h>
> diff --git a/wcsmbs/wcstoll.c b/wcsmbs/wcstoll.c
> index 2a926c0fa7..c6ca59a2b3 100644
> --- a/wcsmbs/wcstoll.c
> +++ b/wcsmbs/wcstoll.c
> @@ -22,3 +22,4 @@
>
> weak_alias (wcstoll, wcstoq)
> weak_alias (wcstoll, wcstoimax)
> +weak_alias (__isoc23_wcstoll, __isoc23_wcstoimax)
> diff --git a/wcsmbs/wcstoll_l.c b/wcsmbs/wcstoll_l.c
> index 67288a0b27..0742385038 100644
> --- a/wcsmbs/wcstoll_l.c
> +++ b/wcsmbs/wcstoll_l.c
> @@ -16,6 +16,9 @@
> License along with the GNU C Library; if not, see
> <https://www.gnu.org/licenses/>. */
>
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
> #define __need_wchar_t
> #include <stddef.h>
> #include <locale.h>
> diff --git a/wcsmbs/wcstoul_l.c b/wcsmbs/wcstoul_l.c
> index 3b342a6d7a..08996c067c 100644
> --- a/wcsmbs/wcstoul_l.c
> +++ b/wcsmbs/wcstoul_l.c
> @@ -16,6 +16,9 @@
> License along with the GNU C Library; if not, see
> <https://www.gnu.org/licenses/>. */
>
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
> #define __need_wchar_t
> #include <stddef.h>
> #include <locale.h>
> diff --git a/wcsmbs/wcstoull.c b/wcsmbs/wcstoull.c
> index b8aa018c47..e7561ed57b 100644
> --- a/wcsmbs/wcstoull.c
> +++ b/wcsmbs/wcstoull.c
> @@ -22,3 +22,4 @@
>
> weak_alias (wcstoull, wcstouq)
> weak_alias (wcstoull, wcstoumax)
> +weak_alias (__isoc23_wcstoull, __isoc23_wcstoumax)
> diff --git a/wcsmbs/wcstoull_l.c b/wcsmbs/wcstoull_l.c
> index 84746b1d87..9204f3c0a2 100644
> --- a/wcsmbs/wcstoull_l.c
> +++ b/wcsmbs/wcstoull_l.c
> @@ -16,6 +16,9 @@
> License along with the GNU C Library; if not, see
> <https://www.gnu.org/licenses/>. */
>
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
> #define __need_wchar_t
> #include <stddef.h>
> #include <locale.h>
>
--
<http://www.alejandro-colomar.es/>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2022-12-15 12:25 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-15 1:37 Joseph Myers
2022-12-15 12:25 ` Alejandro Colomar [this message]
2022-12-15 19:09 ` Adhemerval Zanella Netto
2022-12-19 16:02 ` [v2] " Joseph Myers
2022-12-22 0:10 ` [v3] " Joseph Myers
2022-12-30 15:24 ` Ping " Joseph Myers
2023-01-16 13:52 ` Adhemerval Zanella Netto
2023-01-16 19:23 ` Joseph Myers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4001418e-e9cb-af7e-047c-3731dd20574c@gmail.com \
--to=alx.manpages@gmail.com \
--cc=joseph@codesourcery.com \
--cc=libc-alpha@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).