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
This commit is contained in:
parent
6bab4c63c4
commit
244901a572
4 changed files with 38 additions and 11 deletions
|
@ -1,3 +1,11 @@
|
|||
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>
|
||||
|
||||
* acinclude.m4 (GLIBCXX_CHECK_MATH11_PROTO): Remove accidentally
|
||||
|
|
|
@ -95,11 +95,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
: _M_awk_escape_tbl),
|
||||
_M_spec_char(_M_is_ecma()
|
||||
? _M_ecma_spec_char
|
||||
: _M_is_basic()
|
||||
: _M_flags & regex_constants::basic
|
||||
? _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)
|
||||
{ }
|
||||
{ __glibcxx_assert(_M_spec_char); }
|
||||
|
||||
protected:
|
||||
const char*
|
||||
|
@ -137,6 +145,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
{ return _M_flags & regex_constants::awk; }
|
||||
|
||||
protected:
|
||||
// TODO: Make them static in the next abi change.
|
||||
const std::pair<char, _TokenT> _M_token_tbl[9] =
|
||||
{
|
||||
{'^', _S_token_line_begin},
|
||||
|
|
|
@ -97,9 +97,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
_M_scan_normal()
|
||||
{
|
||||
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_value.assign(1, __c);
|
||||
|
@ -177,12 +176,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
_M_state = _S_state_in_brace;
|
||||
_M_token = _S_token_interval_begin;
|
||||
}
|
||||
else if (((__pos = std::strchr(_M_spec_char, _M_ctype.narrow(__c, '\0')))
|
||||
!= nullptr
|
||||
&& *__pos != '\0'
|
||||
&& __c != ']'
|
||||
&& __c != '}')
|
||||
|| (_M_is_grep() && __c == '\n'))
|
||||
else if (__c != ']' && __c != '}')
|
||||
{
|
||||
auto __it = _M_token_tbl;
|
||||
auto __narrowc = _M_ctype.narrow(__c, '\0');
|
||||
|
|
|
@ -33,10 +33,26 @@ test01()
|
|||
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
|
||||
main()
|
||||
{
|
||||
test01();
|
||||
test02();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue