Commit 244901a5 by Tim Shen Committed by Tim Shen

re PR libstdc++/69794 (std::regex_search match failure with regex object with flags grep|icase)

2016-02-16  Tim Shen  <timshen@google.com>

	PR libstdc++/69794
	* include/bits/regex_scanner.h: Add different special character
	sets for grep and egrep regex.
	* include/bits/regex_scanner.tcc: Use _M_spec_char more uniformly.
	* testsuite/28_regex/regression.cc: Add new testcase.

From-SVN: r233482
parent 6bab4c63
2016-02-16 Tim Shen <timshen@google.com>
PR libstdc++/69794
* include/bits/regex_scanner.h: Add different special character
sets for grep and egrep regex.
* include/bits/regex_scanner.tcc: Use _M_spec_char more uniformly.
* testsuite/28_regex/regression.cc: Add new testcase.
2016-02-08 Jonathan Wakely <jwakely@redhat.com> 2016-02-08 Jonathan Wakely <jwakely@redhat.com>
* acinclude.m4 (GLIBCXX_CHECK_MATH11_PROTO): Remove accidentally * acinclude.m4 (GLIBCXX_CHECK_MATH11_PROTO): Remove accidentally
......
...@@ -95,11 +95,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -95,11 +95,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
: _M_awk_escape_tbl), : _M_awk_escape_tbl),
_M_spec_char(_M_is_ecma() _M_spec_char(_M_is_ecma()
? _M_ecma_spec_char ? _M_ecma_spec_char
: _M_is_basic() : _M_flags & regex_constants::basic
? _M_basic_spec_char ? _M_basic_spec_char
: _M_extended_spec_char), : _M_flags & regex_constants::extended
? _M_extended_spec_char
: _M_flags & regex_constants::grep
? ".[\\*^$\n"
: _M_flags & regex_constants::egrep
? ".[\\()*+?{|^$\n"
: _M_flags & regex_constants::awk
? _M_extended_spec_char
: nullptr),
_M_at_bracket_start(false) _M_at_bracket_start(false)
{ } { __glibcxx_assert(_M_spec_char); }
protected: protected:
const char* const char*
...@@ -137,6 +145,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -137,6 +145,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return _M_flags & regex_constants::awk; } { return _M_flags & regex_constants::awk; }
protected: protected:
// TODO: Make them static in the next abi change.
const std::pair<char, _TokenT> _M_token_tbl[9] = const std::pair<char, _TokenT> _M_token_tbl[9] =
{ {
{'^', _S_token_line_begin}, {'^', _S_token_line_begin},
......
...@@ -97,9 +97,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -97,9 +97,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_scan_normal() _M_scan_normal()
{ {
auto __c = *_M_current++; auto __c = *_M_current++;
const char* __pos;
if (std::strchr(_M_spec_char, _M_ctype.narrow(__c, '\0')) == nullptr) if (std::strchr(_M_spec_char, _M_ctype.narrow(__c, ' ')) == nullptr)
{ {
_M_token = _S_token_ord_char; _M_token = _S_token_ord_char;
_M_value.assign(1, __c); _M_value.assign(1, __c);
...@@ -177,12 +176,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -177,12 +176,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_state = _S_state_in_brace; _M_state = _S_state_in_brace;
_M_token = _S_token_interval_begin; _M_token = _S_token_interval_begin;
} }
else if (((__pos = std::strchr(_M_spec_char, _M_ctype.narrow(__c, '\0'))) else if (__c != ']' && __c != '}')
!= nullptr
&& *__pos != '\0'
&& __c != ']'
&& __c != '}')
|| (_M_is_grep() && __c == '\n'))
{ {
auto __it = _M_token_tbl; auto __it = _M_token_tbl;
auto __narrowc = _M_ctype.narrow(__c, '\0'); auto __narrowc = _M_ctype.narrow(__c, '\0');
......
...@@ -33,10 +33,26 @@ test01() ...@@ -33,10 +33,26 @@ test01()
regex re("((.)", regex_constants::basic); regex re("((.)", regex_constants::basic);
} }
void
test02()
{
bool test __attribute__((unused)) = true;
std::string re_str
{
"/abcd" "\n"
"/aecf" "\n"
"/ghci"
};
auto rx = std::regex(re_str, std::regex_constants::grep | std::regex_constants::icase);
VERIFY(std::regex_search("/abcd", rx));
}
int int
main() main()
{ {
test01(); test01();
test02();
return 0; return 0;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment