On Mon, Feb 9, 2026 at 9:46 PM Jonathan Wakely <[email protected]> wrote:
> This fixes a bug in regex_traits::lookup_classname(f, l, true) where the
> result was always ctype_base::alpha for any input sequence [f, l) that
> has the ctype_base::lower or ctype_base::upper bits set. For targets
> that define alpha as lower|upper (rather than having a distinct bit for
> alpha) this bug meant that all masks which have lower or upper bits set
> were replaced with alpha when the icase parameter is true. This has the
> effect that trying to do a case insensitive match for [:alnum:],
> [:graph:], or [:print:] was equivalent to matching [:alpha:] instead,
> which is obviously not correct.
>
Thanks for clear explanation in commit message, otherwise I wouldn't
guess what this is actually fixing.
>
> Based on inspection of the ctype_base.h files under the config/os
> directory, the bug appears to affect newlib, picolibc, qnx and vxworks.
>
> libstdc++-v3/ChangeLog:
>
> PR libstdc++/124015
> * include/bits/regex.tcc (regex_traits::lookup_classname): Fix
> handling of icase parameter.
> ---
>
> This and patch 1/3 are suitable for backport to release branches.
>
> Tested x86_64-linux.
>
LGTM.
>
> libstdc++-v3/include/bits/regex.tcc | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/libstdc++-v3/include/bits/regex.tcc
> b/libstdc++-v3/include/bits/regex.tcc
> index 061b60042eca..71eadd20bfdb 100644
> --- a/libstdc++-v3/include/bits/regex.tcc
> +++ b/libstdc++-v3/include/bits/regex.tcc
> @@ -309,8 +309,8 @@ namespace __detail
> if (__s == __it.first)
> {
> if (__icase
> - && ((__it.second
> - & (ctype_base::lower | ctype_base::upper)) != 0))
> + && (__it.second._M_base == ctype_base::lower
> + || __it.second._M_base == ctype_base::upper))
> return ctype_base::alpha;
> return __it.second;
> }
> --
> 2.52.0
>
>