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