From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id DFDB83861012 for ; Sat, 5 Jun 2021 10:46:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org DFDB83861012 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-146-hfMp-QsUMUanNvyxNUzi6g-1; Sat, 05 Jun 2021 06:46:07 -0400 X-MC-Unique: hfMp-QsUMUanNvyxNUzi6g-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id ED465801107; Sat, 5 Jun 2021 10:46:06 +0000 (UTC) Received: from localhost (unknown [10.33.37.1]) by smtp.corp.redhat.com (Postfix) with ESMTP id 610D36062F; Sat, 5 Jun 2021 10:46:06 +0000 (UTC) Date: Sat, 5 Jun 2021 11:46:05 +0100 From: Jonathan Wakely To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: Re: [committed] libstdc++: Fix value categories used by ranges access CPOs [PR 100824] Message-ID: References: MIME-Version: 1.0 In-Reply-To: X-Clacks-Overhead: GNU Terry Pratchett X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="ZGnaZar1IjxAvMW4" Content-Disposition: inline X-Spam-Status: No, score=-14.1 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, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libstdc++@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++ mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 05 Jun 2021 10:46:20 -0000 --ZGnaZar1IjxAvMW4 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline On 04/06/21 21:46 +0100, Jonathan Wakely wrote: >On 04/06/21 21:44 +0100, Jonathan Wakely wrote: >>On 04/06/21 18:03 +0100, Jonathan Wakely wrote: >>>The implementation of P2091R0 was incomplete, so that some range access >>>CPOs used perfect forwarding where they should not. This fixes it by >>>consistently operating on lvalues. >>> >>>Some additional changes that are not necessary to fix the bug: >>> >>>Modify the __as_const helper to simplify its usage. Instead of deducing >>>the value category from its argument, and requiring callers to forward >>>the argument as the correct category, add a non-deduced template >>>parameter which is used for the value category and accept the argument >>>as an lvalue. This means callers say __as_const(t) instead of >>>__as_const(std::forward(t)). >>> >>>Always use an lvalue reference type as the template argument for the >>>_S_noexcept helpers, so that we only instantiate one specialization for >>>lvalues and rvalues of the same type. >>> >>>Move some helper concepts and functions from namespace std::__detail >>>to ranges::__cust_access, to be consistent with the ranges::begin CPO. >>>This ensures that the __adl_begin concept and the _Begin::operator() >>>function are in the same namespace, so unqualified lookup is consistent >>>and the poison pills for begin are visible to both. >>> >>>Simplified static assertions for arrays, because the expression a+0 is >>>already ill-formed for an array of incomplete type. >>> >>>Signed-off-by: Jonathan Wakely >>> >>>libstdc++-v3/ChangeLog: >>> >>> PR libstdc++/100824 >>> * include/bits/iterator_concepts.h (__detail::__decay_copy) >>> (__detail::__member_begin, __detail::__adl_begin): Move to >>> namespace ranges::__cust_access. >>> (__detail::__ranges_begin): Likewise, and rename to __begin. >>> Remove redundant static assertion. >>> * include/bits/ranges_base.h (_Begin, _End, _RBegin, _REnd): >>> Use lvalue in noexcept specifier. >>> (__as_const): Add non-deduced parameter for value category. >>> (_CBegin, _CEnd, _CRBegin, _CREnd, _CData): Adjust uses of >>> __as_const. >>> (__member_size, __adl_size, __member_empty, __size0_empty): >>> (__eq_iter_empty, __adl_data): Use lvalue objects in >>> requirements. >>> (__sentinel_size): Likewise. Add check for conversion to >>> unsigned-like. >>> (__member_data): Allow non-lvalue types to satisfy the concept, >>> but use lvalue object in requirements. >>> (_Size, _SSize): Remove forwarding to always use an lvalue. >>> (_Data): Likewise. Add static assertion for arrays. >>> * testsuite/std/ranges/access/cdata.cc: Adjust expected >>> behaviour for rvalues. Add negative tests for ill-formed >>> expressions. >>> * testsuite/std/ranges/access/data.cc: Likewise. >>> * testsuite/std/ranges/access/empty.cc: Adjust expected >>> behaviour for rvalues. >>> * testsuite/std/ranges/access/size.cc: Likewise. >> >>An additional problem with ranges::data was pointed out in the PR, >>fixed with this patch. > >And this implements the rest of LWG 3403. The change to the >ranges::ssize constraints was already done by the first patch in this >thread, this fixes the return type. Aaaaand one more fix, as pointed out in the PR. Tested x86_64-linux. Committed to trunk. And this one should also be backported to gcc-11 and gcc-10. --ZGnaZar1IjxAvMW4 Content-Type: text/x-patch; charset=us-ascii Content-Disposition: attachment; filename="patch.txt" commit 96963713f6a648a0ed890450e02ebdd8ff583b14 Author: Jonathan Wakely Date: Sat Jun 5 11:42:01 2021 libstdc++: Fix return type of ranges::ssize for 128-bit integer [PR 100824] Signed-off-by: Jonathan Wakely libstdc++-v3/ChangeLog: PR libstdc++/100824 * include/bits/ranges_base.h (_SSize): Return signed type. * testsuite/std/ranges/access/ssize.cc: Check with __int128. diff --git a/libstdc++-v3/include/bits/ranges_base.h b/libstdc++-v3/include/bits/ranges_base.h index e3c3962bcd9..728d3ad2b25 100644 --- a/libstdc++-v3/include/bits/ranges_base.h +++ b/libstdc++-v3/include/bits/ranges_base.h @@ -447,7 +447,7 @@ namespace ranges #if defined __STRICT_ANSI__ && defined __SIZEOF_INT128__ // For strict-ansi modes integral<__int128> is false else if constexpr (__detail::__is_int128<__size_type>) - return static_cast(__size); + return static_cast<__int128>(__size); #endif else // Must be one of __max_diff_type or __max_size_type. return __detail::__max_diff_type(__size); diff --git a/libstdc++-v3/testsuite/std/ranges/access/ssize.cc b/libstdc++-v3/testsuite/std/ranges/access/ssize.cc index f53f462580c..fdbf245d036 100644 --- a/libstdc++-v3/testsuite/std/ranges/access/ssize.cc +++ b/libstdc++-v3/testsuite/std/ranges/access/ssize.cc @@ -85,6 +85,20 @@ test06() VERIFY( s == 4 ); } +void +test07() +{ +#ifdef __SIZEOF_INT128__ + struct R + { + unsigned __int128 size() const { return 4; } + }; + R r; + static_assert( std::same_as ); + VERIFY( std::ranges::ssize(r) == 4 ); +#endif +} + int main() { @@ -93,4 +107,5 @@ main() test04(); test05(); test06(); + test07(); } --ZGnaZar1IjxAvMW4--