+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
: _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*
{ 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},
_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);
_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');
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;
}