aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Bacci <luca.bacci982@gmail.com>2024-12-17 18:57:30 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2024-12-18 08:26:05 +0000
commiteb339c29ee42aa59591fc50d6d8a1ab903d2a3fe (patch)
treeaef39b8d8271946f51e87051c07f92ac81405b42
parentb34fbab529e64dbeb6db70263e35373c200f899a (diff)
downloadgcc-eb339c29ee42aa59591fc50d6d8a1ab903d2a3fe.zip
gcc-eb339c29ee42aa59591fc50d6d8a1ab903d2a3fe.tar.gz
gcc-eb339c29ee42aa59591fc50d6d8a1ab903d2a3fe.tar.bz2
libstdc++: Call regex_traits::transform_primary() only when necessary [PR98723]
This is both a performance optimization and a partial fix for PR 98723. This commit fixes the issue for bracket expressions that do not depend on the locale's collation facet. Examples: * Character ranges ([a-z]) when std::regex::collate is not set * Character classes ([:alnum:]) * Individual characters ([abc]) Signed-off-by: Luca Bacci <luca.bacci982@gmail.com> libstdc++-v3/ChangeLog: PR libstdc++/98723 * include/bits/regex_compiler.tcc (_BracketMatcher::_M_apply): Only use transform_primary when an equivalence set is used.
-rw-r--r--libstdc++-v3/include/bits/regex_compiler.tcc11
1 files changed, 7 insertions, 4 deletions
diff --git a/libstdc++-v3/include/bits/regex_compiler.tcc b/libstdc++-v3/include/bits/regex_compiler.tcc
index 9c5a46a..5037195 100644
--- a/libstdc++-v3/include/bits/regex_compiler.tcc
+++ b/libstdc++-v3/include/bits/regex_compiler.tcc
@@ -611,10 +611,13 @@ namespace __detail
return true;
if (_M_traits.isctype(__ch, _M_class_set))
return true;
- if (std::find(_M_equiv_set.begin(), _M_equiv_set.end(),
- _M_traits.transform_primary(&__ch, &__ch+1))
- != _M_equiv_set.end())
- return true;
+ if (!_M_equiv_set.empty())
+ {
+ auto __x = _M_traits.transform_primary(&__ch, &__ch+1);
+ auto __p = std::find(_M_equiv_set.begin(), _M_equiv_set.end(), __x);
+ if (__p != _M_equiv_set.end())
+ return true;
+ }
for (auto& __it : _M_neg_class_set)
if (!_M_traits.isctype(__ch, __it))
return true;