From patchwork Wed Feb 26 19:47:03 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Shen X-Patchwork-Id: 324606 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 8C3D62C0096 for ; Thu, 27 Feb 2014 06:47:15 +1100 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; q=dns; s=default; b=OnZj4bBRHGYayX4I5S FT8XYqv/g/yyKj4XKnuaym+ImRO20FSPI+fsvLtKaWaIJgVQCuH8ZY9cQ/Zz0K2r +MPCFmbJKcC95beUjolQlcSW9C5aW6d5suoCVof2Nfntiji3kNzvFVXfX+ijCwVj 7QfGQsh9mIo2C2+yFDtWi8XXc= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; s=default; bh=puw5R0jAJZdfeD4s/ZMyQDni EZk=; b=pzqs+llETMp3TPGrLcChp+bGwQfr97Mzn7t+I3fMTVMBWORBhHQbOwEf HRPQvAiu7clehT9FWWWWDsbttKM9jPb9je1IVr8/mwZPR3T0vOSyYlRWDhlKDPki wBW/PBXYBodmIr+g6zRF6wxwjoxTbjbwhEOc3cxRUEHCNyqzbTY= Received: (qmail 9416 invoked by alias); 26 Feb 2014 19:47:08 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 9398 invoked by uid 89); 26 Feb 2014 19:47:07 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL, BAYES_00, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail-oa0-f47.google.com Received: from mail-oa0-f47.google.com (HELO mail-oa0-f47.google.com) (209.85.219.47) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Wed, 26 Feb 2014 19:47:06 +0000 Received: by mail-oa0-f47.google.com with SMTP id h16so1377907oag.6 for ; Wed, 26 Feb 2014 11:47:04 -0800 (PST) MIME-Version: 1.0 X-Received: by 10.182.33.35 with SMTP id o3mr4388498obi.15.1393444024614; Wed, 26 Feb 2014 11:47:04 -0800 (PST) Received: by 10.182.250.65 with HTTP; Wed, 26 Feb 2014 11:47:03 -0800 (PST) In-Reply-To: References: <52FDF704.9050800@oracle.com> Date: Wed, 26 Feb 2014 14:47:03 -0500 Message-ID: Subject: Re: std::regex_replace behaviour (LWG DR 2213) From: Tim Shen To: "libstdc++" , gcc-patches Cc: Paolo Carlini , Jonathan Wakely X-IsSubscribed: yes > Booted & tested with -m32 and -m64 respectively, and committed. Here's the committed version. diff --git a/libstdc++-v3/include/bits/regex.tcc b/libstdc++-v3/include/bits/regex.tcc index 73f55df..5fa1f01 100644 --- a/libstdc++-v3/include/bits/regex.tcc +++ b/libstdc++-v3/include/bits/regex.tcc @@ -425,7 +425,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { auto& __sub = _Base_type::operator[](__idx); if (__sub.matched) - std::copy(__sub.first, __sub.second, __out); + __out = std::copy(__sub.first, __sub.second, __out); }; if (__flags & regex_constants::format_sed) @@ -455,7 +455,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (__next == __fmt_last) break; - std::copy(__fmt_first, __next, __out); + __out = std::copy(__fmt_first, __next, __out); auto __eat = [&](char __ch) -> bool { @@ -493,7 +493,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION *__out++ = '$'; __fmt_first = __next; } - std::copy(__fmt_first, __fmt_last, __out); + __out = std::copy(__fmt_first, __fmt_last, __out); } return __out; } @@ -512,7 +512,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (__i == __end) { if (!(__flags & regex_constants::format_no_copy)) - std::copy(__first, __last, __out); + __out = std::copy(__first, __last, __out); } else { @@ -521,14 +521,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION for (; __i != __end; ++__i) { if (!(__flags & regex_constants::format_no_copy)) - std::copy(__i->prefix().first, __i->prefix().second, __out); + __out = std::copy(__i->prefix().first, __i->prefix().second, + __out); __out = __i->format(__out, __fmt, __fmt + __len, __flags); __last = __i->suffix(); if (__flags & regex_constants::format_first_only) break; } if (!(__flags & regex_constants::format_no_copy)) - std::copy(__last.first, __last.second, __out); + __out = std::copy(__last.first, __last.second, __out); } return __out; } diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_replace/char/dr2213.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_replace/char/dr2213.cc new file mode 100644 index 0000000..b2aeac0 --- /dev/null +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_replace/char/dr2213.cc @@ -0,0 +1,49 @@ +// { dg-options "-std=gnu++11" } + +// +// Copyright (C) 2014 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 +// . + +// 28.11.4 regex_replace +// Tests ECMAScript regex_replace's _Out_iter return value. + +#include +#include + +using namespace std; + +void +test01() +{ + bool test __attribute__((unused)) = true; + + char buff[4096] = {0}; + regex re("asdf"); + cmatch m; + string s = "asdf"; + string res = "|asdf|asdf|"; + VERIFY(regex_replace(buff, s.data(), s.data() + s.size(), re, "|&|\\0|", + regex_constants::format_sed) == buff + res.size()); + VERIFY(res == buff); +} + +int +main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/28_regex/match_results/format.cc b/libstdc++-v3/testsuite/28_regex/match_results/format.cc index 11e3bdb..e71a232 100644 --- a/libstdc++-v3/testsuite/28_regex/match_results/format.cc +++ b/libstdc++-v3/testsuite/28_regex/match_results/format.cc @@ -45,9 +45,26 @@ test01() == "this is a string|a|string|is|this|\\"); } +void +test02() +{ + bool test __attribute__((unused)) = true; + + regex re("asdf"); + cmatch m; + regex_match("asdf", m, re); + string fmt = "|&|\\0|"; + char buff[4096] = {0}; + string res = "|asdf|asdf|"; + VERIFY(m.format(buff, fmt.data(), fmt.data() + fmt.size(), + regex_constants::format_sed) == buff + res.size()); + VERIFY(res == buff); +} + int main() { test01(); + test02(); return 0; }