From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 89370 invoked by alias); 20 Sep 2017 16:52:14 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 89359 invoked by uid 89); 20 Sep 2017 16:52:14 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-11.9 required=5.0 tests=BAYES_00,GIT_PATCH_2,GIT_PATCH_3,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 20 Sep 2017 16:52:12 +0000 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5D4793D948; Wed, 20 Sep 2017 16:52:11 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 5D4793D948 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=jwakely@redhat.com Received: from localhost (unknown [10.33.36.48]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0F58B60C9A; Wed, 20 Sep 2017 16:52:10 +0000 (UTC) Date: Wed, 20 Sep 2017 16:52:00 -0000 From: Jonathan Wakely To: Daniel =?iso-8859-1?Q?Kr=FCgler?= Cc: Tim Song , libstdc++@gnu.org, gcc-patches Subject: Re: [PATCH] PR libstdc++/79162 ambiguity in string assignment due to string_view overload (LWG 2946) Message-ID: <20170920165210.GQ4582@redhat.com> References: <20170904154846.GY4582@redhat.com> <20170920153641.GP4582@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1; format=flowed Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20170920153641.GP4582@redhat.com> X-Clacks-Overhead: GNU Terry Pratchett User-Agent: Mutt/1.8.3 (2017-05-23) X-SW-Source: 2017-09/txt/msg01386.txt.bz2 On 20/09/17 16:36 +0100, Jonathan Wakely wrote: >On 04/09/17 16:48 +0100, Jonathan Wakely wrote: >>On 30/07/17 15:01 +0200, Daniel Krügler wrote: >>>2017-07-28 22:40 GMT+02:00 Daniel Krügler : >>>>2017-07-28 22:29 GMT+02:00 Daniel Krügler : >>>>>2017-07-28 22:25 GMT+02:00 Tim Song : >>>>>>On Fri, Jul 28, 2017 at 4:10 PM, Daniel Krügler >>>>>> wrote: >>>>>>>+ // Performs an implicit conversion from _Tp to __sv_type. >>>>>>>+ template >>>>>>>+ static __sv_type _S_to_string_view(const _Tp& __svt) >>>>>>>+ { >>>>>>>+ return __svt; >>>>>>>+ } >>>>>> >>>>>>I might have gone for >>>>>> >>>>>>+ static __sv_type _S_to_string_view(__sv_type __svt) noexcept >>>>>>+ { >>>>>>+ return __svt; >>>>>>+ } >>>>>> >>>>>>With that, we can also use noexcept(_S_to_string_view(__t)) to make up >>>>>>for the absence of is_nothrow_convertible (basically the same thing I >>>>>>did in LWG 2993's PR). >>>>> >>>>>Agreed, that makes very much sense. I will adjust the P/R, but before >>>>>I resubmit I would like to get feedback whether the other two compare >>>>>functions also should become conditionally noexcept. >>>> >>>>Locally I have now performed the sole change of the _S_to_string_view >>>>declaration getting rid of the template, but would also like to gather >>>>feedback from the maintainers whether I should also change the form of >>>>the conditional noexcept to use the expression >>>> >>>>noexcept(_S_to_string_view(__t)) >>>> >>>>instead of the current >>>> >>>>is_same<_Tp, __sv_type>::value >>>> >>>>as suggested by Tim Song. >>>> >>>>I'm asking also, because I have a paper proposing to standardize >>>>is_nothrow_convertible submitted for the upcoming C++ mailing - This >>>>would be one of the first applications in the library ;-) >>> >>>A slightly revised patch update: It replaces the _S_to_string_view >>>template by a simpler _S_to_string_view function as of Tim Song's >>>suggestion, but still uses the simplified noexcept specification >>>deferring it to a future application case for is_nothrow_convertible. >>>Furthermore now all three compare function templates are now >>>(conditionally) noexcept by an (off-list) suggestion from Jonathan >>>Wakely. >> >>I've committed this, after some whitespace fixes and testing. >> >>Thanks! > >This change causes two regressions in C++17 mode, see >https://gcc.gnu.org/ml/gcc-testresults/2017-09/msg01674.html > >FAIL: 21_strings/basic_string/cons/char/moveable2.cc execution test >FAIL: 21_strings/basic_string/cons/wchar_t/moveable2.cc execution test > >Here's a reduced version of that test, which passes in C++14 and fails >in C++17: > >#include >#include > >class tstring : public std::string >{ >public: > tstring() : std::string() {} > tstring(tstring&& s) : std::string(std::move(s)) {} >}; > >int main() >{ > tstring b; > b.push_back('1'); > tstring c(std::move(b)); > assert( c.size() == 1 && c[0] == '1' ); > assert( b.size() == 0 ); >} > >The second assertion fails, because this mem-initializer: > > tstring(tstring&& s) : std::string(std::move(s)) {} > >now prefers to use the new constructor: > > basic_string(const _Tp& __t, const _Alloc& __a = _Alloc()) > >because tstring is convertible to string_view. > >This turns a non-allocating move into an allocating copy. This patch fixes the failure above, I'm testing it now. --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -115,6 +115,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 template using _If_sv = enable_if_t< __and_, + __not_>, __not_>>::value, _Res>;