[{"id":3682055,"web_url":"http://patchwork.ozlabs.org/comment/3682055/","msgid":"<80063e98-c765-7b32-d582-92b20c013f5d@idea>","list_archive_url":null,"date":"2026-04-24T14:22:11","subject":"Re: [PATCH] libsdc++: Restore check for validity of std::get for\n elements_view.","submitter":{"id":78319,"url":"http://patchwork.ozlabs.org/api/people/78319/","name":"Patrick Palka","email":"ppalka@redhat.com"},"content":"On Fri, 24 Apr 2026, Tomasz Kamiński wrote:\n\n> Resolves LWG3797, \"elements_view insufficiently constrained\".\n> \n> When P2165R4 updated __has_tuple_element in C++23 to reuse __tuple_like\n> concept, it dropped the requirement of validity of get, assuming that for\n> tuple_like type with size of N, get<I> on lvalue is well-formed for any I < N.\n> This however does not hold for ranges::subrange (tuple-like of size 2) with\n> move-only iterator, for which get can only be applied on rvalue. In consequence\n> constrains allowed instantiating elements_view for range of such subrange,\n> but instantiating it's iterator lead to hard error from iterator_category\n> computation.\n> \n> This patch applies the requirements on validity of get in all standard\n> modes.\n> \n> libstdc++-v3/ChangeLog:\n> \n> \t* include/std/ranges (__detail::__has_tuple_element): Check\n> \tif std::get<_Nm>(__t) returns referenceable type also for C++23\n> \tand later.\n> \t* testsuite/std/ranges/adaptors/elements.cc: Add test covering\n> \tvector of ranges::subrange with move-only iterator.\n> ---\n> I initially tought that we should backport it, but the only impact of\n> the issues is you cannot rely on constraint check on views::elements\n> of such range. Any use of such elements_views remain ill-formed in\n> all modes.\n> \n> Testing on x86-64_linux. All *elements* test passed in all standard\n> modes. OK for trunk when all test passes?\n> \n>  libstdc++-v3/include/std/ranges                   | 15 ++++++++++-----\n>  .../testsuite/std/ranges/adaptors/elements.cc     | 15 +++++++++++++++\n>  2 files changed, 25 insertions(+), 5 deletions(-)\n> \n> diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges\n> index 55d3c520ba4..4eb0a1a25bf 100644\n> --- a/libstdc++-v3/include/std/ranges\n> +++ b/libstdc++-v3/include/std/ranges\n> @@ -4354,20 +4354,25 @@ namespace views::__adaptor\n>  \n>    namespace __detail\n>    {\n> -#if __cpp_lib_tuple_like // >= C++23\n> +    // _GLIBCXX_RESOLVE_LIB_DEFECTS\n> +    // 3797. elements_view insufficiently constrained\n>      template<typename _Tp, size_t _Nm>\n> -    concept __has_tuple_element = __tuple_like<_Tp> && _Nm < tuple_size_v<_Tp>;\n> +    concept __has_tuple_element =\n> +#if __cpp_lib_tuple_like // >= C++23\n> +      __tuple_like<_Tp> && _Nm < tuple_size_v<_Tp>\n>  #else\n> -    template<typename _Tp, size_t _Nm>\n> -    concept __has_tuple_element = requires(_Tp __t)\n> +      requires\n>        {\n>  \ttypename tuple_size<_Tp>::type;\n>  \trequires _Nm < tuple_size_v<_Tp>;\n>  \ttypename tuple_element_t<_Nm, _Tp>;\n> +      }\n> +#endif\n> +      && requires(_Tp __t)\n> +      {\n>  \t{ std::get<_Nm>(__t) }\n>  \t  -> convertible_to<const tuple_element_t<_Nm, _Tp>&>;\n>        };\n> -#endif\n\nIt seems more readable to me to keep the C++23 version completely\nseparate from the C++20 version, and just copy/paste the std::get\nrequirement into the C++23 version.  Intertwining the two versions\ndoesn't seem beneficial as the C++20 version is unlikely to ever\nget changed at this point?\n\n>  \n>      template<typename _Tp, size_t _Nm>\n>        concept __returnable_element\n> diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc\n> index 5237d787e7b..1b15f79c5be 100644\n> --- a/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc\n> +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc\n> @@ -27,6 +27,21 @@\n>  namespace ranges = std::ranges;\n>  namespace views = ranges::views;\n>  \n\nCan you mention the LWG issue in the added tests?\n\n> +template<size_t N, typename Rg>\n> +concept can_elements = requires (Rg&& rg)\n> +{ views::elements<0>(rg); };\n> +\n> +static_assert( !can_elements<0, std::vector<int>> );\n> +static_assert( can_elements<0, std::tuple<int>[4]> );\n> +static_assert( can_elements<1, std::vector<std::pair<int, int>>> );\n> +\n> +using move_only_iter_range = __gnu_test::test_input_range_nocopy<int>;\n> +using move_only_iter_subrange = ranges::subrange<\n> +  ranges::iterator_t<move_only_iter_range>,\n> +  ranges::sentinel_t<move_only_iter_range>>;\n> +static_assert( can_elements<0, std::vector<ranges::subrange<int*>>> );\n> +static_assert( !can_elements<0, std::vector<move_only_iter_subrange>> );\n> +\n>  void\n>  test01()\n>  {\n> -- \n> 2.53.0\n> \n>","headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=eHN44NC8;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=38.145.34.32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=eHN44NC8","sourceware.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com","sourceware.org; spf=pass smtp.mailfrom=redhat.com","server2.sourceware.org;\n arc=none smtp.remote-ip=170.10.133.124"],"Received":["from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g2FYK1VYZz1yD5\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 25 Apr 2026 00:22:59 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id B542A4BB590F\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 24 Apr 2026 14:22:57 +0000 (GMT)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.133.124])\n by sourceware.org (Postfix) with ESMTP id 8C45B4BABF39\n for <gcc-patches@gcc.gnu.org>; Fri, 24 Apr 2026 14:22:19 +0000 (GMT)","from mail-qk1-f198.google.com (mail-qk1-f198.google.com\n [209.85.222.198]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-390-4hvFHsJjOtKHKodeWNb3fA-1; Fri, 24 Apr 2026 10:22:17 -0400","by mail-qk1-f198.google.com with SMTP id\n af79cd13be357-8ee2dfd63beso57663885a.1\n for <gcc-patches@gcc.gnu.org>; Fri, 24 Apr 2026 07:22:17 -0700 (PDT)","from [2600:4040:aa66:bf00:9e8e:99ff:fed1:71f]\n ([2600:4040:aa66:bf00:9e8e:99ff:fed1:71f])\n by smtp.gmail.com with ESMTPSA id\n af79cd13be357-8eb3aa60b99sm1697688485a.42.2026.04.24.07.22.12\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Fri, 24 Apr 2026 07:22:15 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org B542A4BB590F","OpenDKIM Filter v2.11.0 sourceware.org 8C45B4BABF39"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 8C45B4BABF39","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 8C45B4BABF39","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777040539; cv=none;\n b=cwTTabe3pYqKxn2UfBKbLD3f6FC+Lo2j0AJhPiFDZieDpABuBUuToDxOPyB9VLMRwAhjyI0wtXeOQiJ0D472t2RzZd9rJV9vbPOGRwmj6BJmhnlWiqFjHHrVlg90Q+DXozXNJtopurcBiCi3JP6m7ZAl3OHgYTC/g4U6VKHTqE8=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777040539; c=relaxed/simple;\n bh=zZfDmFQVre4uh0OSsAFMG2TgYlqYtpIwH1AdjLPYc44=;\n h=DKIM-Signature:From:Date:To:Subject:Message-ID:MIME-Version;\n b=tDzJhOnbXNDFnI3QRJB35cl5Z965bEidQbku6+YWKG+sRb5LhdnCYMsBwyZqaP1IeaukXqlh3yp1MX9YHPzGf03+V9o/rKqfPMJR0ghql142M4/3fZXhcSU2AlR78gmXux7hs0V2a3+er7csDnJKFe2P7bCGHAyH+XlhzC70n4w=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1777040539;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=DLrTTTkSj3P1mC24ZInEEkQdVZKprGUwZAhf8DdtuLQ=;\n b=eHN44NC8Vyv/+pXYxpNbTbav5v4H/vathOHUNZankoRv9Cxx5GNw0Cra4eJek8exwMCSeU\n L22dAGXE+waP0i6iLVtJ5M2AYZYL1usvmn5T9czUSUaSj2LczqGOpZ4jCHuKKqKaET8UTI\n 0zqimvKowy1mcwtnOc7aTkXpPsdx5TI=","X-MC-Unique":"4hvFHsJjOtKHKodeWNb3fA-1","X-Mimecast-MFC-AGG-ID":"4hvFHsJjOtKHKodeWNb3fA_1777040537","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777040537; x=1777645337;\n h=mime-version:references:message-id:in-reply-to:subject:cc:to:date\n :from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n :reply-to;\n bh=UTTfotOn2QBEhRMEA6cRuX3R2HCAxUG+RrDKIUWtF8w=;\n b=fUrAYqoak7QI2ft/hYdEogHDGEch6PU7t3DNL4v06jNQ/x2gXP+R+voeAlS1A8bOHH\n BmpfsCRaaHSDmZATgcEqtKQhacmLkXqcfRkV7r73isImG5LAgxtEyIzw4oljI04rmEJi\n kjxZqcW//VMZdUzGc7S/ilpF4OROPvo+Gqth2QzHQaMDMboZevcAbnBuvyQ8qi+zpWuR\n SVqBAJyoVUIrCzfE4ysbbxFT8HZFd/oTWCGZz8h1PiOw4Gg68qivox+TTTc5H5OHo/+F\n oQAxlDtHFSuPcIt74sH49Yzgq52NhDSqBvXwMfaZE4f6v6oz5JTetr4H0Wxr+kb1E6JI\n XaFQ==","X-Forwarded-Encrypted":"i=1;\n AFNElJ8ip6+8UoFvOwbB2n/40NJmG0Tzdb48VvbMajEK4KEeI4suN59emHI7oQE4QFdL7OliNILSxaAhxSSE4w==@gcc.gnu.org","X-Gm-Message-State":"AOJu0YysZlz7K5HOHsamux/y9ENQqQ7Oasdj9CxgCm7JfNboB03LfvD4\n k076Oifx/t43hzk80kqFtLJvw71QEaHN5gvXT3bEvpGX5RuxB9p2z8SOCWAnSSyisQNqCdqRr88\n sOmPL56TjXAf/MCSIxBUlutKSXHM+DLe79URKDMrTaMUa1NiPL9CpdqKbqAw=","X-Gm-Gg":"AeBDieujqGSbTWBEV0B7Xv4LiSj0unVY1h7O/Ym9Rhh/GaGdosr2/mg23jBN0ooze+A\n TK5ebjxDTeLBVSSQE+d8ol6PZJoEfEYMnb9tA78cd5AJKcOnc9FJHiT4p58cctxxKXsMYCFPphi\n eruJomaET09qUe8tOF740OA4jNe/x5QsAQg41ioRpnoG+DXN2C5/71Tm3Yoj06m3dZYRQvECYqD\n 0yfKQHU5w2nY+TuBS8Up2ItawObHjNzBbGXuKC/NX+wfsdfgMLlDAMmLumi+ZkOB5odUERyXaR7\n CQQJqPoFRn3RDoEd0cGoLEOz2wK4YQEJ6lFC9bcXrGDAeCINcZrIvvGMs8QsvdYawgVFxl2cx56\n 8VEWVuKeIM58gQFUloZhVMyRSWGBFGAI5rf/i9/mk/hLXFELSQisWG99ra731qv0s","X-Received":["by 2002:a05:620a:2304:10b0:8ee:a1d:bac6 with SMTP id\n af79cd13be357-8ee0a1dd0f2mr1198767585a.4.1777040537122;\n Fri, 24 Apr 2026 07:22:17 -0700 (PDT)","by 2002:a05:620a:2304:10b0:8ee:a1d:bac6 with SMTP id\n af79cd13be357-8ee0a1dd0f2mr1198764385a.4.1777040536554;\n Fri, 24 Apr 2026 07:22:16 -0700 (PDT)"],"From":"Patrick Palka <ppalka@redhat.com>","X-Google-Original-From":"Patrick Palka <patrick@idea>","Date":"Fri, 24 Apr 2026 10:22:11 -0400 (EDT)","To":"=?iso-8859-2?q?Tomasz_Kami=F1ski?= <tkaminsk@redhat.com>","cc":"libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org","Subject":"Re: [PATCH] libsdc++: Restore check for validity of std::get for\n elements_view.","In-Reply-To":"<20260424132901.1896897-1-tkaminsk@redhat.com>","Message-ID":"<80063e98-c765-7b32-d582-92b20c013f5d@idea>","References":"<20260424132901.1896897-1-tkaminsk@redhat.com>","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"-22J3RmrcJdxUGVPE03A3IWdE-eoW8UTjMkZrGqbbOs_1777040537","X-Mimecast-Originator":"redhat.com","Content-Type":"multipart/mixed; boundary=\"8323329-525440761-1777040535=:113381\"","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"}}]