summaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/bits/regex_compiler.h
diff options
context:
space:
mode:
authortimshen <timshen@138bc75d-0d04-0410-961f-82ee72b054a4>2013-10-02 15:13:18 +0000
committertimshen <timshen@138bc75d-0d04-0410-961f-82ee72b054a4>2013-10-02 15:13:18 +0000
commit45ae37cf28ca90f34353a6d9fd0eec06e1ae1e4b (patch)
tree3a79396240997b064f90d8d8e3db92b75c0fcf6d /libstdc++-v3/include/bits/regex_compiler.h
parente6f6c65b4103e171d3e8052ec586c772a4704625 (diff)
2013-10-02 Tim Shen <timshen91@gmail.com>
* include/bits/regex_compiler.h (_BracketMatcher<>::_M_add_equivalence_class): Implement it correctly. * include/bits/regex_compiler.tcc (_BracketMatcher<>::operator()): Add _M_equiv_set support. * testsuite/28_regex/algorithms/regex_match/extended/ cstring_bracket_01.cc: Add new "[[=a=]]" testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@203117 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/bits/regex_compiler.h')
-rw-r--r--libstdc++-v3/include/bits/regex_compiler.h20
1 files changed, 13 insertions, 7 deletions
diff --git a/libstdc++-v3/include/bits/regex_compiler.h b/libstdc++-v3/include/bits/regex_compiler.h
index 4e393e7be9a7..297fe3f60e9b 100644
--- a/libstdc++-v3/include/bits/regex_compiler.h
+++ b/libstdc++-v3/include/bits/regex_compiler.h
@@ -213,19 +213,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
void
_M_add_equivalence_class(const _StringT& __s)
{
- _M_add_character_class(
- _M_traits.transform_primary(__s.data(),
- __s.data() + __s.size()));
+ auto __st = _M_traits.lookup_collatename(__s.data(),
+ __s.data() + __s.size());
+ if (__st.empty())
+ __throw_regex_error(regex_constants::error_collate);
+ __st = _M_traits.transform_primary(__st.data(),
+ __st.data() + __st.size());
+ _M_equiv_set.insert(__st);
}
void
_M_add_character_class(const _StringT& __s)
{
- auto __st = _M_traits.
- lookup_classname(__s.data(), __s.data() + __s.size(), _M_is_icase());
- if (__st == 0)
+ auto __mask = _M_traits.lookup_classname(__s.data(),
+ __s.data() + __s.size(),
+ _M_is_icase());
+ if (__mask == 0)
__throw_regex_error(regex_constants::error_ctype);
- _M_class_set |= __st;
+ _M_class_set |= __mask;
}
void
@@ -260,6 +265,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
std::set<_CharT> _M_char_set;
+ std::set<_StringT> _M_equiv_set;
std::set<pair<_StringT, _StringT>> _M_range_set;
const _TraitsT& _M_traits;
_CharClassT _M_class_set;