On Wed, Feb 11, 2026 at 1:21 AM 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. > > 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. > > Reviewed-by: Tomasz Kamiński <[email protected]> > --- > > v2: No changes, just rebased on PATCH v2 1/3 > > Tested x86_64-linux and aarch64-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 ca500d21c348..7715d653df5d 100644 > --- a/libstdc++-v3/include/bits/regex.tcc > +++ b/libstdc++-v3/include/bits/regex.tcc > @@ -302,8 +302,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 > >
