diff options
author | Tim Shen <timshen@google.com> | 2015-12-15 04:50:29 +0000 |
---|---|---|
committer | Tim Shen <timshen@gcc.gnu.org> | 2015-12-15 04:50:29 +0000 |
commit | 3ce38f68f93279b193ecb91cdc3635db6f9c810f (patch) | |
tree | fe2c602d1e564ff187667484cd664744240ba9e6 | |
parent | fcb9363eb9ba94b8e157444dc7ac2c93e69d6c58 (diff) | |
download | gcc-3ce38f68f93279b193ecb91cdc3635db6f9c810f.zip gcc-3ce38f68f93279b193ecb91cdc3635db6f9c810f.tar.gz gcc-3ce38f68f93279b193ecb91cdc3635db6f9c810f.tar.bz2 |
re PR libstdc++/68863 (Regular expressions: Backreferences don't work in negative lookahead)
PR libstdc++/68863
* include/bits/regex_executor.tcc (_Executor::_M_lookahead):
Copy the captured content for lookahead, so that the backreferences
inside can refer to them.
* testsuite/28_regex/algorithms/regex_match/ecma/char/68863.cc:
New testcase.
From-SVN: r231641
-rw-r--r-- | libstdc++-v3/ChangeLog | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/regex_executor.tcc | 5 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/68863.cc | 43 |
3 files changed, 56 insertions, 1 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 5ab82ad..7f4e797 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2015-12-15 Tim Shen <timshen@google.com> + + PR libstdc++/68863 + * include/bits/regex_executor.tcc (_Executor::_M_lookahead): + Copy the captured content for lookahead, so that the backreferences + inside can refer to them. + * testsuite/28_regex/algorithms/regex_match/ecma/char/68863.cc: + New testcase. + 2015-12-14 Ville Voutilainen <ville.voutilainen@gmail.com> Document the implementation of Logical Operator Type Traits. diff --git a/libstdc++-v3/include/bits/regex_executor.tcc b/libstdc++-v3/include/bits/regex_executor.tcc index a13f0d5..f5be4d7 100644 --- a/libstdc++-v3/include/bits/regex_executor.tcc +++ b/libstdc++-v3/include/bits/regex_executor.tcc @@ -147,7 +147,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>:: _M_lookahead(_StateIdT __next) { - _ResultsVec __what(_M_cur_results.size()); + // Backreferences may refer to captured content. + // We may want to make this faster by not copying, + // but let's not be clever prematurely. + _ResultsVec __what(_M_cur_results); _Executor __sub(_M_current, _M_end, __what, _M_re, _M_flags); __sub._M_states._M_start = __next; if (__sub._M_search_from_first()) diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/68863.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/68863.cc new file mode 100644 index 0000000..9e7a9a7 --- /dev/null +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/68863.cc @@ -0,0 +1,43 @@ +// { dg-options "-std=gnu++11" } + +// Copyright (C) 2015 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// 28.11.2 regex_match + +#include <regex> +#include <testsuite_hooks.h> +#include <testsuite_regex.h> + +using namespace __gnu_test; +using namespace std; + +// libstdc++/68863 +void +test01() +{ + bool test __attribute__((unused)) = true; + + VERIFY(!std::regex_match("aa", std::regex("(.)(?!\\1)."))); +} + +int +main() +{ + test01(); + return 0; +} |