commit 1706175be16d0c84576e0cba8285f0806e893883 Author: tim Date: Fri Oct 4 00:53:08 2013 -0400 2013-10-04 Tim Shen * include/bits/regex.h (__regex_algo_impl<>, regex_match<>, regex_search<>): New abstract function for regex_match and regex_search. * include/bits/regex.tcc (__regex_algo_impl<>): Implement. * include/bits/regex_executor.h (_Executor<>::_M_lookahead, _DFSExecutor<>::_M_clone, _BFSExecutor<>::_M_clone): Let _M_clone to choose which executor to use. * include/bits/regex_executor.tcc (__get_executor<>): Update the definition to support __policy. * testsuite/28_regex/algorithms/regex_match/awk/cstring_01.cc: Use *_debug. * testsuite/28_regex/algorithms/regex_match/basic/empty_range.cc: Same. * testsuite/28_regex/algorithms/regex_match/basic/string_01.cc: Same. * testsuite/28_regex/algorithms/regex_match/basic/string_range_00_03.cc: Same. * testsuite/28_regex/algorithms/regex_match/basic/string_range_01_03.cc: Same. * testsuite/28_regex/algorithms/regex_match/basic/string_range_02_03.cc: Same. * testsuite/28_regex/algorithms/regex_match/ecma/char/53622.cc: Same. * testsuite/28_regex/algorithms/regex_match/ecma/char/57173.cc: Same. * testsuite/28_regex/algorithms/regex_match/ecma/char/58576.cc: Same. * testsuite/28_regex/algorithms/regex_match/ecma/char/anymatcher.cc: Same. * testsuite/28_regex/algorithms/regex_match/ecma/char/backref.cc: Same. * testsuite/28_regex/algorithms/regex_match/ecma/char/empty_range.cc: Same. * testsuite/28_regex/algorithms/regex_match/ecma/char/emptygroup.cc: Same. * testsuite/28_regex/algorithms/regex_match/ecma/char/hex.cc: Same. * testsuite/28_regex/algorithms/regex_match/ecma/char/quoted_char.cc: Same. * testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/anymatcher.cc: Same. * testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/hex.cc: Same. * testsuite/28_regex/algorithms/regex_match/extended/ string_bracket_01.cc: Same. * testsuite/28_regex/algorithms/regex_match/extended/cstring_plus.cc: Same. * testsuite/28_regex/algorithms/regex_match/extended/ string_questionmark.cc: Same. * testsuite/28_regex/algorithms/regex_match/extended/cstring_range.cc: Same. * testsuite/28_regex/algorithms/regex_match/extended/string_any.cc: Same. * testsuite/28_regex/algorithms/regex_match/extended/ string_dispatch_01.cc: Same. * testsuite/28_regex/algorithms/regex_match/extended/ string_range_00_03.cc: Same. * testsuite/28_regex/algorithms/regex_match/extended/ string_range_01_03.cc: Same. * testsuite/28_regex/algorithms/regex_match/extended/ string_range_02_03.cc: Same. * testsuite/28_regex/algorithms/regex_match/extended/wstring_locale.cc: Same. * testsuite/28_regex/algorithms/regex_search/basic/string_01.cc: Same. * testsuite/28_regex/algorithms/regex_search/ecma/assertion.cc: Same. * testsuite/28_regex/algorithms/regex_search/ecma/flags.cc: Same. * testsuite/28_regex/algorithms/regex_search/ecma/greedy.cc: Same. * testsuite/28_regex/algorithms/regex_search/ecma/string_01.cc: Same. * testsuite/28_regex/match_results/format.cc: Same. * testsuite/util/testsuite_regex.h (regex_match_debug<>, regex_search_debug<>): Implement. diff --git a/libstdc++-v3/include/bits/regex.h b/libstdc++-v3/include/bits/regex.h index 4d7e7d7..f1f3bc8 100644 --- a/libstdc++-v3/include/bits/regex.h +++ b/libstdc++-v3/include/bits/regex.h @@ -32,6 +32,24 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION +namespace __detail +{ +_GLIBCXX_BEGIN_NAMESPACE_VERSION + + template + bool + __regex_algo_impl(_BiIter __s, + _BiIter __e, + match_results<_BiIter, _Alloc>& __m, + const basic_regex<_CharT, _TraitsT>& __re, + regex_constants::match_flag_type __flags); + +_GLIBCXX_END_NAMESPACE_VERSION +} + /** * @addtogroup regex * @{ @@ -713,7 +731,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _AutomatonPtr; template + typename _CharT, typename _TraitsT, + __detail::_RegexExecutorPolicy __policy> friend std::unique_ptr< __detail::_Executor<_BiIter, _Alloc, _CharT, _TraitsT>> __detail::__get_executor(_BiIter, @@ -722,19 +741,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION const basic_regex<_CharT, _TraitsT>&, regex_constants::match_flag_type); - template - friend bool - regex_match(_Bp, _Bp, - match_results<_Bp, _Ap>&, - const basic_regex<_Cp, _Rp>&, - regex_constants::match_flag_type); - - template + template friend bool - regex_search(_Bp, _Bp, - match_results<_Bp, _Ap>&, - const basic_regex<_Cp, _Rp>&, - regex_constants::match_flag_type); + __detail::__regex_algo_impl(_Bp, _Bp, match_results<_Bp, _Ap>&, + const basic_regex<_Cp, _Rp>&, + regex_constants::match_flag_type); template friend class __detail::_Executor; @@ -1851,21 +1863,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template friend class regex_iterator; - template - friend bool - regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, - const basic_regex<_Ch_type, - _Rx_traits>&, - regex_constants::match_flag_type); - - template + template friend bool - regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, - const basic_regex<_Ch_type, - _Rx_traits>&, - regex_constants::match_flag_type); + __detail::__regex_algo_impl(_Bp, _Bp, match_results<_Bp, _Ap>&, + const basic_regex<_Cp, _Rp>&, + regex_constants::match_flag_type); _Bi_iter _M_begin; bool _M_in_iterator; @@ -1951,13 +1954,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION */ template - bool + inline bool regex_match(_Bi_iter __s, _Bi_iter __e, match_results<_Bi_iter, _Alloc>& __m, const basic_regex<_Ch_type, _Rx_traits>& __re, regex_constants::match_flag_type __flags - = regex_constants::match_default); + = regex_constants::match_default) + { + using namespace __detail; + return __regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, + _RegexExecutorPolicy::_S_auto, true>(__s, __e, __m, __re, __flags); + } /** * @brief Indicates if there is a match between the regular expression @p e @@ -2091,12 +2099,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION */ template - bool - regex_search(_Bi_iter __first, _Bi_iter __last, + inline bool + regex_search(_Bi_iter __s, _Bi_iter __e, match_results<_Bi_iter, _Alloc>& __m, const basic_regex<_Ch_type, _Rx_traits>& __re, regex_constants::match_flag_type __flags - = regex_constants::match_default); + = regex_constants::match_default) + { + using namespace __detail; + return __regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, + _RegexExecutorPolicy::_S_auto, false>(__s, __e, __m, __re, __flags); + } /** * Searches for a regular expression within a range. diff --git a/libstdc++-v3/include/bits/regex.tcc b/libstdc++-v3/include/bits/regex.tcc index 24316d2..202401e 100644 --- a/libstdc++-v3/include/bits/regex.tcc +++ b/libstdc++-v3/include/bits/regex.tcc @@ -32,6 +32,83 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION +namespace __detail +{ +_GLIBCXX_BEGIN_NAMESPACE_VERSION + + // Abstract function for regex_match and regex_search. + // + // __policy now could be _S_auto(auto dispatch by checking back-references) + // and _S_force_dfs(just use _DFSExecutor). + // + // That __match_mode is true means regex_match, else regex_search. + template + bool + __regex_algo_impl(_BiIter __s, + _BiIter __e, + match_results<_BiIter, _Alloc>& __m, + const basic_regex<_CharT, _TraitsT>& __re, + regex_constants::match_flag_type __flags) + { + if (__re._M_automaton == nullptr) + return false; + + typename match_results<_BiIter, _Alloc>::_Base_type& __res = __m; + __res.resize(__re._M_automaton->_M_sub_count() + 2); + for (auto& __it : __res) + __it.matched = false; + + typedef std::unique_ptr<_Executor<_BiIter, _Alloc, _CharT, _TraitsT>> + _ExecutorPtr; + typedef _DFSExecutor<_BiIter, _Alloc, _CharT, _TraitsT> _DFSExecutorT; + typedef _BFSExecutor<_BiIter, _Alloc, _CharT, _TraitsT> _BFSExecutorT; + + _ExecutorPtr __executor = + __get_executor<_BiIter, _Alloc, _CharT, _TraitsT, + __policy>(__s, __e, __res, __re, __flags); + + bool __ret; + if (__match_mode) + __ret = __executor->_M_match(); + else + __ret = __executor->_M_search(); + if (__ret) + { + for (auto __it : __res) + if (!__it.matched) + __it.first = __it.second = __e; + auto& __pre = __res[__res.size()-2]; + auto& __suf = __res[__res.size()-1]; + if (__match_mode) + { + __pre.matched = false; + __pre.first = __s; + __pre.second = __s; + __suf.matched = false; + __suf.first = __e; + __suf.second = __e; + } + else + { + __pre.first = __s; + __pre.second = __res[0].first; + __pre.matched = (__pre.first != __pre.second); + __suf.first = __res[0].second; + __suf.second = __e; + __suf.matched = (__suf.first != __suf.second); + } + if (__re.flags() & regex_constants::nosubs) + __res.resize(3); + } + return __ret; + } + +_GLIBCXX_END_NAMESPACE_VERSION +} + template template typename regex_traits<_Ch_type>::string_type @@ -395,82 +472,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __out; } - template - bool - regex_match(_Bi_iter __s, - _Bi_iter __e, - match_results<_Bi_iter, _Alloc>& __m, - const basic_regex<_Ch_type, _Rx_traits>& __re, - regex_constants::match_flag_type __flags - = regex_constants::match_default) - { - if (__re._M_automaton == nullptr) - return false; - - typename match_results<_Bi_iter, _Alloc>::_Base_type& __res = __m; - auto __size = __re._M_automaton->_M_sub_count(); - __size += 2; - __res.resize(__size); - for (decltype(__size) __i = 0; __i < __size; ++__i) - __res[__i].matched = false; - - if (__detail::__get_executor(__s, __e, __res, __re, __flags)->_M_match()) - { - for (auto __it : __res) - if (!__it.matched) - __it.first = __it.second = __e; - auto& __pre = __res[__res.size()-2]; - auto& __suf = __res[__res.size()-1]; - __pre.matched = false; - __pre.first = __s; - __pre.second = __s; - __suf.matched = false; - __suf.first = __e; - __suf.second = __e; - return true; - } - return false; - } - - template - bool - regex_search(_Bi_iter __first, _Bi_iter __last, - match_results<_Bi_iter, _Alloc>& __m, - const basic_regex<_Ch_type, _Rx_traits>& __re, - regex_constants::match_flag_type __flags - = regex_constants::match_default) - { - if (__re._M_automaton == nullptr) - return false; - - typename match_results<_Bi_iter, _Alloc>::_Base_type& __res = __m; - auto __size = __re._M_automaton->_M_sub_count(); - __size += 2; - __res.resize(__size); - for (decltype(__size) __i = 0; __i < __size; ++__i) - __res[__i].matched = false; - - if (__detail::__get_executor(__first, __last, __res, __re, __flags) - ->_M_search()) - { - for (auto __it : __res) - if (!__it.matched) - __it.first = __it.second = __last; - auto& __pre = __res[__res.size()-2]; - auto& __suf = __res[__res.size()-1]; - __pre.first = __first; - __pre.second = __res[0].first; - __pre.matched = (__pre.first != __pre.second); - __suf.first = __res[0].second; - __suf.second = __last; - __suf.matched = (__suf.first != __suf.second); - return true; - } - return false; - } - template _Out_iter diff --git a/libstdc++-v3/include/bits/regex_executor.h b/libstdc++-v3/include/bits/regex_executor.h index a0149d2..c01f474 100644 --- a/libstdc++-v3/include/bits/regex_executor.h +++ b/libstdc++-v3/include/bits/regex_executor.h @@ -145,11 +145,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool _M_word_boundry(_State<_CharT, _TraitsT> __state) const; + virtual std::unique_ptr<_Executor> + _M_clone() const = 0; + + // Return whether now match the given sub-NFA. bool - _M_lookahead(_State<_CharT, _TraitsT> __state) const; + _M_lookahead(_State<_CharT, _TraitsT> __state) const + { + auto __sub = this->_M_clone(); + __sub->_M_set_start(__state._M_alt); + return __sub->_M_search_from_first(); + } void - _M_set_results(_ResultsVec& __cur_results); + _M_set_results(_ResultsVec& __cur_results) + { + for (unsigned int __i = 0; __i < __cur_results.size(); ++__i) + if (__cur_results[__i].matched) + _M_results[__i] = __cur_results[__i]; + } public: virtual void @@ -226,6 +240,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool _M_dfs(_StateIdT __start); + std::unique_ptr<_BaseT> + _M_clone() const + { + return std::unique_ptr<_BaseT>(new _DFSExecutor(this->_M_current, + this->_M_end, + this->_M_results, + this->_M_re, + this->_M_flags)); + } + // To record current solution. _ResultsVec _M_cur_results; const _NFAT& _M_nfa; @@ -268,8 +292,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // greedy policy. // // The definition of `greedy`: - // For the sequence of quantifiers in NFA sorted by there start position, - // now maintain a vector in every matching state, with equal length to + // For the sequence of quantifiers in NFA sorted by their start positions, + // now maintain a vector in every matching state, with length equal to // quantifier seq, recording repeating times of every quantifier. Now to // compare two matching states, we just lexically compare these two // vectors. To win the compare(to survive), one matching state needs to @@ -281,8 +305,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // operator<() for lexicographical_compare will emit the answer. // // When two vectors equal, it means the `where`, `when` and quantifier - // counts are identical, and indicates the same solution; so just return - // false. + // counts are identical, and indicates the same solution; so + // _ResultsEntry::operator<() just return false. struct _ResultsEntry : private _ResultsVec { @@ -369,6 +393,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool _M_includes_some(); + std::unique_ptr<_BaseT> + _M_clone() const + { + return std::unique_ptr<_BaseT>(new _BFSExecutor(this->_M_current, + this->_M_end, + this->_M_results, + this->_M_re, + this->_M_flags)); + } + std::map<_StateIdT, _ResultsPtr> _M_covered; // To record global optimal solution. _ResultsPtr _M_cur_results; @@ -376,15 +410,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _StateIdT _M_start_state; }; - template - std::unique_ptr<_Executor<_BiIter, _Alloc, _CharT, _TraitsT>> - __get_executor(_BiIter __b, - _BiIter __e, - std::vector, _Alloc>& __m, - const basic_regex<_CharT, _TraitsT>& __re, - regex_constants::match_flag_type __flags); - //@} regex-detail _GLIBCXX_END_NAMESPACE_VERSION } // namespace __detail diff --git a/libstdc++-v3/include/bits/regex_executor.tcc b/libstdc++-v3/include/bits/regex_executor.tcc index 60ba952..702e636 100644 --- a/libstdc++-v3/include/bits/regex_executor.tcc +++ b/libstdc++-v3/include/bits/regex_executor.tcc @@ -365,39 +365,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __ans; } - // Return whether now match the given sub-NFA. - template - bool _Executor<_BiIter, _Alloc, _CharT, _TraitsT>:: - _M_lookahead(_State<_CharT, _TraitsT> __state) const - { - auto __sub = __get_executor(this->_M_current, - this->_M_end, - this->_M_results, - this->_M_re, - this->_M_flags); - __sub->_M_set_start(__state._M_alt); - return __sub->_M_search_from_first(); - } + enum class _RegexExecutorPolicy : int + { _S_auto, _S_force_dfs }; template - void _Executor<_BiIter, _Alloc, _CharT, _TraitsT>:: - _M_set_results(_ResultsVec& __cur_results) - { - if (_M_re.flags() & regex_constants::nosubs) - { - // truncate - __cur_results.resize(3); - _M_results.resize(3); - } - for (unsigned int __i = 0; __i < __cur_results.size(); ++__i) - if (__cur_results[__i].matched) - _M_results[__i] = __cur_results[__i]; - } - - template + typename _CharT, typename _TraitsT, + _RegexExecutorPolicy __policy> std::unique_ptr<_Executor<_BiIter, _Alloc, _CharT, _TraitsT>> __get_executor(_BiIter __b, _BiIter __e, @@ -411,7 +384,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typedef _BFSExecutor<_BiIter, _Alloc, _CharT, _TraitsT> _BFSExecutorT; auto __p = std::static_pointer_cast<_NFA<_CharT, _TraitsT>> (__re._M_automaton); - if (__p->_M_has_backref) + if (__policy == _RegexExecutorPolicy::_S_force_dfs + || (__policy == _RegexExecutorPolicy::_S_auto && __p->_M_has_backref)) return _ExecutorPtr(new _DFSExecutorT(__b, __e, __m, __re, __flags)); return _ExecutorPtr(new _BFSExecutorT(__b, __e, __m, __re, __flags)); } diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/awk/cstring_01.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/awk/cstring_01.cc index d4edf12..e2bde22 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/awk/cstring_01.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/awk/cstring_01.cc @@ -25,7 +25,9 @@ #include #include +#include +using namespace __gnu_test; using namespace std; void @@ -34,12 +36,12 @@ test01() bool test __attribute__((unused)) = true; regex("\\[", regex_constants::awk); - VERIFY(regex_match("\"", regex("[\\\"]", regex_constants::awk))); - VERIFY(regex_match("/", regex("/", regex_constants::awk))); - VERIFY(regex_match("\a", regex("\\a", regex_constants::awk))); - VERIFY(regex_match("\"", regex("\\\"", regex_constants::awk))); - VERIFY(regex_match("5", regex("\\65", regex_constants::awk))); - VERIFY(regex_match("53", regex("\\0653", regex_constants::awk))); + VERIFY(regex_match_debug("\"", regex("[\\\"]", regex_constants::awk))); + VERIFY(regex_match_debug("/", regex("/", regex_constants::awk))); + VERIFY(regex_match_debug("\a", regex("\\a", regex_constants::awk))); + VERIFY(regex_match_debug("\"", regex("\\\"", regex_constants::awk))); + VERIFY(regex_match_debug("5", regex("\\65", regex_constants::awk))); + VERIFY(regex_match_debug("53", regex("\\0653", regex_constants::awk))); } int diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/empty_range.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/empty_range.cc index eb22569..dd0dac4 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/empty_range.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/empty_range.cc @@ -25,7 +25,9 @@ #include #include +#include +using namespace __gnu_test; using namespace std; void @@ -45,8 +47,8 @@ test01() } FAIL("[]"); FAIL("[^]"); - VERIFY(regex_match("]", regex("[]]", regex_constants::basic))); - VERIFY(!regex_match("]", regex("[^]]", regex_constants::basic))); + VERIFY(regex_match_debug ("]", regex("[]]", regex_constants::basic))); + VERIFY(!regex_match_debug ("]", regex("[^]]", regex_constants::basic))); } int diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_01.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_01.cc index 668309d..34cfa55 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_01.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_01.cc @@ -25,6 +25,10 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; void test01() @@ -35,7 +39,7 @@ test01() std::string target("aaba"); std::smatch m; - VERIFY( std::regex_match(target, m, re) ); + VERIFY( regex_match_debug(target, m, re) ); VERIFY( m.size() == re.mark_count()+1 ); VERIFY( m.empty() == false ); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_range_00_03.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_range_00_03.cc index 1878386..36f032d 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_range_00_03.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_range_00_03.cc @@ -25,6 +25,10 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; void test01() @@ -35,7 +39,7 @@ test01() std::string target("aa"); std::smatch m; - VERIFY( std::regex_match(target, m, re) ); + VERIFY( regex_match_debug(target, m, re) ); VERIFY( m.size() == re.mark_count()+1 ); VERIFY( m.empty() == false ); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_range_01_03.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_range_01_03.cc index 93826a7..812e3ef 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_range_01_03.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_range_01_03.cc @@ -25,6 +25,10 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; void test01() @@ -35,7 +39,7 @@ test01() std::string target("aa"); std::smatch m; - VERIFY( std::regex_match(target, m, re) ); + VERIFY( regex_match_debug(target, m, re) ); VERIFY( m.size() == re.mark_count()+1 ); VERIFY( m.empty() == false ); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_range_02_03.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_range_02_03.cc index 91bc101..0924ed0 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_range_02_03.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/basic/string_range_02_03.cc @@ -25,6 +25,10 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; void test01() @@ -35,7 +39,7 @@ test01() std::string target("aa"); std::smatch m; - VERIFY( std::regex_match(target, m, re) ); + VERIFY( regex_match_debug(target, m, re) ); VERIFY( m.size() == re.mark_count()+1 ); VERIFY( m.empty() == false ); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/53622.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/53622.cc index 5f4b1d1..5a762ab 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/53622.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/53622.cc @@ -24,6 +24,10 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; // libstdc++/53622 void @@ -36,7 +40,7 @@ test01() std::string target("zxcv/onetwoabc"); std::smatch m; - VERIFY( std::regex_match(target, m, re) ); + VERIFY( regex_match_debug(target, m, re) ); VERIFY( m.size() == 2 ); VERIFY( m[0].matched == true ); VERIFY( std::string(m[0].first, m[0].second) == "zxcv/onetwoabc" ); @@ -49,7 +53,7 @@ test01() std::string target("zxcv/onetwoabc"); std::smatch m; - VERIFY( std::regex_match(target, m, re) ); + VERIFY( regex_match_debug(target, m, re) ); VERIFY( m.size() == 3 ); VERIFY( m[0].matched == true ); VERIFY( std::string(m[0].first, m[0].second) == "zxcv/onetwoabc" ); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/57173.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/57173.cc index b9a72c9..dc177e5 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/57173.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/57173.cc @@ -24,6 +24,10 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; #include // libstdc++/57173 @@ -37,7 +41,7 @@ test01() std::string target("/asdf/qwerty"); std::smatch m; - VERIFY( std::regex_match(target, m, re) ); + VERIFY( regex_match_debug(target, m, re) ); VERIFY( m.size() == 2 ); VERIFY( std::string(m[1].first, m[1].second) == "/qwerty"); } @@ -46,7 +50,7 @@ test01() std::string target("/asdf/qwerty"); std::smatch m; - VERIFY( std::regex_match(target, m, re) ); + VERIFY( regex_match_debug(target, m, re) ); VERIFY( m.size() == 3 ); VERIFY( std::string(m[1].first, m[1].second) == "/qwerty"); } diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/58576.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/58576.cc index 1a1365c..a06a2e3 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/58576.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/58576.cc @@ -24,13 +24,15 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; // libstdc++/58576 void test01() { - using namespace std; - bool test __attribute__((unused)) = true; string domain_name = "valid.hostname.org"; @@ -74,7 +76,7 @@ test01() }; try { - VERIFY(regex_match( domain_name, m, fqdn_regex )); + VERIFY(regex_match_debug( domain_name, m, fqdn_regex )); VERIFY(m.size() == sizeof(sol) / sizeof(*sol)); for (int i = 0; i < (int)m.size(); i++) { string s(m[i].first, m[i].second); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/anymatcher.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/anymatcher.cc index 6e6095b..866ff7f 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/anymatcher.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/anymatcher.cc @@ -25,7 +25,9 @@ #include #include +#include +using namespace __gnu_test; using namespace std; void @@ -37,7 +39,7 @@ test01() {\ regex re(res);\ string st(s);\ - VERIFY(!regex_match(st, re));\ + VERIFY(!regex_match_debug(st, re));\ } TEST(".", "\0"); TEST(".", "\n"); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/backref.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/backref.cc index 321ce35..05a5772 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/backref.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/backref.cc @@ -25,7 +25,9 @@ #include #include +#include +using namespace __gnu_test; using namespace std; void diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/empty_range.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/empty_range.cc index 3c48d35..9f09c74 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/empty_range.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/empty_range.cc @@ -25,7 +25,9 @@ #include #include +#include +using namespace __gnu_test; using namespace std; void @@ -33,10 +35,10 @@ test01() { bool test __attribute__((unused)) = true; - VERIFY(!regex_match("x", regex("[]"))); - VERIFY(regex_match("x", regex("[^]"))); - VERIFY(!regex_match("]", regex("[]]"))); - VERIFY(!regex_match("]", regex("[^]]"))); + VERIFY(!regex_match_debug("x", regex("[]"))); + VERIFY(regex_match_debug("x", regex("[^]"))); + VERIFY(!regex_match_debug("]", regex("[]]"))); + VERIFY(!regex_match_debug("]", regex("[^]]"))); } int diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/emptygroup.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/emptygroup.cc index 1dc8f63..77fd43c 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/emptygroup.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/emptygroup.cc @@ -25,7 +25,9 @@ #include #include +#include +using namespace __gnu_test; using namespace std; void @@ -37,7 +39,7 @@ test01() regex re("()*\\1"); cmatch m; const char s[] = ""; - VERIFY( regex_match(s, m, re) ); + VERIFY( regex_match_debug(s, m, re) ); VERIFY( m.size() == 2 ); VERIFY( m[0].matched ); VERIFY( m[1].matched ); @@ -46,7 +48,7 @@ test01() regex re("()*"); cmatch m; const char s[] = ""; - VERIFY( regex_match(s, m, re) ); + VERIFY( regex_match_debug(s, m, re) ); } } diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/hex.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/hex.cc index a73b742..b103061 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/hex.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/hex.cc @@ -25,7 +25,9 @@ #include #include +#include +using namespace __gnu_test; using namespace std; void @@ -33,7 +35,7 @@ test01() { bool test __attribute__((unused)) = true; - VERIFY(regex_match(":", regex("\\x3a"))); + VERIFY(regex_match_debug(":", regex("\\x3a"))); try { regex("\\u400x"); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/quoted_char.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/quoted_char.cc index b54f561..118c472 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/quoted_char.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/quoted_char.cc @@ -25,7 +25,9 @@ #include #include +#include +using namespace __gnu_test; using namespace std; void @@ -33,15 +35,15 @@ test01() { bool test __attribute__((unused)) = true; - VERIFY(regex_match("01", regex("\\d*"))); - VERIFY(regex_match("asdfjkl", regex("\\D*"))); - VERIFY(!regex_match("asdfjkl0", regex("\\D*"))); - VERIFY(regex_match("\r\t\v\f ", regex("\\s*"))); - VERIFY(regex_match("asdfjkl", regex("\\S*"))); - VERIFY(!regex_match("asdfjkl\r", regex("\\S*"))); - VERIFY(regex_match("_az", regex("\\w*"))); - VERIFY(regex_match("!@#$%", regex("\\W*"))); - VERIFY(!regex_match("_01234", regex("\\W*"))); + VERIFY(regex_match_debug("01", regex("\\d*"))); + VERIFY(regex_match_debug("asdfjkl", regex("\\D*"))); + VERIFY(!regex_match_debug("asdfjkl0", regex("\\D*"))); + VERIFY(regex_match_debug("\r\t\v\f ", regex("\\s*"))); + VERIFY(regex_match_debug("asdfjkl", regex("\\S*"))); + VERIFY(!regex_match_debug("asdfjkl\r", regex("\\S*"))); + VERIFY(regex_match_debug("_az", regex("\\w*"))); + VERIFY(regex_match_debug("!@#$%", regex("\\W*"))); + VERIFY(!regex_match_debug("_01234", regex("\\W*"))); } int diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/anymatcher.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/anymatcher.cc index c574908..323a2ff 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/anymatcher.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/anymatcher.cc @@ -25,7 +25,9 @@ #include #include +#include +using namespace __gnu_test; using namespace std; void @@ -37,7 +39,7 @@ test01() {\ wregex re(res);\ wstring st(s);\ - VERIFY(!regex_match(st, re));\ + VERIFY(!regex_match_debug(st, re));\ } TESTL(L".", L"\u2028"); TESTL(L".", L"\u2029"); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/hex.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/hex.cc index f9561be..876a7df 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/hex.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/hex.cc @@ -25,7 +25,9 @@ #include #include +#include +using namespace __gnu_test; using namespace std; void @@ -33,7 +35,7 @@ test01() { bool test __attribute__((unused)) = true; - VERIFY(regex_match(L"\u1234", wregex(L"\\u1234"))); + VERIFY(regex_match_debug(L"\u1234", wregex(L"\\u1234"))); } int diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_bracket_01.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_bracket_01.cc index 5d83785..c5f066b 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_bracket_01.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_bracket_01.cc @@ -25,6 +25,10 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; void test01() @@ -33,33 +37,33 @@ test01() { std::regex re("pre/[za-x]", std::regex::extended); - VERIFY( std::regex_match("pre/z", re) ); - VERIFY( std::regex_match("pre/a", re) ); - VERIFY( !std::regex_match("pre/y", re) ); + VERIFY( regex_match_debug("pre/z", re) ); + VERIFY( regex_match_debug("pre/a", re) ); + VERIFY( !regex_match_debug("pre/y", re) ); } { std::regex re("pre/[[:uPPer:]]", std::regex::extended); - VERIFY( std::regex_match("pre/Z", re) ); - VERIFY( !std::regex_match("pre/_", re) ); - VERIFY( !std::regex_match("pre/a", re) ); - VERIFY( !std::regex_match("pre/0", re) ); + VERIFY( regex_match_debug("pre/Z", re) ); + VERIFY( !regex_match_debug("pre/_", re) ); + VERIFY( !regex_match_debug("pre/a", re) ); + VERIFY( !regex_match_debug("pre/0", re) ); } { std::regex re("pre/[[:lOWer:]]", std::regex::extended | std::regex::icase); - VERIFY( std::regex_match("pre/Z", re) ); - VERIFY( std::regex_match("pre/a", re) ); + VERIFY( regex_match_debug("pre/Z", re) ); + VERIFY( regex_match_debug("pre/a", re) ); } { std::regex re("pre/[[:w:][.tilde.]]", std::regex::extended); - VERIFY( std::regex_match("pre/~", re) ); - VERIFY( std::regex_match("pre/_", re) ); - VERIFY( std::regex_match("pre/a", re) ); - VERIFY( std::regex_match("pre/0", re) ); + VERIFY( regex_match_debug("pre/~", re) ); + VERIFY( regex_match_debug("pre/_", re) ); + VERIFY( regex_match_debug("pre/a", re) ); + VERIFY( regex_match_debug("pre/0", re) ); } { std::regex re("pre/[[=a=]]", std::regex::extended); - VERIFY( std::regex_match("pre/a", re) ); - VERIFY( std::regex_match("pre/A", re) ); + VERIFY( regex_match_debug("pre/a", re) ); + VERIFY( regex_match_debug("pre/A", re) ); } } diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_plus.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_plus.cc index 375f34b..32bc24f 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_plus.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_plus.cc @@ -25,6 +25,10 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; void test01() @@ -35,7 +39,7 @@ test01() const char target[] = "aa"; std::cmatch m; - VERIFY( std::regex_match(target, m, re) ); + VERIFY( regex_match_debug(target, m, re) ); VERIFY( re.mark_count() == 1 ); VERIFY( m.size() == re.mark_count()+1 ); @@ -53,9 +57,9 @@ test01() VERIFY( m[1].second == target+sizeof(target)-1 ); VERIFY( m[1].matched == true ); - VERIFY(!std::regex_match("", std::regex("a+", std::regex::extended))); - VERIFY(std::regex_match("a", std::regex("a+", std::regex::extended))); - VERIFY(std::regex_match("aa", std::regex("a+", std::regex::extended))); + VERIFY(!regex_match_debug("", std::regex("a+", std::regex::extended))); + VERIFY(regex_match_debug("a", std::regex("a+", std::regex::extended))); + VERIFY(regex_match_debug("aa", std::regex("a+", std::regex::extended))); } diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_questionmark.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_questionmark.cc index 79b52a8..90e9eaf 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_questionmark.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_questionmark.cc @@ -25,6 +25,10 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; void test01() @@ -35,7 +39,7 @@ test01() char target[] = "a"; std::cmatch m; - VERIFY( std::regex_match(target, m, re) ); + VERIFY( regex_match_debug(target, m, re) ); VERIFY( re.mark_count() == 1 ); VERIFY( m.size() == re.mark_count()+1 ); @@ -53,9 +57,9 @@ test01() VERIFY( m[1].second == target+sizeof(target)-1 ); VERIFY( m[1].matched == true ); - VERIFY(std::regex_match("", std::regex("a?", std::regex::extended))); - VERIFY(std::regex_match("a", std::regex("a?", std::regex::extended))); - VERIFY(!std::regex_match("aa", std::regex("a?", std::regex::extended))); + VERIFY(regex_match_debug("", std::regex("a?", std::regex::extended))); + VERIFY(regex_match_debug("a", std::regex("a?", std::regex::extended))); + VERIFY(!regex_match_debug("aa", std::regex("a?", std::regex::extended))); } diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_range.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_range.cc index 62f825a..f9f7b6a 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_range.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_range.cc @@ -25,7 +25,9 @@ #include #include +#include +using namespace __gnu_test; using namespace std; void @@ -35,29 +37,29 @@ test01() regex re; re.assign("(ab){3}", std::regex::extended); - VERIFY(!regex_match("abab", re)); - VERIFY(regex_match("ababab", re)); - VERIFY(!regex_match("abababab", re)); + VERIFY(!regex_match_debug("abab", re)); + VERIFY(regex_match_debug("ababab", re)); + VERIFY(!regex_match_debug("abababab", re)); re.assign("(ab){3,}", std::regex::extended); - VERIFY(!regex_match("abab", re)); - VERIFY(regex_match("ababab", re)); - VERIFY(regex_match("abababab", re)); - VERIFY(regex_match("ababababab", re)); + VERIFY(!regex_match_debug("abab", re)); + VERIFY(regex_match_debug("ababab", re)); + VERIFY(regex_match_debug("abababab", re)); + VERIFY(regex_match_debug("ababababab", re)); re.assign("(ab){0,3}", std::regex::extended); - VERIFY(regex_match("", re)); - VERIFY(regex_match("ab", re)); - VERIFY(regex_match("abab", re)); - VERIFY(regex_match("ababab", re)); - VERIFY(!regex_match("abababab", re)); + VERIFY(regex_match_debug("", re)); + VERIFY(regex_match_debug("ab", re)); + VERIFY(regex_match_debug("abab", re)); + VERIFY(regex_match_debug("ababab", re)); + VERIFY(!regex_match_debug("abababab", re)); re.assign("(a|b){0,2}", std::regex::extended); - VERIFY(regex_match("", re)); - VERIFY(regex_match("a", re)); - VERIFY(regex_match("b", re)); - VERIFY(regex_match("aa", re)); - VERIFY(regex_match("ab", re)); - VERIFY(regex_match("ba", re)); - VERIFY(regex_match("bb", re)); - VERIFY(!regex_match("aaa", re)); + VERIFY(regex_match_debug("", re)); + VERIFY(regex_match_debug("a", re)); + VERIFY(regex_match_debug("b", re)); + VERIFY(regex_match_debug("aa", re)); + VERIFY(regex_match_debug("ab", re)); + VERIFY(regex_match_debug("ba", re)); + VERIFY(regex_match_debug("bb", re)); + VERIFY(!regex_match_debug("aaa", re)); } int diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_any.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_any.cc index 57628f1..cd87039 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_any.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_any.cc @@ -25,6 +25,10 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; void test01() @@ -35,7 +39,7 @@ test01() std::string target("aaba"); std::smatch m; - VERIFY( std::regex_match(target, m, re) ); + VERIFY( regex_match_debug(target, m, re) ); VERIFY( m.size() == re.mark_count()+1 ); VERIFY( m.empty() == false ); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_dispatch_01.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_dispatch_01.cc index 4634c7d..50141f0 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_dispatch_01.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_dispatch_01.cc @@ -38,10 +38,12 @@ template, _Alloc>&)(__m); VERIFY( (dynamic_cast - <__detail::_DFSExecutor<_Bi_iter, _Alloc, _Ch_type, _Rx_traits>*> - (&*__detail::__get_executor(__s, __e, __res, __re, __flags)) + <_DFSExecutor<_Bi_iter, _Alloc, _Ch_type, _Rx_traits>*> + (&*__get_executor<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, + _RegexExecutorPolicy::_S_auto>(__s, __e, __res, __re, __flags)) != nullptr) ); } diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_range_00_03.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_range_00_03.cc index e10dba8..e483b0a 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_range_00_03.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_range_00_03.cc @@ -25,6 +25,9 @@ #include #include +#include + +using namespace __gnu_test; void test01() @@ -35,7 +38,7 @@ test01() std::string target("aa"); std::smatch m; - VERIFY( std::regex_match(target, m, re) ); + VERIFY( regex_match_debug(target, m, re) ); VERIFY( m.size() == re.mark_count()+1 ); VERIFY( m.empty() == false ); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_range_01_03.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_range_01_03.cc index e715290..3879fc4 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_range_01_03.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_range_01_03.cc @@ -25,6 +25,10 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; void test01() @@ -35,7 +39,7 @@ test01() std::string target("aa"); std::smatch m; - VERIFY( std::regex_match(target, m, re) ); + VERIFY( regex_match_debug(target, m, re) ); VERIFY( m.size() == re.mark_count()+1 ); VERIFY( m.empty() == false ); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_range_02_03.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_range_02_03.cc index 62793b4..c2ebdf8 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_range_02_03.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/string_range_02_03.cc @@ -25,6 +25,10 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; void test01() @@ -35,7 +39,7 @@ test01() std::string target("aa"); std::smatch m; - VERIFY( std::regex_match(target, m, re) ); + VERIFY( regex_match_debug(target, m, re) ); VERIFY( m.size() == re.mark_count()+1 ); VERIFY( m.empty() == false ); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/wstring_locale.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/wstring_locale.cc index 6ab48ca..ba0ecd5 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/wstring_locale.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/wstring_locale.cc @@ -26,6 +26,10 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; void test01() @@ -37,7 +41,7 @@ test01() re2.imbue(std::locale("de_DE.UTF-8")); re2.assign(L"[[:upper:]]*", std::regex::extended); std::wsmatch m2; - VERIFY(std::regex_match(str2, m2, re2)); + VERIFY(regex_match_debug(str2, m2, re2)); } int diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/basic/string_01.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/basic/string_01.cc index ee487f1..fed8e7d 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/basic/string_01.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/basic/string_01.cc @@ -25,6 +25,10 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; void test01() @@ -35,7 +39,7 @@ test01() std::string target("xxasdfyy"); std::smatch m; - VERIFY( std::regex_search(target, m, re) ); + VERIFY( regex_search_debug(target, m, re) ); VERIFY( m.size() == re.mark_count()+1 ); VERIFY( m.empty() == false ); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/assertion.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/assertion.cc index 3064b3b..f7bce80 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/assertion.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/assertion.cc @@ -25,7 +25,9 @@ #include #include +#include +using namespace __gnu_test; using namespace std; void @@ -33,21 +35,21 @@ test01() { bool test __attribute__((unused)) = true; - VERIFY(!regex_search("2123456", regex("^1234"))); - VERIFY(regex_search("123456", regex("^1234"))); - VERIFY(regex_search("123456", regex("(5|^)1234"))); - VERIFY(regex_search("5123456", regex("(5|^)1234"))); - VERIFY(!regex_search("1234562", regex("3456$"))); - VERIFY(regex_search("123456", regex("3456$"))); - VERIFY(!regex_search("123456", regex("(?=1234)56"))); - VERIFY(regex_search("123456", regex("(?=1234)123456"))); - VERIFY(regex_search("123456", regex("(?!1234)56"))); - VERIFY(!regex_search("123456", regex("(?!1234)123456"))); + VERIFY(!regex_search_debug("2123456", regex("^1234"))); + VERIFY(regex_search_debug("123456", regex("^1234"))); + VERIFY(regex_search_debug("123456", regex("(5|^)1234"))); + VERIFY(regex_search_debug("5123456", regex("(5|^)1234"))); + VERIFY(!regex_search_debug("1234562", regex("3456$"))); + VERIFY(regex_search_debug("123456", regex("3456$"))); + VERIFY(!regex_search_debug("123456", regex("(?=1234)56"))); + VERIFY(regex_search_debug("123456", regex("(?=1234)123456"))); + VERIFY(regex_search_debug("123456", regex("(?!1234)56"))); + VERIFY(!regex_search_debug("123456", regex("(?!1234)123456"))); - VERIFY(regex_search("a-", regex("a\\b-"))); - VERIFY(!regex_search("ab", regex("a\\bb"))); - VERIFY(!regex_search("a-", regex("a\\B-"))); - VERIFY(regex_search("ab", regex("a\\Bb"))); + VERIFY(regex_search_debug("a-", regex("a\\b-"))); + VERIFY(!regex_search_debug("ab", regex("a\\bb"))); + VERIFY(!regex_search_debug("a-", regex("a\\B-"))); + VERIFY(regex_search_debug("ab", regex("a\\Bb"))); string s("This is a regular expression"); string sol[] = diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/flags.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/flags.cc index 4be406c..490ab1c 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/flags.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/flags.cc @@ -25,7 +25,9 @@ #include #include +#include +using namespace __gnu_test; using namespace std; void @@ -35,32 +37,34 @@ test01() cmatch m; regex re("((as)(df))", regex_constants::ECMAScript | regex_constants::nosubs); - VERIFY(regex_search("asdf", m, re)); + VERIFY(regex_search_debug("asdf", m, re)); VERIFY(m.size() == 1); VERIFY(m[0].matched && string(m[0].first, m[0].second) == "asdf"); - VERIFY( regex_search("a", regex("^a"))); - VERIFY(!regex_search("a", regex("^a"), regex_constants::match_not_bol)); - VERIFY( regex_search("a", regex("a$"))); - VERIFY(!regex_search("a", regex("a$"), regex_constants::match_not_eol)); - VERIFY( regex_search("a", regex("\\ba"))); - VERIFY(!regex_search("a", regex("\\ba"), regex_constants::match_not_bow)); - VERIFY( regex_search("a", regex("a\\b"))); - VERIFY(!regex_search("a", regex("a\\b"), regex_constants::match_not_eow)); - VERIFY( regex_search("", regex(""))); - VERIFY(!regex_search("", regex(""), regex_constants::match_not_null)); - VERIFY( regex_search("", regex("^$"))); - VERIFY(!regex_search("", regex("^$"), regex_constants::match_not_null)); - VERIFY( regex_search("aaa", m, regex("a*?"), - regex_constants::match_not_null)); + VERIFY( regex_search_debug("a", regex("^a"))); + VERIFY(!regex_search_debug("a", regex("^a"), regex_constants::match_not_bol)); + VERIFY( regex_search_debug("a", regex("a$"))); + VERIFY(!regex_search_debug("a", regex("a$"), regex_constants::match_not_eol)); + VERIFY( regex_search_debug("a", regex("\\ba"))); + VERIFY(!regex_search_debug("a", regex("\\ba"), + regex_constants::match_not_bow)); + VERIFY( regex_search_debug("a", regex("a\\b"))); + VERIFY(!regex_search_debug("a", regex("a\\b"), + regex_constants::match_not_eow)); + VERIFY( regex_search_debug("", regex(""))); + VERIFY(!regex_search_debug("", regex(""), regex_constants::match_not_null)); + VERIFY( regex_search_debug("", regex("^$"))); + VERIFY(!regex_search_debug("", regex("^$"), regex_constants::match_not_null)); + VERIFY( regex_search_debug("aaa", m, regex("a*?"), + regex_constants::match_not_null)); VERIFY(m[0].matched && string(m[0].first, m[0].second) == "a"); - VERIFY( regex_search("asdf", regex("sdf"))); - VERIFY(!regex_search("asdf", regex("sdf"), - regex_constants::match_continuous)); - VERIFY( regex_search(" a"+1, regex("\\ba"), - regex_constants::match_prev_avail)); - VERIFY( regex_search("ba"+1, regex("\\Ba"), - regex_constants::match_prev_avail)); + VERIFY( regex_search_debug("asdf", regex("sdf"))); + VERIFY(!regex_search_debug("asdf", regex("sdf"), + regex_constants::match_continuous)); + VERIFY( regex_search_debug(" a"+1, regex("\\ba"), + regex_constants::match_prev_avail)); + VERIFY( regex_search_debug("ba"+1, regex("\\Ba"), + regex_constants::match_prev_avail)); } int diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/greedy.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/greedy.cc index ad37ec8..107ced0 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/greedy.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/greedy.cc @@ -25,7 +25,9 @@ #include #include +#include +using namespace __gnu_test; using namespace std; void @@ -35,30 +37,30 @@ test01() cmatch m; #define TEST(i, s) VERIFY(m[i].matched && string(m[i].first, m[i].second) == s) - VERIFY(regex_search("aaaa", m, regex("a*"))); + VERIFY(regex_search_debug("aaaa", m, regex("a*"))); TEST(0, "aaaa"); - VERIFY(regex_search("aaaa", m, regex("a*?"))); + VERIFY(regex_search_debug("aaaa", m, regex("a*?"))); TEST(0, ""); - VERIFY(regex_search("aaaa", m, regex("a+"))); + VERIFY(regex_search_debug("aaaa", m, regex("a+"))); TEST(0, "aaaa"); - VERIFY(regex_search("aaaa", m, regex("a+?"))); + VERIFY(regex_search_debug("aaaa", m, regex("a+?"))); TEST(0, "a"); - VERIFY(regex_search("a", m, regex("a?"))); + VERIFY(regex_search_debug("a", m, regex("a?"))); TEST(0, "a"); - VERIFY(regex_search("a", m, regex("a??"))); + VERIFY(regex_search_debug("a", m, regex("a??"))); TEST(0, ""); - VERIFY(regex_search("", m, regex("a??"))); + VERIFY(regex_search_debug("", m, regex("a??"))); TEST(0, ""); - VERIFY(regex_search("aaaa", m, regex("(a+)(a+)"))); + VERIFY(regex_search_debug("aaaa", m, regex("(a+)(a+)"))); TEST(1, "aaa"); TEST(2, "a"); - VERIFY(regex_search("aaaa", m, regex("(a+?)(a+)"))); + VERIFY(regex_search_debug("aaaa", m, regex("(a+?)(a+)"))); TEST(1, "a"); TEST(2, "aaa"); - VERIFY(regex_search("aaaa", m, regex("(a+?)(a+)"))); + VERIFY(regex_search_debug("aaaa", m, regex("(a+?)(a+)"))); TEST(1, "a"); TEST(2, "aaa"); - VERIFY(regex_search("aaaa", m, regex("(a+?)(a+?)"))); + VERIFY(regex_search_debug("aaaa", m, regex("(a+?)(a+?)"))); TEST(1, "a"); TEST(2, "a"); } diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/string_01.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/string_01.cc index ec25875..c07e7ef 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/string_01.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/ecma/string_01.cc @@ -25,13 +25,17 @@ #include #include +#include + +using namespace __gnu_test; +using namespace std; void test01() { bool test __attribute__((unused)) = true; - VERIFY(std::regex_search("", std::regex(""))); + VERIFY(regex_search_debug("", std::regex(""))); } int diff --git a/libstdc++-v3/testsuite/28_regex/match_results/format.cc b/libstdc++-v3/testsuite/28_regex/match_results/format.cc index be08016..659ffdc 100644 --- a/libstdc++-v3/testsuite/28_regex/match_results/format.cc +++ b/libstdc++-v3/testsuite/28_regex/match_results/format.cc @@ -25,8 +25,10 @@ #include #include +#include using namespace std; +using namespace __gnu_test; void test01() @@ -34,8 +36,8 @@ test01() bool test __attribute__((unused)) = true; cmatch m; - VERIFY(regex_search("*** this is a string !!!", m, - regex("(\\w+) (\\w+) (\\w+) (\\w+)"))); + VERIFY(regex_search_debug("*** this is a string !!!", m, + regex("(\\w+) (\\w+) (\\w+) (\\w+)"))); VERIFY(m.format("$&|$`|$3|$4|$2|$1|$'$$$") == "this is a string|*** |a|string|is|this| !!!$$"); VERIFY(m.format("&|\\3|\\4|\\2|\\1|\\", diff --git a/libstdc++-v3/testsuite/util/testsuite_regex.h b/libstdc++-v3/testsuite/util/testsuite_regex.h index ebd72a6..17be78d 100644 --- a/libstdc++-v3/testsuite/util/testsuite_regex.h +++ b/libstdc++-v3/testsuite/util/testsuite_regex.h @@ -31,9 +31,12 @@ namespace __gnu_test // Test on a compilation of simple expressions, throw regex_error on error. typedef std::regex regex_type; typedef regex_type::flag_type flag_type; + typedef std::regex_constants::match_flag_type match_flag_type; typedef std::regex_constants::error_type error_type; typedef std::size_t size_type; typedef std::string string_type; + using std::basic_regex; + using std::match_results; // Utilities struct regex_expected_fail { }; @@ -126,5 +129,177 @@ namespace __gnu_test } } + // regex_match_debug behaves like regex_match, but will run *two* executors + // (if there's no back-reference) and check if their results agree. If not, + // an exception throws. One can use them just in the way of using regex_match. + template + bool + regex_match_debug(_Bi_iter __s, + _Bi_iter __e, + match_results<_Bi_iter, _Alloc>& __m, + const basic_regex<_Ch_type, _Rx_traits>& __re, + match_flag_type __flags + = std::regex_constants::match_default) + { + using namespace std::__detail; + auto __res1 = __regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, + _RegexExecutorPolicy::_S_auto, true> + (__s, __e, __m, __re, __flags); + match_results<_Bi_iter, _Alloc> __mm; + auto __res2 = __regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, + _RegexExecutorPolicy::_S_force_dfs, true> + (__s, __e, __mm, __re, __flags); + if (__res1 == __res2 && __m == __mm) + return __res1; + throw(std::exception()); + } + + // No match_results version + template + inline bool + regex_match_debug(_Bi_iter __first, + _Bi_iter __last, + const basic_regex<_Ch_type, _Rx_traits>& __re, + match_flag_type __flags + = std::regex_constants::match_default) + { + match_results<_Bi_iter> __what; + return regex_match_debug(__first, __last, __what, __re, __flags); + } + + // C-string version + template + inline bool + regex_match_debug(const _Ch_type* __s, + match_results& __m, + const basic_regex<_Ch_type, _Rx_traits>& __re, + match_flag_type __f + = std::regex_constants::match_default) + { return regex_match_debug(__s, __s + _Rx_traits::length(__s), + __m, __re, __f); } + + // C-string version without match_results + template + inline bool + regex_match_debug(const _Ch_type* __s, + const basic_regex<_Ch_type, _Rx_traits>& __re, + match_flag_type __f + = std::regex_constants::match_default) + { return regex_match_debug(__s, __s + _Rx_traits::length(__s), + __re, __f); } + + // std::basic_string version + template + inline bool + regex_match_debug(const std::basic_string<_Ch_type, _Ch_traits, + _Ch_alloc>& __s, + match_results::const_iterator, + _Alloc>& __m, + const basic_regex<_Ch_type, _Rx_traits>& __re, + match_flag_type __flags + = std::regex_constants::match_default) + { return regex_match_debug(__s.begin(), __s.end(), + __m, __re, __flags); } + + // std::basic_string version without match_results + template + inline bool + regex_match_debug(const std::basic_string<_Ch_type, _Ch_traits, + _Str_allocator>& __s, + const basic_regex<_Ch_type, _Rx_traits>& __re, + match_flag_type __flags + = std::regex_constants::match_default) + { return regex_match_debug(__s.begin(), __s.end(), __re, __flags); } + + // regex_match_debug behaves like regex_match, but will run *two* executors + // (if there's no back-reference) and check if their results agree. If not, + // an exception throws. One can use them just in the way of using regex_match. + template + bool + regex_search_debug(_Bi_iter __s, + _Bi_iter __e, + match_results<_Bi_iter, _Alloc>& __m, + const basic_regex<_Ch_type, _Rx_traits>& __re, + match_flag_type __flags + = std::regex_constants::match_default) + { + using namespace std::__detail; + auto __res1 = __regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, + _RegexExecutorPolicy::_S_auto, false> + (__s, __e, __m, __re, __flags); + match_results<_Bi_iter, _Alloc> __mm; + auto __res2 = __regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, + _RegexExecutorPolicy::_S_force_dfs, false> + (__s, __e, __mm, __re, __flags); + if (__res1 == __res2 && __m == __mm) + return __res1; + throw(std::exception()); // Let test fail. Give it a name. + } + + // No match_results version + template + inline bool + regex_search_debug(_Bi_iter __first, + _Bi_iter __last, + const basic_regex<_Ch_type, _Rx_traits>& __re, + match_flag_type __flags + = std::regex_constants::match_default) + { + match_results<_Bi_iter> __what; + return regex_search_debug(__first, __last, __what, __re, __flags); + } + + // C-string version + template + inline bool + regex_search_debug(const _Ch_type* __s, + match_results& __m, + const basic_regex<_Ch_type, _Rx_traits>& __e, + match_flag_type __f + = std::regex_constants::match_default) + { return regex_search_debug(__s, __s + _Rx_traits::length(__s), + __m, __e, __f); } + + // C-string version without match_results + template + inline bool + regex_search_debug(const _Ch_type* __s, + const basic_regex<_Ch_type, _Rx_traits>& __e, + match_flag_type __f + = std::regex_constants::match_default) + { return regex_search_debug(__s, __s + _Rx_traits::length(__s), + __e, __f); } + + // std::basic_string version + template + inline bool + regex_search_debug(const std::basic_string<_Ch_type, _Ch_traits, + _Ch_alloc>& __s, + match_results::const_iterator, _Alloc>& + __m, + const basic_regex<_Ch_type, _Rx_traits>& __e, + match_flag_type __f + = std::regex_constants::match_default) + { return regex_search_debug(__s.begin(), __s.end(), __m, __e, __f); } + + // std::basic_string version without match_results + template + inline bool + regex_search_debug(const std::basic_string<_Ch_type, _Ch_traits, + _String_allocator>& __s, + const basic_regex<_Ch_type, _Rx_traits>& __e, + match_flag_type __f + = std::regex_constants::match_default) + { return regex_search_debug(__s.begin(), __s.end(), __e, __f); } + } // namespace __gnu_test #endif