mirror of git://gcc.gnu.org/git/gcc.git
re PR libstdc++/83601 (std::regex_replace C++14 conformance issue: escaping in SED mode)
PR libstdc++/83601 * include/bits/regex.tcc (regex_replace): Fix escaping in sed. * testsuite/28_regex/algorithms/regex_replace/char/pr83601.cc: Tests. * testsuite/28_regex/algorithms/regex_replace/wchar_t/pr83601.cc: Tests. From-SVN: r256654
This commit is contained in:
parent
8bc5a5c57c
commit
8532713fc4
|
|
@ -1,3 +1,10 @@
|
||||||
|
2018-01-13 Tim Shen <timshen@google.com>
|
||||||
|
|
||||||
|
PR libstdc++/83601
|
||||||
|
* include/bits/regex.tcc (regex_replace): Fix escaping in sed.
|
||||||
|
* testsuite/28_regex/algorithms/regex_replace/char/pr83601.cc: Tests.
|
||||||
|
* testsuite/28_regex/algorithms/regex_replace/wchar_t/pr83601.cc: Tests.
|
||||||
|
|
||||||
2018-01-12 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
2018-01-12 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
||||||
|
|
||||||
PR libstdc++/64054
|
PR libstdc++/64054
|
||||||
|
|
|
||||||
|
|
@ -373,22 +373,32 @@ namespace __detail
|
||||||
|
|
||||||
if (__flags & regex_constants::format_sed)
|
if (__flags & regex_constants::format_sed)
|
||||||
{
|
{
|
||||||
for (; __fmt_first != __fmt_last;)
|
bool __escaping = false;
|
||||||
if (*__fmt_first == '&')
|
for (; __fmt_first != __fmt_last; __fmt_first++)
|
||||||
{
|
{
|
||||||
__output(0);
|
if (__escaping)
|
||||||
++__fmt_first;
|
{
|
||||||
}
|
__escaping = false;
|
||||||
else if (*__fmt_first == '\\')
|
if (__fctyp.is(__ctype_type::digit, *__fmt_first))
|
||||||
{
|
__output(__traits.value(*__fmt_first, 10));
|
||||||
if (++__fmt_first != __fmt_last
|
else
|
||||||
&& __fctyp.is(__ctype_type::digit, *__fmt_first))
|
*__out++ = *__fmt_first;
|
||||||
__output(__traits.value(*__fmt_first++, 10));
|
continue;
|
||||||
else
|
}
|
||||||
*__out++ = '\\';
|
if (*__fmt_first == '\\')
|
||||||
}
|
{
|
||||||
else
|
__escaping = true;
|
||||||
*__out++ = *__fmt_first++;
|
continue;
|
||||||
|
}
|
||||||
|
if (*__fmt_first == '&')
|
||||||
|
{
|
||||||
|
__output(0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
*__out++ = *__fmt_first;
|
||||||
|
}
|
||||||
|
if (__escaping)
|
||||||
|
*__out++ = '\\';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
// { dg-do run { target c++11 } }
|
||||||
|
|
||||||
|
// Copyright (C) 2018 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/>.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <regex>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
|
||||||
|
// libstdc++/83601
|
||||||
|
int main() {
|
||||||
|
auto format = std::regex_constants::format_sed;
|
||||||
|
auto out = regex_replace("ab", std::regex("(a)(b)"), R"(\\1\&\\2)", format);
|
||||||
|
VERIFY(out == R"(\1&\2)");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
// { dg-do run { target c++11 } }
|
||||||
|
|
||||||
|
// Copyright (C) 2018 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/>.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <regex>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
|
||||||
|
// libstdc++/83601
|
||||||
|
void frep(const wchar_t *istr, const wchar_t *rstr, const wchar_t *ostr) {
|
||||||
|
std::basic_regex<wchar_t> wrgx(L"(a*)(b+)");
|
||||||
|
std::basic_string<wchar_t> wstr = istr, wret = ostr, test;
|
||||||
|
std::regex_replace(std::back_inserter(test), wstr.begin(), wstr.end(),
|
||||||
|
wrgx, std::basic_string<wchar_t>(rstr),
|
||||||
|
std::regex_constants::format_sed);
|
||||||
|
VERIFY(test == wret);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
frep(L"xbbyabz", L"!\\\\2!", L"x!\\2!y!\\2!z");
|
||||||
|
frep(L"xbbyabz", L"!\\\\0!", L"x!\\0!y!\\0!z");
|
||||||
|
frep(L"xbbyabz", L"!\\&!", L"x!&!y!&!z");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue