]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Fix std::regex_traits::lookup_classname [PR124015]
authorJonathan Wakely <jwakely@redhat.com>
Thu, 5 Feb 2026 17:32:23 +0000 (17:32 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 11 Feb 2026 11:00:03 +0000 (11:00 +0000)
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 <tkaminsk@redhat.com>
libstdc++-v3/include/bits/regex.tcc

index ca500d21c348cfd285963576e11bb20bc8d8d967..7715d653df5d59d783dc6b4b71f7621f3e2bd9dc 100644 (file)
@@ -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;
          }