From patchwork Thu Aug 4 18:38:54 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 389 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:6a10:b5d6:b0:2b9:3548:2db5 with SMTP id v22csp558575pxt; Thu, 4 Aug 2022 11:41:01 -0700 (PDT) X-Google-Smtp-Source: AA6agR7PbUNFJfhHrmSRzRupPGVN7zjOu69Iy1AiqPcdBZl30w8vdl5y4UkHdvb07w7lM5ayOsZ9 X-Received: by 2002:a05:6402:42d3:b0:435:2c49:313d with SMTP id i19-20020a05640242d300b004352c49313dmr3320585edc.86.1659638461700; Thu, 04 Aug 2022 11:41:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1659638461; cv=none; d=google.com; s=arc-20160816; b=RTDnXYC0/wnCnb49Ow6fOgLdJs94FUc9W0Buei6SBbdHIxGUW5/vCzndELLiVXmxHt vhoVWxHwJDrNcDRoToMdNrt8TuJ2m8flWrnpoCNfeYpPuxTzu5J/EjDKvp7CgEySNWAu 0TNpfRJ/5pLIhMVlB3yre+3fQ+sj3uAhUeeTobD0TeZfkBTCKmHA5J36DNJnFd9q5Oyj 8asR5R8H4levuWDoj3Zw2+TohpX29CM+zOM5pxWGJKtesPV+fuYmrsym99b6XUL6QJi4 J7vNpXqDGoMlZqNTv9dHOVzBYUZZnrMQbeo4aBf+rBjFAjNgT0z6dj9F14EDlYsLd0wz VNsA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence :content-transfer-encoding:mime-version:message-id:date:subject:to :dmarc-filter:delivered-to:dkim-signature:dkim-filter; bh=Uz+WV3TGVSCN+4B0JnDq5u6lXcwAjYCLpgP0iEIewh4=; b=CpkopkKTStf5FlUAYxHfvvDv5qfeRqF5DfMOP5HNGWnQlSrFfIOXujvM3fu7S9yg9P nULe2p/uH1I688mxLDmJsdF771Xgk7b68JSngVfZY7WzjhMqCjseEIIMFIqr/KtTd4qS FXO9dipqKTI/vhEcVXwnk+aHNMWi+B7WpKV8x7tlRUNtxmPWwOojWrjoGdqUgaxFi/1q NSMk3BGGUkz7xVs6Y9B/GdTGXf+ukNUypnTiQ3dblb9pJbhR3CtX563fUSWWLpuMEy1g +uGH8q3zZSgcwthrEFt6dqW4zAwt1wpJ31d/HcmK5B4o1sH24qpi1FpR6FeLWYtvf9Pz 5kUA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=lzLNk6ns; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id hb13-20020a170907160d00b00718d1cddac1si1862326ejc.833.2022.08.04.11.41.01 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Aug 2022 11:41:01 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=lzLNk6ns; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 73BA7385802E for ; Thu, 4 Aug 2022 18:41:00 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 73BA7385802E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1659638460; bh=Uz+WV3TGVSCN+4B0JnDq5u6lXcwAjYCLpgP0iEIewh4=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=lzLNk6nscUsmYzyJu5105+Qnn2n5WTmwwsEjBfMa46/K7PzUrBF2CluBU1WW9BTzE 1xGvaPYjFCeel694rHdot24lrt6cY2VeIDcsEDVZREXAgvY48ip6qaM8oGUz9kgDes TZJEY2eFZ/t0knAr3Exwow3ksjlxWLqomjSSQJTA= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id AFDF5385AC20 for ; Thu, 4 Aug 2022 18:39:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org AFDF5385AC20 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-453-nMLsIEpXN4O5uYf1DxY-1g-1; Thu, 04 Aug 2022 14:38:55 -0400 X-MC-Unique: nMLsIEpXN4O5uYf1DxY-1g-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8749E85A581; Thu, 4 Aug 2022 18:38:55 +0000 (UTC) Received: from localhost (unknown [10.33.36.4]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4DD241415116; Thu, 4 Aug 2022 18:38:55 +0000 (UTC) To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [committed] libstdc++: Make std::string_view(Range&&) constructor explicit Date: Thu, 4 Aug 2022 19:38:54 +0100 Message-Id: <20220804183854.753948-1-jwakely@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.7 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jonathan Wakely via Gcc-patches From: Jonathan Wakely Reply-To: Jonathan Wakely Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1740257059498332817?= X-GMAIL-MSGID: =?utf-8?q?1740257059498332817?= Tested powerpc64le-linux, pushed to trunk. -- >8 -- The P2499R0 paper was recently approved for C++23. libstdc++-v3/ChangeLog: * include/std/string_view (basic_string_view(Range&&)): Add explicit as per P2499R0. * testsuite/21_strings/basic_string_view/cons/char/range_c++20.cc: Adjust implicit conversions. Check implicit conversions fail. * testsuite/21_strings/basic_string_view/cons/wchar_t/range_c++20.cc: Likewise. --- libstdc++-v3/include/std/string_view | 2 +- .../cons/char/range_c++20.cc | 28 ++++++++++++++--- .../cons/wchar_t/range_c++20.cc | 30 +++++++++++++++---- 3 files changed, 50 insertions(+), 10 deletions(-) diff --git a/libstdc++-v3/include/std/string_view b/libstdc++-v3/include/std/string_view index bccf4d1847f..30ff136b1cb 100644 --- a/libstdc++-v3/include/std/string_view +++ b/libstdc++-v3/include/std/string_view @@ -162,7 +162,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION }) && (!requires { typename _DRange::traits_type; } || is_same_v) - constexpr + constexpr explicit basic_string_view(_Range&& __r) noexcept(noexcept(ranges::size(__r)) && noexcept(ranges::data(__r))) : _M_len(ranges::size(__r)), _M_str(ranges::data(__r)) diff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/char/range_c++20.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/char/range_c++20.cc index bd50c3058e6..a5745fcb603 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/char/range_c++20.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/char/range_c++20.cc @@ -36,7 +36,7 @@ test01() }; R r; - std::string_view s = r; + std::string_view s{r}; VERIFY( s == r.str ); VERIFY( s.data() == std::ranges::data(r) ); VERIFY( s.size() == std::ranges::size(r) ); @@ -50,10 +50,15 @@ test01() static_assert( std::ranges::contiguous_range ); static_assert( std::ranges::sized_range ); R2 r2; - std::string_view s2 = r2; // uses conversion to string_view + std::string_view s2(r2); // uses conversion to string_view VERIFY( s2 == "Out of range" ); VERIFY( std::string_view(const_cast(r2)) == s2 ); + // And again using copy-initialization instead of direct-initialization. + std::string_view s2_implicit = r2; // uses conversion to string_view + VERIFY( s2_implicit == "Out of range" ); + VERIFY( std::string_view(const_cast(r2)) == s2_implicit ); + struct R3 : R { using R::begin; @@ -91,7 +96,7 @@ test01() static_assert( std::ranges::contiguous_range ); static_assert( std::ranges::sized_range ); R5 r5; - std::string_view s5 = r5; // Uses range constructor + std::string_view s5(r5); // Uses range constructor VERIFY( s5 == r5.str ); s5 = std::string_view(std::move(r5)); // In C++20 this used conversion op. VERIFY( s5 == r5.str ); // In C++23 it uses range constructor. @@ -156,15 +161,30 @@ test04() }; R r; - std::basic_string_view s = r; // Use deduction guide. + std::basic_string_view s(r); // Use deduction guide. static_assert( std::is_same_v ); } +void +test05() +{ + struct R + { + const char* begin() const { return nullptr; } + const char* end() const { return nullptr; } + }; + + // P2499R0 string_view range constructor should be explicit + // P2516R0 string_view is implicitly convertible from what? + static_assert( ! std::is_convertible_v ); +} + int main() { test01(); test02(); test03(); test04(); + test05(); } diff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/wchar_t/range_c++20.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/wchar_t/range_c++20.cc index 0b28220d862..af3c986e56f 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/wchar_t/range_c++20.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/wchar_t/range_c++20.cc @@ -36,7 +36,7 @@ test01() }; R r; - std::wstring_view s = r; + std::wstring_view s{r}; VERIFY( s == r.str ); VERIFY( s.data() == std::ranges::data(r) ); VERIFY( s.size() == std::ranges::size(r) ); @@ -50,10 +50,15 @@ test01() static_assert( std::ranges::contiguous_range ); static_assert( std::ranges::sized_range ); R2 r2; - std::wstring_view s2 = r2; // uses conversion to wstring_view + std::wstring_view s2(r2); // uses conversion to wstring_view VERIFY( s2 == L"Out of range" ); VERIFY( std::wstring_view(const_cast(r2)) == s2 ); + // And again using copy-initialization instead of direct-initialization. + std::wstring_view s2_implicit = r2; // uses conversion to wstring_view + VERIFY( s2_implicit == L"Out of range" ); + VERIFY( std::wstring_view(const_cast(r2)) == s2_implicit ); + struct R3 : R { using R::begin; @@ -91,10 +96,10 @@ test01() static_assert( std::ranges::contiguous_range ); static_assert( std::ranges::sized_range ); R5 r5; - std::wstring_view s5 = r5; // Uses range constructor + std::wstring_view s5(r5); // Uses range constructor VERIFY( s5 == r5.str ); s5 = std::wstring_view(std::move(r5)); // In C++20 this used conversion op. - VERIFY( s5 == r5.str ); // In C++23 it uses range constructor. + VERIFY( s5 == r5.str ); // In C++23 it uses range constructor. wchar_t arr[] = L"arrangement\0with\0nulls"; std::wstring_view sa = arr; // Does not use range constructor @@ -156,15 +161,30 @@ test04() }; R r; - std::basic_string_view s = r; // Use deduction guide. + std::basic_string_view s(r); // Use deduction guide. static_assert( std::is_same_v ); } +void +test05() +{ + struct R + { + const wchar_t* begin() const { return nullptr; } + const wchar_t* end() const { return nullptr; } + }; + + // P2499R0 string_view range constructor should be explicit + // P2516R0 string_view is implicitly convertible from what? + static_assert( ! std::is_convertible_v ); +} + int main() { test01(); test02(); test03(); test04(); + test05(); }