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
>
>

Reply via email to