From patchwork Fri Feb 14 15:38:16 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Shen X-Patchwork-Id: 320479 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 34E912C00A7 for ; Sat, 15 Feb 2014 02:38:29 +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=PD7UHNKXjsDwe081o6 ZyrSmIrH2gvfbOQsjpavlpXLGF+9of3QpBE2eRDfuthkZAeWyotLKzunoo7lYxjv slNXKSW7OpEJLfyssvuFdelEkpjRHS4XzJVVFiD8ui8LePpoVsL57JEzy3c+mr18 4YSr4rN4nKCqxGUYMgWHkdbxA= 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=9Pf17B7YmquStW84C5WTytGm EKI=; b=MML2lkyHzPcWS8jmjTJ6q3Dgj4IYGnU7XJ3HXsR7hV2q79Sx5TRyWP2+ P+Q8Lxht5/CbZIL4RYvif6OzijlZIPcoMbS5BSMSJJFJ5hFMfRcdAgmSMEV8DfB7 BGR9vOu6UWvKhCICDRA0/2MTqrASksnrWCaggG9P1ggXPfL3/X8= Received: (qmail 31162 invoked by alias); 14 Feb 2014 15:38:21 -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 31145 invoked by uid 89); 14 Feb 2014 15:38:21 -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-f48.google.com Received: from mail-oa0-f48.google.com (HELO mail-oa0-f48.google.com) (209.85.219.48) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Fri, 14 Feb 2014 15:38:18 +0000 Received: by mail-oa0-f48.google.com with SMTP id l6so14659668oag.35 for ; Fri, 14 Feb 2014 07:38:16 -0800 (PST) MIME-Version: 1.0 X-Received: by 10.182.233.201 with SMTP id ty9mr7151631obc.29.1392392296390; Fri, 14 Feb 2014 07:38:16 -0800 (PST) Received: by 10.182.162.33 with HTTP; Fri, 14 Feb 2014 07:38:16 -0800 (PST) In-Reply-To: <52FDF704.9050800@oracle.com> References: <52FDF704.9050800@oracle.com> Date: Fri, 14 Feb 2014 10:38:16 -0500 Message-ID: Subject: Re: std::regex_replace behaviour (LWG DR 2213) From: Tim Shen To: Paolo Carlini Cc: Jonathan Wakely , "libstdc++" , gcc-patches X-IsSubscribed: yes On Fri, Feb 14, 2014 at 5:59 AM, Paolo Carlini wrote: > .. I think it would be cleaner to have new, separate testcases, named after > 2213. This is what we always did in the past when we implemented resolutions > of DRs. No problem. 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..b1222ba 100644 --- a/libstdc++-v3/testsuite/28_regex/match_results/format.cc +++ b/libstdc++-v3/testsuite/28_regex/match_results/format.cc @@ -45,9 +45,25 @@ 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}; + VERIFY(m.format(buff, fmt.data(), fmt.data() + fmt.size(), + regex_constants::format_sed) == buff + res.size()); + VERIFY(string(buff) == "|asdf|asdf|"); +} + int main() { test01(); + test02(); return 0; }