[{"id":3675252,"web_url":"http://patchwork.ozlabs.org/comment/3675252/","msgid":"<CAKvuMXDhA294X7-Ut_1a4xn=JbWhsYkya3xvf29XHxSpJ83Zjw@mail.gmail.com>","list_archive_url":null,"date":"2026-04-09T11:02:55","subject":"Re: [PATCH v2] libstdc++: Implement structured binding support for\n integer_sequence","submitter":{"id":90409,"url":"http://patchwork.ozlabs.org/api/people/90409/","name":"Tomasz Kamiński","email":"tkaminsk@redhat.com"},"content":"On Thu, Apr 9, 2026 at 10:04 AM Tomasz Kamiński <tkaminsk@redhat.com> wrote:\n\n> From: Matthias Wippich <mfwippich@gmail.com>\n>\n> This implements P1789R3 Library Support for Expansion Statements.\n> https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p1789r3.pdf\n>\n> libstdc++-v3/ChangeLog:\n>\n>         * include/bits/utility.h (std::tuple_size, std::tuple_element):\n>         Add partrial specializations for integer_sequence.\n>         (std::get(integer_sequence<_Tp, _Idx...>)): Define.\n>         * include/bits/version.def (integer_sequence): Bump to 202511L.\n>         * include/bits/version.h: Regenerate.\n>         * testsuite/20_util/integer_sequence/tuple_access.cc: New test.\n>         * testsuite/20_util/integer_sequence/tuple_access_neg.cc: New test.\n>         * testsuite/experimental/feat-cxx14.cc: Updated check for\n>         __cpp_lib_integer_sequence value.\n>\n> Co-authored-by: Ivan Lazaric <ivan.lazaric1@gmail.com>\n> Signed-off-by: Matthias Wippich <mfwippich@gmail.com>\n> ---\n> v3:\n>  - updates changelog\n>  - fixes __cpp_lib_integer_sequence check in feat-cxx14.cc\n>  - replaces dg-excess-errors in tuple_access_neg.cc\n>  - add few testcasse to tuple_access.cc\n>\n> Testing on x86_64-linux. OK for trunk when all test passes?\n>\nAll test passed (noting this also for myself as I have many patches in\nflight).\n\n>\n>  libstdc++-v3/include/bits/utility.h           |  30 ++++\n>  libstdc++-v3/include/bits/version.def         |   5 +\n>  libstdc++-v3/include/bits/version.h           |   7 +-\n>  .../20_util/integer_sequence/tuple_access.cc  | 143 ++++++++++++++++++\n>  .../integer_sequence/tuple_access_neg.cc      |  22 +++\n>  .../testsuite/experimental/feat-cxx14.cc      |   4 +-\n>  6 files changed, 208 insertions(+), 3 deletions(-)\n>  create mode 100644\n> libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc\n>  create mode 100644\n> libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc\n>\n> diff --git a/libstdc++-v3/include/bits/utility.h\n> b/libstdc++-v3/include/bits/utility.h\n> index 93e9e9f9dba..363aed478c5 100644\n> --- a/libstdc++-v3/include/bits/utility.h\n> +++ b/libstdc++-v3/include/bits/utility.h\n> @@ -481,6 +481,36 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n>        static constexpr size_t size() noexcept { return sizeof...(_Idx); }\n>      };\n>\n> +#if __glibcxx_integer_sequence >= 202511L // C++ >= 26\n> +\n> +  /// Structured binding support\n> +  template<typename _Tp, _Tp... _Idx>\n> +    struct tuple_size<integer_sequence<_Tp, _Idx...>>\n> +    : integral_constant<size_t, sizeof...(_Idx)> { };\n> +\n> +  template<size_t __i, class _Tp, _Tp... _Idx>\n> +    struct tuple_element<__i, integer_sequence<_Tp, _Idx...>>\n> +    {\n> +      static_assert(__i < sizeof...(_Idx));\n> +      using type = _Tp;\n> +    };\n> +\n> +  template<size_t __i, class _Tp, _Tp... _Idx>\n> +    struct tuple_element<__i, const integer_sequence<_Tp, _Idx...>>\n> +    {\n> +      static_assert(__i < sizeof...(_Idx));\n> +      using type = _Tp;\n> +    };\n> +\n> +  template<size_t __i, class _Tp, _Tp... _Idx>\n> +    constexpr _Tp\n> +    get (integer_sequence<_Tp, _Idx...>) noexcept\n> +    {\n> +      static_assert(__i < sizeof...(_Idx));\n> +      return _Idx...[__i];\n> +    }\n> +#endif // __glibcxx_integer_sequence >= 202511L\n> +\n>    /// Alias template make_integer_sequence\n>    template<typename _Tp, _Tp _Num>\n>      using make_integer_sequence\n> diff --git a/libstdc++-v3/include/bits/version.def\n> b/libstdc++-v3/include/bits/version.def\n> index cfb90533ce4..8db3c1d2df3 100644\n> --- a/libstdc++-v3/include/bits/version.def\n> +++ b/libstdc++-v3/include/bits/version.def\n> @@ -184,6 +184,11 @@ ftms = {\n>\n>  ftms = {\n>    name = integer_sequence;\n> +  values = {\n> +    v = 202511;\n> +    cxxmin = 26;\n> +    extra_cond = \"__cpp_pack_indexing\";\n> +  };\n>    values = {\n>      v = 201304;\n>      cxxmin = 14;\n> diff --git a/libstdc++-v3/include/bits/version.h\n> b/libstdc++-v3/include/bits/version.h\n> index 22dd31b9d32..455d7190e90 100644\n> --- a/libstdc++-v3/include/bits/version.h\n> +++ b/libstdc++-v3/include/bits/version.h\n> @@ -186,7 +186,12 @@\n>  #undef __glibcxx_want_exchange_function\n>\n>  #if !defined(__cpp_lib_integer_sequence)\n> -# if (__cplusplus >= 201402L)\n> +# if (__cplusplus >  202302L) && (__cpp_pack_indexing)\n> +#  define __glibcxx_integer_sequence 202511L\n> +#  if defined(__glibcxx_want_all) ||\n> defined(__glibcxx_want_integer_sequence)\n> +#   define __cpp_lib_integer_sequence 202511L\n> +#  endif\n> +# elif (__cplusplus >= 201402L)\n>  #  define __glibcxx_integer_sequence 201304L\n>  #  if defined(__glibcxx_want_all) ||\n> defined(__glibcxx_want_integer_sequence)\n>  #   define __cpp_lib_integer_sequence 201304L\n> diff --git\n> a/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc\n> b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc\n> new file mode 100644\n> index 00000000000..afa644e7dab\n> --- /dev/null\n> +++ b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc\n> @@ -0,0 +1,143 @@\n> +// { dg-do compile { target c++26 } }\n> +\n> +#include <utility>\n> +#include <tuple>\n> +#include <testsuite_hooks.h>\n> +\n> +#if __cpp_lib_integer_sequence < 202511L\n> +# error \"Feature-test macro __cpp_lib_integer_sequence is incorrect\"\n> +#endif\n> +\n> +constexpr auto\n> +destructure_sum(auto seq)\n> +{\n> +  auto [...elems] = seq;\n> +  return (0 + ... + elems);\n> +}\n> +\n> +using IS1 = std::make_index_sequence<10>;\n> +static_assert( std::tuple_size_v<IS1> == 10 );\n> +static_assert( std::is_same_v<std::tuple_element_t<3, IS1>, std::size_t>\n> );\n> +static_assert( std::get<7>(IS1{}) == 7 );\n> +static_assert( destructure_sum(IS1{}) == 45 );\n> +static_assert( noexcept(get<0>(IS1{})) );\n> +\n> +using IS2 = std::integer_sequence<int, 42, 101, -13>;\n> +static_assert( std::tuple_size_v<IS2> == 3 );\n> +static_assert( std::is_same_v<std::tuple_element_t<1, IS2>, int> );\n> +static_assert( std::get<2>(IS2{}) == -13 );\n> +static_assert( destructure_sum(IS2{}) == 130 );\n> +static_assert( noexcept(get<0>(IS2{})) );\n> +\n> +using IS3 = std::integer_sequence<char>;\n> +static_assert( std::tuple_size_v<IS3> == 0 );\n> +\n> +using IS4 = std::integer_sequence<int, 1, 2>;\n> +static_assert( !std::is_constructible_v<std::pair<int, int>, IS4> );\n> +static_assert( !std::is_constructible_v<std::tuple<int, int>, IS4> );\n> +\n> +template<typename = void>\n> +constexpr bool\n> +test_basic()\n> +{\n> +  {\n> +    auto [...elems] = std::make_index_sequence<0>{};\n> +    static_assert( sizeof...(elems) == 0 );\n> +  }\n> +\n> +  {\n> +    auto [...elems] = std::integer_sequence<int, 3, 5, 7, 11>{};\n> +\n> +    static_assert( sizeof...(elems) == 4 );\n> +\n> +    VERIFY( elems...[0] == 3 );\n> +    VERIFY( elems...[1] == 5 );\n> +    VERIFY( elems...[2] == 7 );\n> +    VERIFY( elems...[3] == 11 );\n> +  }\n> +\n> +  {\n> +    static constexpr auto [...elems] = std::integer_sequence<short, 2, 4,\n> 8, 16>{};\n> +\n> +    static_assert( sizeof...(elems) == 4 );\n> +\n> +    static_assert( elems...[0] == 2 );\n> +    static_assert( elems...[1] == 4 );\n> +    static_assert( elems...[2] == 8 );\n> +    static_assert( elems...[3] == 16 );\n> +  }\n> +\n> +  {\n> +    constexpr auto [...elems] = std::integer_sequence<int, 1, 8, 2, 11>{};\n> +\n> +    static_assert( sizeof...(elems) == 4 );\n> +\n> +    static_assert( elems...[0] == 1 );\n> +    static_assert( elems...[1] == 8 );\n> +    static_assert( elems...[2] == 2 );\n> +    static_assert( elems...[3] == 11 );\n> +  }\n> +\n> +  {\n> +    static constexpr auto&& [...elems] = std::integer_sequence<short, 2,\n> 4, 8, 16>{};\n> +\n> +    static_assert( sizeof...(elems) == 4 );\n> +\n> +    static_assert( elems...[0] == 2 );\n> +    static_assert( elems...[1] == 4 );\n> +    static_assert( elems...[2] == 8 );\n> +    static_assert( elems...[3] == 16 );\n> +  }\n> +\n> +  /* Unimplemented, see PR117784\n> +  {\n> +    constexpr auto&& [...elems] = std::integer_sequence<int, 1, 8, 2,\n> 11>{};\n> +\n> +    static_assert( sizeof...(elems) == 4 );\n> +\n> +    static_assert( elems...[0] == 1 );\n> +    static_assert( elems...[1] == 8 );\n> +    static_assert( elems...[2] == 2 );\n> +    static_assert( elems...[3] == 11 );\n> +  }\n> +  */\n> +\n> +  {\n> +    auto idx = 0;\n> +    static constexpr auto seq = std::make_index_sequence<4>{};\n> +    template for (constexpr auto elem : seq)\n> +      {\n> +       VERIFY( elem == idx );\n> +       ++idx;\n> +      }\n> +    VERIFY( idx == 4 );\n> +  }\n> +\n> +\n> +  /* Unimplemented, see PR117784\n> +  {\n> +    auto idx = 0;\n> +    constexpr auto seq = std::make_index_sequence<4>{};\n> +    template for (constexpr auto elem : seq)\n> +      {\n> +       VERIFY( elem == idx );\n> +       ++idx;\n> +      }\n> +    VERIFY( idx == 4 );\n> +  }\n> +\n> +  {\n> +    auto idx = 0;\n> +    template for (constexpr auto elem : std::make_index_sequence<4>{})\n> +      {\n> +       VERIFY( elem == idx );\n> +       ++idx;\n> +      }\n> +    VERIFY( idx == 4 );\n> +  }\n> +  */\n> +\n> +  return true;\n> +}\n> +\n> +static_assert( test_basic() );\n> diff --git\n> a/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc\n> b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc\n> new file mode 100644\n> index 00000000000..8640114e7d3\n> --- /dev/null\n> +++ b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc\n> @@ -0,0 +1,22 @@\n> +// { dg-do compile { target c++26 } }\n> +\n> +#include <utility>\n> +\n> +using empty = std::integer_sequence<int>;\n> +static_assert( std::is_same_v<std::tuple_element_t<0, empty>, int> ); //\n> { dg-error \"here\" }\n> +static_assert( std::is_same_v<std::tuple_element_t<0, const empty>, int>\n> ); // { dg-error \"here\" }\n> +\n> +using size4 = std::integer_sequence<int, 1, 9, 7, 15>;\n> +static_assert( std::is_same_v<std::tuple_element_t<4, size4>, int> ); //\n> { dg-error \"here\" }\n> +static_assert( std::is_same_v<std::tuple_element_t<4, const size4>, int>\n> ); // { dg-error \"here\" }\n> +\n> +void\n> +test()\n> +{\n> +  (void)std::get<0>(empty{}); // { dg-error \"here\" }\n> +  (void)std::get<4>(size4{}); // { dg-error \"here\" }\n> +}\n> +\n> +// { dg-error \"static assertion failed\" \"\" { target *-*-* } 0 }\n> +// { dg-error \"cannot index an empty pack\" \"\" { target *-*-* } 0 }\n> +// { dg-error \"pack index '.' is out of range for pack of length\" \"\" {\n> target *-*-* } 0 }\n> diff --git a/libstdc++-v3/testsuite/experimental/feat-cxx14.cc\n> b/libstdc++-v3/testsuite/experimental/feat-cxx14.cc\n> index c009062b55c..4cc56c5f76e 100644\n> --- a/libstdc++-v3/testsuite/experimental/feat-cxx14.cc\n> +++ b/libstdc++-v3/testsuite/experimental/feat-cxx14.cc\n> @@ -18,8 +18,8 @@\n>\n>  #ifndef  __cpp_lib_integer_sequence\n>  #  error \"__cpp_lib_integer_sequence\"\n> -#elif  __cpp_lib_integer_sequence != 201304\n> -#  error \"__cpp_lib_integer_sequence != 201304\"\n> +#elif  __cpp_lib_integer_sequence < 201304\n> +#  error \"__cpp_lib_integer_sequence < 201304\"\n>  #endif\n>\n>  #ifndef  __cpp_lib_exchange_function\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=QFOS6N5p;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::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=QFOS6N5p","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.129.124"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::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 4frxrL4stGz1xy1\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 09 Apr 2026 21:03:45 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 4959A4BA2E20\n\tfor <incoming@patchwork.ozlabs.org>; Thu,  9 Apr 2026 11:03:43 +0000 (GMT)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.129.124])\n by sourceware.org (Postfix) with ESMTP id BCC7C4BA2E08\n for <gcc-patches@gcc.gnu.org>; Thu,  9 Apr 2026 11:03:09 +0000 (GMT)","from mail-yw1-f197.google.com (mail-yw1-f197.google.com\n [209.85.128.197]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-227-doBJEi4NM_2DqG0Pu3TiJQ-1; Thu, 09 Apr 2026 07:03:07 -0400","by mail-yw1-f197.google.com with SMTP id\n 00721157ae682-799001d7289so16332097b3.1\n for <gcc-patches@gcc.gnu.org>; Thu, 09 Apr 2026 04:03:07 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 4959A4BA2E20","OpenDKIM Filter v2.11.0 sourceware.org BCC7C4BA2E08"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org BCC7C4BA2E08","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org BCC7C4BA2E08","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1775732589; cv=none;\n b=K1DV6LeNqi/4s3OpKXwr3WCB4derCmjwoldFReDWdJMve6U+kof5iOOzI5qvTC9RmTmjTHdWDOndy6fMlshZWNu2Hm/ESbTrMZXJb/UnVrMHVLT2vrTYgcwZmwgH3pO9kfhpbiCTMdj+V2d0ujTm9Bw4kKhyZs121Tbwl8L1F9k=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1775732589; c=relaxed/simple;\n bh=viNrUYUJ2cva/u4wU1tK3ox7FCMV54W+uDgxR4iBxDg=;\n h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To;\n b=uoVhpU/edYbOYdBbuILSeHSaR24PWSv/vbIGS3alWWfBq4J43qS7MYygycykM35TokqW2ni4hLIXOqMgwbnEhuJuOL07SYGexxXaQpRnrmmPNR/bZaA7/wxRWUXXPnEkz4PDByHnqXKRgbsR8sKTwgpajogpli2ns3ckwt3XmvE=","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=1775732589;\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=TKXz6OpahiJ7Dz5pfpXKQxj4p/3QnX7AsO3IDuf4ftk=;\n b=QFOS6N5pDj+whKQn8n+HQtXSTADdoXOtZRAQqqcKi4uKsYfFpdV4r2SeWnckRRTxg8gi7X\n 4zNMz/3Csvfw+kchVeysrbwu6839Bw72RrvZx++q27uMYnd7HuHWN8HZXbauww+2sudDKj\n DTfu3PVHcE3WUoAWJltoAMghFIiQDOQ=","X-MC-Unique":"doBJEi4NM_2DqG0Pu3TiJQ-1","X-Mimecast-MFC-AGG-ID":"doBJEi4NM_2DqG0Pu3TiJQ_1775732587","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775732587; x=1776337387;\n h=cc:to:subject:message-id:date:from:in-reply-to:references\n :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=TKXz6OpahiJ7Dz5pfpXKQxj4p/3QnX7AsO3IDuf4ftk=;\n b=RBej11nVNBt5GeQ1pSknwqrHfuaBBhZvf+bmH/j/wK2ZZx6JCqo/Sjt+L40OKhHDpn\n DkzOstEC4fi9Mc31M8WEdy6uyXUFR7QuW/tLOEuK1pK13osk1ZfAMFAcu9+wRHL96dkk\n DzCQDG5qTDvBUvaCXcRCO6l5WkUkY6X3LKqxj6x5RLHyRBse8x9aAz9Ly81Ixj/nbwPc\n /16XSuWzqPm6gUBUKPza+eCmpjPazPPU49xwBGlxNyrKuj49xQEfDp3V9Sz847nVJ5g2\n 3YQRv7XlYIcdY/FzuIKSRs2nvmndePpJ59NSWae0A7+qRD6imMPx3EPKAuU+WHBIOfid\n 5wpw==","X-Forwarded-Encrypted":"i=1;\n AJvYcCWCQY2HaLyhe3E3NZE1AouAOvnwNCxG86yeT03AXysD8N8lA84MHRUiP/+80ps7Js/JWivQmZ2e54vczA==@gcc.gnu.org","X-Gm-Message-State":"AOJu0YzwvyqYRnqz2DKP+07ZK9sYahik3apwyrDCzf8xMwwpv/q8L11f\n cq4Fu8nO8bWM9IV1zBSjR0yPHR+oHCxhcw7WE3FvKtGlU/dbuKKAlLlGPoL93kt7SivdVEl6S3I\n 0Vx8QkfpkSa6TaWIN4C7vrs5pySpP8dm0iJpBT1T+veEgFhCHnsJjL9lRhO6w/FSA5P81zaR10T\n AQ30bQ9HX7lrFcdxi7RzlTOfNNjlClrXJCWA==","X-Gm-Gg":"AeBDies2Ia+hsmSr3WTLbRi5aiPTRpWH16DG5YuDsNYU/agUB74kFYj/rp6wXeDP/8t\n OuMSn5KlN0DbAeaVXtla3xq1qQMrx2sdAMrLZNI32Fsuf7hrzSNC3xQN84l0rdlI7DOjVbqcw6m\n 5/WV7TU3lc4ICANrrqVTmd29k2N8d3uyVYzxPEVDqk4CSqiav6QBuH8wjOppJUeDjo6GllB4Udj\n d2Das8qttchCKOMkScTp6bsIvLzsmfjd8uiKwmjRw9l0sw+kK+FJYayZnybSxRydmXz","X-Received":["by 2002:a05:690c:c510:b0:79e:8299:751f with SMTP id\n 00721157ae682-7adf0ebc8a4mr29025307b3.7.1775732586703;\n Thu, 09 Apr 2026 04:03:06 -0700 (PDT)","by 2002:a05:690c:c510:b0:79e:8299:751f with SMTP id\n 00721157ae682-7adf0ebc8a4mr29024887b3.7.1775732586131; Thu, 09 Apr 2026\n 04:03:06 -0700 (PDT)"],"MIME-Version":"1.0","References":"\n <CAKvuMXARGgP=nX0sedLruVdEtLsoyNxyPmOdmy5_9nhyZD8aYw@mail.gmail.com>\n <20260409080243.196495-1-tkaminsk@redhat.com>","In-Reply-To":"<20260409080243.196495-1-tkaminsk@redhat.com>","From":"Tomasz Kaminski <tkaminsk@redhat.com>","Date":"Thu, 9 Apr 2026 13:02:55 +0200","X-Gm-Features":"AQROBzA1cnGv4s6FguyZfKzhcimiTczPgWDRkVrE54qjDO-dcKlGLbPtkEjNzfM","Message-ID":"\n <CAKvuMXDhA294X7-Ut_1a4xn=JbWhsYkya3xvf29XHxSpJ83Zjw@mail.gmail.com>","Subject":"Re: [PATCH v2] libstdc++: Implement structured binding support for\n integer_sequence","To":"libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org","Cc":"Matthias Wippich <mfwippich@gmail.com>,\n Ivan Lazaric <ivan.lazaric1@gmail.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"mEjm4CV9DM7S2eXrbTSYiQna2Wk9PffYaRWa37E4z24_1775732587","X-Mimecast-Originator":"redhat.com","Content-Type":"multipart/alternative; boundary=\"0000000000000350fb064f04f66f\"","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"}},{"id":3675353,"web_url":"http://patchwork.ozlabs.org/comment/3675353/","msgid":"<CAKiTkyTpNB3=6pt2XrLh8_c_G9K18=nZW9KWRYEJfWWBnVAu1Q@mail.gmail.com>","list_archive_url":null,"date":"2026-04-09T14:32:06","subject":"Re: [PATCH v2] libstdc++: Implement structured binding support for\n integer_sequence","submitter":{"id":93063,"url":"http://patchwork.ozlabs.org/api/people/93063/","name":"Matthias Wippich","email":"mfwippich@gmail.com"},"content":"whoops, sorry for the extraneous whitespace. Thanks for taking care of\nit. There's a typo in the updated changelog: `partrial` should be\n`partial`.\n\nIn libc++ we did put `[[nodiscard]]` on `get` as an extension. Would\nthat be desirable for libstdc++ as well?\n\nOn Thu, Apr 9, 2026 at 1:03 PM Tomasz Kaminski <tkaminsk@redhat.com> wrote:\n>\n>\n>\n> On Thu, Apr 9, 2026 at 10:04 AM Tomasz Kamiński <tkaminsk@redhat.com> wrote:\n>>\n>> From: Matthias Wippich <mfwippich@gmail.com>\n>>\n>> This implements P1789R3 Library Support for Expansion Statements.\n>> https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p1789r3.pdf\n>>\n>> libstdc++-v3/ChangeLog:\n>>\n>>         * include/bits/utility.h (std::tuple_size, std::tuple_element):\n>>         Add partrial specializations for integer_sequence.\n>>         (std::get(integer_sequence<_Tp, _Idx...>)): Define.\n>>         * include/bits/version.def (integer_sequence): Bump to 202511L.\n>>         * include/bits/version.h: Regenerate.\n>>         * testsuite/20_util/integer_sequence/tuple_access.cc: New test.\n>>         * testsuite/20_util/integer_sequence/tuple_access_neg.cc: New test.\n>>         * testsuite/experimental/feat-cxx14.cc: Updated check for\n>>         __cpp_lib_integer_sequence value.\n>>\n>> Co-authored-by: Ivan Lazaric <ivan.lazaric1@gmail.com>\n>> Signed-off-by: Matthias Wippich <mfwippich@gmail.com>\n>> ---\n>> v3:\n>>  - updates changelog\n>>  - fixes __cpp_lib_integer_sequence check in feat-cxx14.cc\n>>  - replaces dg-excess-errors in tuple_access_neg.cc\n>>  - add few testcasse to tuple_access.cc\n>>\n>> Testing on x86_64-linux. OK for trunk when all test passes?\n>\n> All test passed (noting this also for myself as I have many patches in flight).\n>>\n>>\n>>  libstdc++-v3/include/bits/utility.h           |  30 ++++\n>>  libstdc++-v3/include/bits/version.def         |   5 +\n>>  libstdc++-v3/include/bits/version.h           |   7 +-\n>>  .../20_util/integer_sequence/tuple_access.cc  | 143 ++++++++++++++++++\n>>  .../integer_sequence/tuple_access_neg.cc      |  22 +++\n>>  .../testsuite/experimental/feat-cxx14.cc      |   4 +-\n>>  6 files changed, 208 insertions(+), 3 deletions(-)\n>>  create mode 100644 libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc\n>>  create mode 100644 libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc\n>>\n>> diff --git a/libstdc++-v3/include/bits/utility.h b/libstdc++-v3/include/bits/utility.h\n>> index 93e9e9f9dba..363aed478c5 100644\n>> --- a/libstdc++-v3/include/bits/utility.h\n>> +++ b/libstdc++-v3/include/bits/utility.h\n>> @@ -481,6 +481,36 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n>>        static constexpr size_t size() noexcept { return sizeof...(_Idx); }\n>>      };\n>>\n>> +#if __glibcxx_integer_sequence >= 202511L // C++ >= 26\n>> +\n>> +  /// Structured binding support\n>> +  template<typename _Tp, _Tp... _Idx>\n>> +    struct tuple_size<integer_sequence<_Tp, _Idx...>>\n>> +    : integral_constant<size_t, sizeof...(_Idx)> { };\n>> +\n>> +  template<size_t __i, class _Tp, _Tp... _Idx>\n>> +    struct tuple_element<__i, integer_sequence<_Tp, _Idx...>>\n>> +    {\n>> +      static_assert(__i < sizeof...(_Idx));\n>> +      using type = _Tp;\n>> +    };\n>> +\n>> +  template<size_t __i, class _Tp, _Tp... _Idx>\n>> +    struct tuple_element<__i, const integer_sequence<_Tp, _Idx...>>\n>> +    {\n>> +      static_assert(__i < sizeof...(_Idx));\n>> +      using type = _Tp;\n>> +    };\n>> +\n>> +  template<size_t __i, class _Tp, _Tp... _Idx>\n>> +    constexpr _Tp\n>> +    get (integer_sequence<_Tp, _Idx...>) noexcept\n>> +    {\n>> +      static_assert(__i < sizeof...(_Idx));\n>> +      return _Idx...[__i];\n>> +    }\n>> +#endif // __glibcxx_integer_sequence >= 202511L\n>> +\n>>    /// Alias template make_integer_sequence\n>>    template<typename _Tp, _Tp _Num>\n>>      using make_integer_sequence\n>> diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def\n>> index cfb90533ce4..8db3c1d2df3 100644\n>> --- a/libstdc++-v3/include/bits/version.def\n>> +++ b/libstdc++-v3/include/bits/version.def\n>> @@ -184,6 +184,11 @@ ftms = {\n>>\n>>  ftms = {\n>>    name = integer_sequence;\n>> +  values = {\n>> +    v = 202511;\n>> +    cxxmin = 26;\n>> +    extra_cond = \"__cpp_pack_indexing\";\n>> +  };\n>>    values = {\n>>      v = 201304;\n>>      cxxmin = 14;\n>> diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h\n>> index 22dd31b9d32..455d7190e90 100644\n>> --- a/libstdc++-v3/include/bits/version.h\n>> +++ b/libstdc++-v3/include/bits/version.h\n>> @@ -186,7 +186,12 @@\n>>  #undef __glibcxx_want_exchange_function\n>>\n>>  #if !defined(__cpp_lib_integer_sequence)\n>> -# if (__cplusplus >= 201402L)\n>> +# if (__cplusplus >  202302L) && (__cpp_pack_indexing)\n>> +#  define __glibcxx_integer_sequence 202511L\n>> +#  if defined(__glibcxx_want_all) || defined(__glibcxx_want_integer_sequence)\n>> +#   define __cpp_lib_integer_sequence 202511L\n>> +#  endif\n>> +# elif (__cplusplus >= 201402L)\n>>  #  define __glibcxx_integer_sequence 201304L\n>>  #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_integer_sequence)\n>>  #   define __cpp_lib_integer_sequence 201304L\n>> diff --git a/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc\n>> new file mode 100644\n>> index 00000000000..afa644e7dab\n>> --- /dev/null\n>> +++ b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc\n>> @@ -0,0 +1,143 @@\n>> +// { dg-do compile { target c++26 } }\n>> +\n>> +#include <utility>\n>> +#include <tuple>\n>> +#include <testsuite_hooks.h>\n>> +\n>> +#if __cpp_lib_integer_sequence < 202511L\n>> +# error \"Feature-test macro __cpp_lib_integer_sequence is incorrect\"\n>> +#endif\n>> +\n>> +constexpr auto\n>> +destructure_sum(auto seq)\n>> +{\n>> +  auto [...elems] = seq;\n>> +  return (0 + ... + elems);\n>> +}\n>> +\n>> +using IS1 = std::make_index_sequence<10>;\n>> +static_assert( std::tuple_size_v<IS1> == 10 );\n>> +static_assert( std::is_same_v<std::tuple_element_t<3, IS1>, std::size_t> );\n>> +static_assert( std::get<7>(IS1{}) == 7 );\n>> +static_assert( destructure_sum(IS1{}) == 45 );\n>> +static_assert( noexcept(get<0>(IS1{})) );\n>> +\n>> +using IS2 = std::integer_sequence<int, 42, 101, -13>;\n>> +static_assert( std::tuple_size_v<IS2> == 3 );\n>> +static_assert( std::is_same_v<std::tuple_element_t<1, IS2>, int> );\n>> +static_assert( std::get<2>(IS2{}) == -13 );\n>> +static_assert( destructure_sum(IS2{}) == 130 );\n>> +static_assert( noexcept(get<0>(IS2{})) );\n>> +\n>> +using IS3 = std::integer_sequence<char>;\n>> +static_assert( std::tuple_size_v<IS3> == 0 );\n>> +\n>> +using IS4 = std::integer_sequence<int, 1, 2>;\n>> +static_assert( !std::is_constructible_v<std::pair<int, int>, IS4> );\n>> +static_assert( !std::is_constructible_v<std::tuple<int, int>, IS4> );\n>> +\n>> +template<typename = void>\n>> +constexpr bool\n>> +test_basic()\n>> +{\n>> +  {\n>> +    auto [...elems] = std::make_index_sequence<0>{};\n>> +    static_assert( sizeof...(elems) == 0 );\n>> +  }\n>> +\n>> +  {\n>> +    auto [...elems] = std::integer_sequence<int, 3, 5, 7, 11>{};\n>> +\n>> +    static_assert( sizeof...(elems) == 4 );\n>> +\n>> +    VERIFY( elems...[0] == 3 );\n>> +    VERIFY( elems...[1] == 5 );\n>> +    VERIFY( elems...[2] == 7 );\n>> +    VERIFY( elems...[3] == 11 );\n>> +  }\n>> +\n>> +  {\n>> +    static constexpr auto [...elems] = std::integer_sequence<short, 2, 4, 8, 16>{};\n>> +\n>> +    static_assert( sizeof...(elems) == 4 );\n>> +\n>> +    static_assert( elems...[0] == 2 );\n>> +    static_assert( elems...[1] == 4 );\n>> +    static_assert( elems...[2] == 8 );\n>> +    static_assert( elems...[3] == 16 );\n>> +  }\n>> +\n>> +  {\n>> +    constexpr auto [...elems] = std::integer_sequence<int, 1, 8, 2, 11>{};\n>> +\n>> +    static_assert( sizeof...(elems) == 4 );\n>> +\n>> +    static_assert( elems...[0] == 1 );\n>> +    static_assert( elems...[1] == 8 );\n>> +    static_assert( elems...[2] == 2 );\n>> +    static_assert( elems...[3] == 11 );\n>> +  }\n>> +\n>> +  {\n>> +    static constexpr auto&& [...elems] = std::integer_sequence<short, 2, 4, 8, 16>{};\n>> +\n>> +    static_assert( sizeof...(elems) == 4 );\n>> +\n>> +    static_assert( elems...[0] == 2 );\n>> +    static_assert( elems...[1] == 4 );\n>> +    static_assert( elems...[2] == 8 );\n>> +    static_assert( elems...[3] == 16 );\n>> +  }\n>> +\n>> +  /* Unimplemented, see PR117784\n>> +  {\n>> +    constexpr auto&& [...elems] = std::integer_sequence<int, 1, 8, 2, 11>{};\n>> +\n>> +    static_assert( sizeof...(elems) == 4 );\n>> +\n>> +    static_assert( elems...[0] == 1 );\n>> +    static_assert( elems...[1] == 8 );\n>> +    static_assert( elems...[2] == 2 );\n>> +    static_assert( elems...[3] == 11 );\n>> +  }\n>> +  */\n>> +\n>> +  {\n>> +    auto idx = 0;\n>> +    static constexpr auto seq = std::make_index_sequence<4>{};\n>> +    template for (constexpr auto elem : seq)\n>> +      {\n>> +       VERIFY( elem == idx );\n>> +       ++idx;\n>> +      }\n>> +    VERIFY( idx == 4 );\n>> +  }\n>> +\n>> +\n>> +  /* Unimplemented, see PR117784\n>> +  {\n>> +    auto idx = 0;\n>> +    constexpr auto seq = std::make_index_sequence<4>{};\n>> +    template for (constexpr auto elem : seq)\n>> +      {\n>> +       VERIFY( elem == idx );\n>> +       ++idx;\n>> +      }\n>> +    VERIFY( idx == 4 );\n>> +  }\n>> +\n>> +  {\n>> +    auto idx = 0;\n>> +    template for (constexpr auto elem : std::make_index_sequence<4>{})\n>> +      {\n>> +       VERIFY( elem == idx );\n>> +       ++idx;\n>> +      }\n>> +    VERIFY( idx == 4 );\n>> +  }\n>> +  */\n>> +\n>> +  return true;\n>> +}\n>> +\n>> +static_assert( test_basic() );\n>> diff --git a/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc\n>> new file mode 100644\n>> index 00000000000..8640114e7d3\n>> --- /dev/null\n>> +++ b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc\n>> @@ -0,0 +1,22 @@\n>> +// { dg-do compile { target c++26 } }\n>> +\n>> +#include <utility>\n>> +\n>> +using empty = std::integer_sequence<int>;\n>> +static_assert( std::is_same_v<std::tuple_element_t<0, empty>, int> ); // { dg-error \"here\" }\n>> +static_assert( std::is_same_v<std::tuple_element_t<0, const empty>, int> ); // { dg-error \"here\" }\n>> +\n>> +using size4 = std::integer_sequence<int, 1, 9, 7, 15>;\n>> +static_assert( std::is_same_v<std::tuple_element_t<4, size4>, int> ); // { dg-error \"here\" }\n>> +static_assert( std::is_same_v<std::tuple_element_t<4, const size4>, int> ); // { dg-error \"here\" }\n>> +\n>> +void\n>> +test()\n>> +{\n>> +  (void)std::get<0>(empty{}); // { dg-error \"here\" }\n>> +  (void)std::get<4>(size4{}); // { dg-error \"here\" }\n>> +}\n>> +\n>> +// { dg-error \"static assertion failed\" \"\" { target *-*-* } 0 }\n>> +// { dg-error \"cannot index an empty pack\" \"\" { target *-*-* } 0 }\n>> +// { dg-error \"pack index '.' is out of range for pack of length\" \"\" { target *-*-* } 0 }\n>> diff --git a/libstdc++-v3/testsuite/experimental/feat-cxx14.cc b/libstdc++-v3/testsuite/experimental/feat-cxx14.cc\n>> index c009062b55c..4cc56c5f76e 100644\n>> --- a/libstdc++-v3/testsuite/experimental/feat-cxx14.cc\n>> +++ b/libstdc++-v3/testsuite/experimental/feat-cxx14.cc\n>> @@ -18,8 +18,8 @@\n>>\n>>  #ifndef  __cpp_lib_integer_sequence\n>>  #  error \"__cpp_lib_integer_sequence\"\n>> -#elif  __cpp_lib_integer_sequence != 201304\n>> -#  error \"__cpp_lib_integer_sequence != 201304\"\n>> +#elif  __cpp_lib_integer_sequence < 201304\n>> +#  error \"__cpp_lib_integer_sequence < 201304\"\n>>  #endif\n>>\n>>  #ifndef  __cpp_lib_exchange_function\n>> --\n>> 2.53.0\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 (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=r1t3k0BF;\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 (2048-bit key,\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=r1t3k0BF","sourceware.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com","sourceware.org; spf=pass smtp.mailfrom=gmail.com","server2.sourceware.org;\n arc=pass smtp.remote-ip=209.85.167.179"],"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 4fs2Tc6JRnz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 00:32:51 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 4D1634BA2E0E\n\tfor <incoming@patchwork.ozlabs.org>; Thu,  9 Apr 2026 14:32:49 +0000 (GMT)","from mail-oi1-f179.google.com (mail-oi1-f179.google.com\n [209.85.167.179])\n by sourceware.org (Postfix) with ESMTPS id E77CC4BA2E0E\n for <gcc-patches@gcc.gnu.org>; Thu,  9 Apr 2026 14:32:18 +0000 (GMT)","by mail-oi1-f179.google.com with SMTP id\n 5614622812f47-46f85ce9a07so23320b6e.2\n for <gcc-patches@gcc.gnu.org>; Thu, 09 Apr 2026 07:32:18 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 4D1634BA2E0E","OpenDKIM Filter v2.11.0 sourceware.org E77CC4BA2E0E"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org E77CC4BA2E0E","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org E77CC4BA2E0E","ARC-Seal":["i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1775745139; cv=pass;\n b=F7keDqsFgXkkaKhCwEh3ajX0ApU0AJmm7adJ80V7Hlto0z53ol8QYtqyRkoTg8IkS938kj9QyypP2CRI9ZlCLH3S5+Onz9g9k0MyPytUQNfF3L3Oous9GpWOVfS0O8saf4tDQDpAdGzsAlSXknpwdOUkFr46QPRNnEn7lzQmcTE=","i=1; a=rsa-sha256; t=1775745138; cv=none;\n d=google.com; s=arc-20240605;\n b=Jb/s8wmV8MlZbFelxv+x2Lako4E4tEcQTiJZ9JeU6v59IiFQZYCqBo8eQmb9tLM7v0\n hpoeWhiHAydi0H8H7c38Q50DNxafIqJi+UYYtHIEp7HU66HkzCroeIFr8PaVXqhGep0T\n Fqca/QAgxNc7fHb5zRb2K4ZtRcP908kR/CxsaomZbInO/a+1VY0tP0nr3edv9Ns0wNPD\n mrUKHUN1xqjnu8mgN/Hup0GG8T/6ltfiaoBpGFG/1XG5i1r3P0cDjniuJ5szc6HVtSo+\n vUpQ9bBNj7CfbWK2W3dCsekK+IZuGOHD6nwBvDooxV3ynt2hTUBHFH9Hj9HpJYCiw7A7\n 6ZLQ=="],"ARC-Message-Signature":["i=2; a=rsa-sha256; d=sourceware.org; s=key;\n t=1775745139; c=relaxed/simple;\n bh=+ZRVuCLsAvnEAMN9R+zPB/Kai1+gdVrqGPJQVl5JGRo=;\n h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To;\n b=EIaPYQ8yI1sNDwdJVpQVSgKHu45eAx2b04tnSEMLEw5p6pU0zYC/DD7MEBFtOPlV5COpRkJD/h4uWpDqB44axUsK8t/8c3jZvOy9NX/BsEn9WV2nzPKaMa7edPjvzyPXner56tDti3pZ4I3UEIxr8YuEhFa7rYsWLqiP4s2k2bg=","i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;\n s=arc-20240605;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:dkim-signature;\n bh=/FqN4VSytuw2IZ+D97x+OyGF8HIs8tneBphtcfah+SA=;\n fh=AuKw5smbNKK28QSOd2qS8Bvu9RcfXWvA0qZZMp1301k=;\n b=IaVssN6hwELYcAyh/zFSBtf9niHxgnR2Io7SFWuizTLPk4X7gs2HJM25vLpmjJewgi\n G7ijV0XMOZTKxdJ3C28GKN2uBzOVX9I2PmEkIBK/uFE8ERi9y4K7qeS4SX0tuhiBBzey\n JhMoCQ0IHiuBgDTk4lt5llYuOxhTxmvdlXZTUqZ1iwWfEG6RufM4PmEG3kkLEaHDf6Go\n JVjGTx+nlFoRy1bArMZcGE1eF/gGMTqUgeju4smWxyyfih4nfgCRyjPyPuNvT5YQ1wYM\n wGP9HcekleS0wVuCT9lz+lVxUEQOJlOSv/iaayIBrOjg7FVTkjLQRmjwe2uvI31nYMmt\n WHdQ==; darn=gcc.gnu.org"],"ARC-Authentication-Results":["i=2; server2.sourceware.org","i=1; mx.google.com; arc=none"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1775745138; x=1776349938; darn=gcc.gnu.org;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:from:to:cc:subject:date\n :message-id:reply-to;\n bh=/FqN4VSytuw2IZ+D97x+OyGF8HIs8tneBphtcfah+SA=;\n b=r1t3k0BF0NJdhEOLhbrYoTE+yf2urnFixZ83eQiwqjg7wdPQGBjZsYRz8ViA4TjPZP\n MC5UViBDdljL16mfn07A+/yitczFWLG8Np9tvsn+OxbNLzYrmRsBp3Hf1VSok6UHi4al\n 5mGc8cMLIJ1h9euHDeeS11NPFAayc3tdFGLblwQwDq5+dGBqLyzGLfSgvtT9gzXUYSNT\n DwClgixYThfzul93BDE0puextEebuCA+ZW44QG8tjuDKreb+2qQUU3v618qLUw/WF6TJ\n g4LgXwehHBqJ6+l7JdBe9fhHXECj90SsmAtrt3uOIl9gJJVrUlYQD1VlbrDvW9YxqmSE\n l55A==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775745138; x=1776349938;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=/FqN4VSytuw2IZ+D97x+OyGF8HIs8tneBphtcfah+SA=;\n b=cj7h2aMPuZnvtRbVNqPOT5kO5lLWZrAmuKLgwFyIBcPoDdJqHNXIdyNVklvJIFsyo9\n q8jae0KHMaZQnjGNDUomeuhh8llqbJIHBNtyI5F0e74zXuuAyMj9K6ZD1d10oisn52bK\n KnQBEztklJxJkz7gzBtaSEIduJgDJ/YUn8jYMiTZBZzy2jF3/R2H+nFaOI57wa7es+6U\n xzWb7p/hkoPTN/3d2OuKc+C5ygnlObG6DA8+EybLvkRcPM5Ka3GGDIgC07RPV99fJzM3\n S7le6eODeEhAgEdj7isMpVPU+UQpCUM/lIG6OprkRpqwoRlS9RyYOF45T7fWxmnTa9ym\n qYIA==","X-Forwarded-Encrypted":"i=1;\n AJvYcCUOhaTuFO3/lL+Sd5kKgUqg06jgWpzC+gCR4j94pkWX/TygJfSwlME9hsyJj0tNNq14pG7T/QzL55ysDQ==@gcc.gnu.org","X-Gm-Message-State":"AOJu0Yzoduwawbbd3ire0FIhpKgPWQYoiIVdCdgPTqbDr1N+CJ0aqiIV\n V1tHQccl5dE+Neo/GlY6HJM3qZVJ7au2mOBqoxuKU4tGDdyfLLNitMoEU8WHXxU433Gmh2bKVOi\n 7L3wa3EkgptsD4zRDTw3qTGxY2nAWHQ==","X-Gm-Gg":"AeBDietXxDqJOY6AjNGwlxbx1/pxPMa/xN7aDizwJCbBg5uiNqO+5WzEKtwh59VtemO\n vZteqaNqUpjAcqHwCXDDHpH/F96I7fEzCOZnQYXnFcMwadfBxwBezAuTniBJpvAi/3vqGChNoQh\n 2BOb/j1lqIYr1l21AERJ7y+pMGqJJSvVKgFwd7S2Wqu76498ZeP9fkcl+22UxlQi497O2wt9+Qt\n T5BJUUhUhc+UYmqbovnc+vWRHRpLT/6l42oaR02WGL/kq/LNqZP66wLX5JiaaY4nlpJysS/Z9o5\n +3i15vaqbMIzwWv1XX/GPrNkWS5Rcp8iYk0=","X-Received":"by 2002:a05:6808:d52:b0:46a:ada:cebf with SMTP id\n 5614622812f47-46ef831a696mr8131240b6e.1.1775745137741; Thu, 09 Apr 2026\n 07:32:17 -0700 (PDT)","MIME-Version":"1.0","References":"\n <CAKvuMXARGgP=nX0sedLruVdEtLsoyNxyPmOdmy5_9nhyZD8aYw@mail.gmail.com>\n <20260409080243.196495-1-tkaminsk@redhat.com>\n <CAKvuMXDhA294X7-Ut_1a4xn=JbWhsYkya3xvf29XHxSpJ83Zjw@mail.gmail.com>","In-Reply-To":"\n <CAKvuMXDhA294X7-Ut_1a4xn=JbWhsYkya3xvf29XHxSpJ83Zjw@mail.gmail.com>","From":"Matthias Wippich <mfwippich@gmail.com>","Date":"Thu, 9 Apr 2026 16:32:06 +0200","X-Gm-Features":"AQROBzCq9mQkdM53VbxWy0BZ374YIJleOtLJ3OOj8xB0EJ57nT4L0DOo8qWtnPU","Message-ID":"\n <CAKiTkyTpNB3=6pt2XrLh8_c_G9K18=nZW9KWRYEJfWWBnVAu1Q@mail.gmail.com>","Subject":"Re: [PATCH v2] libstdc++: Implement structured binding support for\n integer_sequence","To":"Tomasz Kaminski <tkaminsk@redhat.com>","Cc":"libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org,\n Ivan Lazaric <ivan.lazaric1@gmail.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","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"}},{"id":3677102,"web_url":"http://patchwork.ozlabs.org/comment/3677102/","msgid":"<ad4N-X71mue55hjr@zen.kayari.org>","list_archive_url":null,"date":"2026-04-14T09:50:49","subject":"Re: [PATCH v2] libstdc++: Implement structured binding support for\n integer_sequence","submitter":{"id":48004,"url":"http://patchwork.ozlabs.org/api/people/48004/","name":"Jonathan Wakely","email":"jwakely@redhat.com"},"content":"On Thu, 09 Apr 2026 at 10:01 +0200, Tomasz Kamiński wrote:\n>From: Matthias Wippich <mfwippich@gmail.com>\n>\n>This implements P1789R3 Library Support for Expansion Statements.\n>https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p1789r3.pdf\n>\n>libstdc++-v3/ChangeLog:\n>\n>\t* include/bits/utility.h (std::tuple_size, std::tuple_element):\n>\tAdd partrial specializations for integer_sequence.\n>\t(std::get(integer_sequence<_Tp, _Idx...>)): Define.\n>\t* include/bits/version.def (integer_sequence): Bump to 202511L.\n>\t* include/bits/version.h: Regenerate.\n>\t* testsuite/20_util/integer_sequence/tuple_access.cc: New test.\n>\t* testsuite/20_util/integer_sequence/tuple_access_neg.cc: New test.\n>\t* testsuite/experimental/feat-cxx14.cc: Updated check for\n>\t__cpp_lib_integer_sequence value.\n>\n>Co-authored-by: Ivan Lazaric <ivan.lazaric1@gmail.com>\n>Signed-off-by: Matthias Wippich <mfwippich@gmail.com>\n>---\n>v3:\n> - updates changelog\n> - fixes __cpp_lib_integer_sequence check in feat-cxx14.cc\n> - replaces dg-excess-errors in tuple_access_neg.cc\n> - add few testcasse to tuple_access.cc\n>\n>Testing on x86_64-linux. OK for trunk when all test passes?\n>\n> libstdc++-v3/include/bits/utility.h           |  30 ++++\n> libstdc++-v3/include/bits/version.def         |   5 +\n> libstdc++-v3/include/bits/version.h           |   7 +-\n> .../20_util/integer_sequence/tuple_access.cc  | 143 ++++++++++++++++++\n> .../integer_sequence/tuple_access_neg.cc      |  22 +++\n> .../testsuite/experimental/feat-cxx14.cc      |   4 +-\n> 6 files changed, 208 insertions(+), 3 deletions(-)\n> create mode 100644 libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc\n> create mode 100644 libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc\n>\n>diff --git a/libstdc++-v3/include/bits/utility.h b/libstdc++-v3/include/bits/utility.h\n>index 93e9e9f9dba..363aed478c5 100644\n>--- a/libstdc++-v3/include/bits/utility.h\n>+++ b/libstdc++-v3/include/bits/utility.h\n>@@ -481,6 +481,36 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n>       static constexpr size_t size() noexcept { return sizeof...(_Idx); }\n>     };\n>\n>+#if __glibcxx_integer_sequence >= 202511L // C++ >= 26\n>+\n>+  /// Structured binding support\n\nSo that it has a bit more context in the generated Doxygen HTML,\nplease make this comment:\n\n   /** @brief Structured binding support for `integer_sequence`\n\n    * @since C++26\n    * @{\n    */\n\nand then after the get overload, add /// @}\n\nThat will create a group so that the same comment applies to all of\ntuple_size, tuple_element, and get.\n\n>+  template<typename _Tp, _Tp... _Idx>\n>+    struct tuple_size<integer_sequence<_Tp, _Idx...>>\n>+    : integral_constant<size_t, sizeof...(_Idx)> { };\n>+\n>+  template<size_t __i, class _Tp, _Tp... _Idx>\n>+    struct tuple_element<__i, integer_sequence<_Tp, _Idx...>>\n>+    {\n>+      static_assert(__i < sizeof...(_Idx));\n>+      using type = _Tp;\n>+    };\n>+\n>+  template<size_t __i, class _Tp, _Tp... _Idx>\n>+    struct tuple_element<__i, const integer_sequence<_Tp, _Idx...>>\n>+    {\n>+      static_assert(__i < sizeof...(_Idx));\n>+      using type = _Tp;\n>+    };\n>+\n>+  template<size_t __i, class _Tp, _Tp... _Idx>\n>+    constexpr _Tp\n>+    get (integer_sequence<_Tp, _Idx...>) noexcept\n\nI agree with the suggestion to add [[nodiscard]] here.\n\nOK with those changes (and the \"partial\" typo that Matthias noticed).\n\nThanks to all three of you for doing this.\n\n>+    {\n>+      static_assert(__i < sizeof...(_Idx));\n>+      return _Idx...[__i];\n>+    }\n>+#endif // __glibcxx_integer_sequence >= 202511L\n>+\n>   /// Alias template make_integer_sequence\n>   template<typename _Tp, _Tp _Num>\n>     using make_integer_sequence\n>diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def\n>index cfb90533ce4..8db3c1d2df3 100644\n>--- a/libstdc++-v3/include/bits/version.def\n>+++ b/libstdc++-v3/include/bits/version.def\n>@@ -184,6 +184,11 @@ ftms = {\n>\n> ftms = {\n>   name = integer_sequence;\n>+  values = {\n>+    v = 202511;\n>+    cxxmin = 26;\n>+    extra_cond = \"__cpp_pack_indexing\";\n>+  };\n>   values = {\n>     v = 201304;\n>     cxxmin = 14;\n>diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h\n>index 22dd31b9d32..455d7190e90 100644\n>--- a/libstdc++-v3/include/bits/version.h\n>+++ b/libstdc++-v3/include/bits/version.h\n>@@ -186,7 +186,12 @@\n> #undef __glibcxx_want_exchange_function\n>\n> #if !defined(__cpp_lib_integer_sequence)\n>-# if (__cplusplus >= 201402L)\n>+# if (__cplusplus >  202302L) && (__cpp_pack_indexing)\n>+#  define __glibcxx_integer_sequence 202511L\n>+#  if defined(__glibcxx_want_all) || defined(__glibcxx_want_integer_sequence)\n>+#   define __cpp_lib_integer_sequence 202511L\n>+#  endif\n>+# elif (__cplusplus >= 201402L)\n> #  define __glibcxx_integer_sequence 201304L\n> #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_integer_sequence)\n> #   define __cpp_lib_integer_sequence 201304L\n>diff --git a/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc\n>new file mode 100644\n>index 00000000000..afa644e7dab\n>--- /dev/null\n>+++ b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc\n>@@ -0,0 +1,143 @@\n>+// { dg-do compile { target c++26 } }\n>+\n>+#include <utility>\n>+#include <tuple>\n>+#include <testsuite_hooks.h>\n>+\n>+#if __cpp_lib_integer_sequence < 202511L\n>+# error \"Feature-test macro __cpp_lib_integer_sequence is incorrect\"\n>+#endif\n>+\n>+constexpr auto\n>+destructure_sum(auto seq)\n>+{\n>+  auto [...elems] = seq;\n>+  return (0 + ... + elems);\n>+}\n>+\n>+using IS1 = std::make_index_sequence<10>;\n>+static_assert( std::tuple_size_v<IS1> == 10 );\n>+static_assert( std::is_same_v<std::tuple_element_t<3, IS1>, std::size_t> );\n>+static_assert( std::get<7>(IS1{}) == 7 );\n>+static_assert( destructure_sum(IS1{}) == 45 );\n>+static_assert( noexcept(get<0>(IS1{})) );\n>+\n>+using IS2 = std::integer_sequence<int, 42, 101, -13>;\n>+static_assert( std::tuple_size_v<IS2> == 3 );\n>+static_assert( std::is_same_v<std::tuple_element_t<1, IS2>, int> );\n>+static_assert( std::get<2>(IS2{}) == -13 );\n>+static_assert( destructure_sum(IS2{}) == 130 );\n>+static_assert( noexcept(get<0>(IS2{})) );\n>+\n>+using IS3 = std::integer_sequence<char>;\n>+static_assert( std::tuple_size_v<IS3> == 0 );\n>+\n>+using IS4 = std::integer_sequence<int, 1, 2>;\n>+static_assert( !std::is_constructible_v<std::pair<int, int>, IS4> );\n>+static_assert( !std::is_constructible_v<std::tuple<int, int>, IS4> );\n>+\n>+template<typename = void>\n>+constexpr bool\n>+test_basic()\n>+{\n>+  {\n>+    auto [...elems] = std::make_index_sequence<0>{};\n>+    static_assert( sizeof...(elems) == 0 );\n>+  }\n>+\n>+  {\n>+    auto [...elems] = std::integer_sequence<int, 3, 5, 7, 11>{};\n>+\n>+    static_assert( sizeof...(elems) == 4 );\n>+\n>+    VERIFY( elems...[0] == 3 );\n>+    VERIFY( elems...[1] == 5 );\n>+    VERIFY( elems...[2] == 7 );\n>+    VERIFY( elems...[3] == 11 );\n>+  }\n>+\n>+  {\n>+    static constexpr auto [...elems] = std::integer_sequence<short, 2, 4, 8, 16>{};\n>+\n>+    static_assert( sizeof...(elems) == 4 );\n>+\n>+    static_assert( elems...[0] == 2 );\n>+    static_assert( elems...[1] == 4 );\n>+    static_assert( elems...[2] == 8 );\n>+    static_assert( elems...[3] == 16 );\n>+  }\n>+\n>+  {\n>+    constexpr auto [...elems] = std::integer_sequence<int, 1, 8, 2, 11>{};\n>+\n>+    static_assert( sizeof...(elems) == 4 );\n>+\n>+    static_assert( elems...[0] == 1 );\n>+    static_assert( elems...[1] == 8 );\n>+    static_assert( elems...[2] == 2 );\n>+    static_assert( elems...[3] == 11 );\n>+  }\n>+\n>+  {\n>+    static constexpr auto&& [...elems] = std::integer_sequence<short, 2, 4, 8, 16>{};\n>+\n>+    static_assert( sizeof...(elems) == 4 );\n>+\n>+    static_assert( elems...[0] == 2 );\n>+    static_assert( elems...[1] == 4 );\n>+    static_assert( elems...[2] == 8 );\n>+    static_assert( elems...[3] == 16 );\n>+  }\n>+\n>+  /* Unimplemented, see PR117784\n>+  {\n>+    constexpr auto&& [...elems] = std::integer_sequence<int, 1, 8, 2, 11>{};\n>+\n>+    static_assert( sizeof...(elems) == 4 );\n>+\n>+    static_assert( elems...[0] == 1 );\n>+    static_assert( elems...[1] == 8 );\n>+    static_assert( elems...[2] == 2 );\n>+    static_assert( elems...[3] == 11 );\n>+  }\n>+  */\n>+\n>+  {\n>+    auto idx = 0;\n>+    static constexpr auto seq = std::make_index_sequence<4>{};\n>+    template for (constexpr auto elem : seq)\n>+      {\n>+\tVERIFY( elem == idx );\n>+\t++idx;\n>+      }\n>+    VERIFY( idx == 4 );\n>+  }\n>+\n>+\n>+  /* Unimplemented, see PR117784\n>+  {\n>+    auto idx = 0;\n>+    constexpr auto seq = std::make_index_sequence<4>{};\n>+    template for (constexpr auto elem : seq)\n>+      {\n>+\tVERIFY( elem == idx );\n>+\t++idx;\n>+      }\n>+    VERIFY( idx == 4 );\n>+  }\n>+\n>+  {\n>+    auto idx = 0;\n>+    template for (constexpr auto elem : std::make_index_sequence<4>{})\n>+      {\n>+\tVERIFY( elem == idx );\n>+\t++idx;\n>+      }\n>+    VERIFY( idx == 4 );\n>+  }\n>+  */\n>+\n>+  return true;\n>+}\n>+\n>+static_assert( test_basic() );\n>diff --git a/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc\n>new file mode 100644\n>index 00000000000..8640114e7d3\n>--- /dev/null\n>+++ b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc\n>@@ -0,0 +1,22 @@\n>+// { dg-do compile { target c++26 } }\n>+\n>+#include <utility>\n>+\n>+using empty = std::integer_sequence<int>;\n>+static_assert( std::is_same_v<std::tuple_element_t<0, empty>, int> ); // { dg-error \"here\" }\n>+static_assert( std::is_same_v<std::tuple_element_t<0, const empty>, int> ); // { dg-error \"here\" }\n>+\n>+using size4 = std::integer_sequence<int, 1, 9, 7, 15>;\n>+static_assert( std::is_same_v<std::tuple_element_t<4, size4>, int> ); // { dg-error \"here\" }\n>+static_assert( std::is_same_v<std::tuple_element_t<4, const size4>, int> ); // { dg-error \"here\" }\n>+\n>+void\n>+test()\n>+{\n>+  (void)std::get<0>(empty{}); // { dg-error \"here\" }\n>+  (void)std::get<4>(size4{}); // { dg-error \"here\" }\n>+}\n>+\n>+// { dg-error \"static assertion failed\" \"\" { target *-*-* } 0 }\n>+// { dg-error \"cannot index an empty pack\" \"\" { target *-*-* } 0 }\n>+// { dg-error \"pack index '.' is out of range for pack of length\" \"\" { target *-*-* } 0 }\n>diff --git a/libstdc++-v3/testsuite/experimental/feat-cxx14.cc b/libstdc++-v3/testsuite/experimental/feat-cxx14.cc\n>index c009062b55c..4cc56c5f76e 100644\n>--- a/libstdc++-v3/testsuite/experimental/feat-cxx14.cc\n>+++ b/libstdc++-v3/testsuite/experimental/feat-cxx14.cc\n>@@ -18,8 +18,8 @@\n>\n> #ifndef  __cpp_lib_integer_sequence\n> #  error \"__cpp_lib_integer_sequence\"\n>-#elif  __cpp_lib_integer_sequence != 201304\n>-#  error \"__cpp_lib_integer_sequence != 201304\"\n>+#elif  __cpp_lib_integer_sequence < 201304\n>+#  error \"__cpp_lib_integer_sequence < 201304\"\n> #endif\n>\n> #ifndef  __cpp_lib_exchange_function\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=fOsUQ2ko;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::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=fOsUQ2ko","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\n [IPv6:2620:52:6:3111::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 4fw01Q392yz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 14 Apr 2026 19:52:09 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id D3CA34BA2E11\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 14 Apr 2026 09:52:05 +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 C5EC74BA2E08\n for <gcc-patches@gcc.gnu.org>; Tue, 14 Apr 2026 09:50:57 +0000 (GMT)","from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-542-ZeQoy_UzNXm3IyTl7XDnww-1; Tue,\n 14 Apr 2026 05:50:53 -0400","from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id CBDCE180034C; Tue, 14 Apr 2026 09:50:52 +0000 (UTC)","from localhost (unknown [10.44.34.88])\n by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id C082819560AB; Tue, 14 Apr 2026 09:50:51 +0000 (UTC)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org D3CA34BA2E11","OpenDKIM Filter v2.11.0 sourceware.org C5EC74BA2E08"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org C5EC74BA2E08","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org C5EC74BA2E08","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776160257; cv=none;\n b=R0WpS7qKwiF0gRHFgU5dpuh3AHz691FOT+fls6V4cQErdbGcxDCiXvdZvD3+zUzl/KGAvNZVaZt10UV+4CYJiZ/UNMUoJyK3wHLf/nGCnVtKSaFFFjD/w1Eak7QZ4xx4coGLht5bI2LUi/pgS8MOyTChmH0+bz9OqrsSGzQAm44=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776160257; c=relaxed/simple;\n bh=m1oOj2I+qaz9uM2l9H9Yb2DzVSQeefHo+8lJPrpwZ7A=;\n h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version;\n b=o43UKViM1IxidXnknBKoOfcVoEi4uYQ6//Jcuik0BpVQNt88M6X+1vtpZ3CK0SvvgD+j9tQPbxLM5wgzkdfS2015zb6R+K8T4VSXPaT9ZRE4mr02MJA4qP2Y35bjv2o6ut1GYj8UNDHLAkpzWp2WtdCxqxF0vXgS+2FkuhzI47M=","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=1776160257;\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 content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=QhPG5vz/64GOTUOUqmqeFyq7khY+eMhzDgbw7BN1Ue4=;\n b=fOsUQ2kouUVWxcFVZh5m4CxslCTBkzCF0Lwe44z7lTQMUYBcgu0GdK5VWMqhKWNVC7b2bA\n qoaNX5WJCBPkazMnkzK1E9j+zTR2ZjyZsJXy4aydVJWI/dNuR75clJEz0iKmQoMd32Ve92\n fpbqll4uoljzpYqkKFqPXTFjPJmfb7c=","X-MC-Unique":"ZeQoy_UzNXm3IyTl7XDnww-1","X-Mimecast-MFC-AGG-ID":"ZeQoy_UzNXm3IyTl7XDnww_1776160253","Date":"Tue, 14 Apr 2026 10:50:49 +0100","From":"Jonathan Wakely <jwakely@redhat.com>","To":"Tomasz =?utf-8?b?S2FtacWEc2tp?= <tkaminsk@redhat.com>","Cc":"libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org,\n Matthias Wippich <mfwippich@gmail.com>,\n Ivan Lazaric <ivan.lazaric1@gmail.com>","Subject":"Re: [PATCH v2] libstdc++: Implement structured binding support for\n integer_sequence","Message-ID":"<ad4N-X71mue55hjr@zen.kayari.org>","References":"\n <CAKvuMXARGgP=nX0sedLruVdEtLsoyNxyPmOdmy5_9nhyZD8aYw@mail.gmail.com>\n <20260409080243.196495-1-tkaminsk@redhat.com>","MIME-Version":"1.0","In-Reply-To":"<20260409080243.196495-1-tkaminsk@redhat.com>","X-Clacks-Overhead":"GNU Terry Pratchett","X-Scanned-By":"MIMEDefang 3.0 on 10.30.177.12","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"xwtiDkebkk5Wf1UyY8ydgpIMIas_mhJw_Z6fZYk7xqc_1776160253","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=utf-8; format=flowed","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","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"}},{"id":3677128,"web_url":"http://patchwork.ozlabs.org/comment/3677128/","msgid":"<CAKvuMXB8R6sD6E+3-0XJkGC5wojW3a7PdcSwSwGBfsMv6KF=5A@mail.gmail.com>","list_archive_url":null,"date":"2026-04-14T11:06:57","subject":"Re: [PATCH v2] libstdc++: Implement structured binding support for\n integer_sequence","submitter":{"id":90409,"url":"http://patchwork.ozlabs.org/api/people/90409/","name":"Tomasz Kamiński","email":"tkaminsk@redhat.com"},"content":"On Tue, Apr 14, 2026 at 11:50 AM Jonathan Wakely <jwakely@redhat.com> wrote:\n\n> On Thu, 09 Apr 2026 at 10:01 +0200, Tomasz Kamiński wrote:\n> >From: Matthias Wippich <mfwippich@gmail.com>\n> >\n> >This implements P1789R3 Library Support for Expansion Statements.\n> >https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p1789r3.pdf\n> >\n> >libstdc++-v3/ChangeLog:\n> >\n> >       * include/bits/utility.h (std::tuple_size, std::tuple_element):\n> >       Add partrial specializations for integer_sequence.\n> >       (std::get(integer_sequence<_Tp, _Idx...>)): Define.\n> >       * include/bits/version.def (integer_sequence): Bump to 202511L.\n> >       * include/bits/version.h: Regenerate.\n> >       * testsuite/20_util/integer_sequence/tuple_access.cc: New test.\n> >       * testsuite/20_util/integer_sequence/tuple_access_neg.cc: New test.\n> >       * testsuite/experimental/feat-cxx14.cc: Updated check for\n> >       __cpp_lib_integer_sequence value.\n> >\n> >Co-authored-by: Ivan Lazaric <ivan.lazaric1@gmail.com>\n> >Signed-off-by: Matthias Wippich <mfwippich@gmail.com>\n> >---\n> >v3:\n> > - updates changelog\n> > - fixes __cpp_lib_integer_sequence check in feat-cxx14.cc\n> > - replaces dg-excess-errors in tuple_access_neg.cc\n> > - add few testcasse to tuple_access.cc\n> >\n> >Testing on x86_64-linux. OK for trunk when all test passes?\n> >\n> > libstdc++-v3/include/bits/utility.h           |  30 ++++\n> > libstdc++-v3/include/bits/version.def         |   5 +\n> > libstdc++-v3/include/bits/version.h           |   7 +-\n> > .../20_util/integer_sequence/tuple_access.cc  | 143 ++++++++++++++++++\n> > .../integer_sequence/tuple_access_neg.cc      |  22 +++\n> > .../testsuite/experimental/feat-cxx14.cc      |   4 +-\n> > 6 files changed, 208 insertions(+), 3 deletions(-)\n> > create mode 100644\n> libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc\n> > create mode 100644\n> libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc\n> >\n> >diff --git a/libstdc++-v3/include/bits/utility.h\n> b/libstdc++-v3/include/bits/utility.h\n> >index 93e9e9f9dba..363aed478c5 100644\n> >--- a/libstdc++-v3/include/bits/utility.h\n> >+++ b/libstdc++-v3/include/bits/utility.h\n> >@@ -481,6 +481,36 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n> >       static constexpr size_t size() noexcept { return sizeof...(_Idx); }\n> >     };\n> >\n> >+#if __glibcxx_integer_sequence >= 202511L // C++ >= 26\n> >+\n> >+  /// Structured binding support\n>\n> So that it has a bit more context in the generated Doxygen HTML,\n> please make this comment:\n>\n>    /** @brief Structured binding support for `integer_sequence`\n>\n>     * @since C++26\n>     * @{\n>     */\n>\n> and then after the get overload, add /// @}\n>\n> That will create a group so that the same comment applies to all of\n> tuple_size, tuple_element, and get.\n>\n> >+  template<typename _Tp, _Tp... _Idx>\n> >+    struct tuple_size<integer_sequence<_Tp, _Idx...>>\n> >+    : integral_constant<size_t, sizeof...(_Idx)> { };\n> >+\n> >+  template<size_t __i, class _Tp, _Tp... _Idx>\n> >+    struct tuple_element<__i, integer_sequence<_Tp, _Idx...>>\n> >+    {\n> >+      static_assert(__i < sizeof...(_Idx));\n> >+      using type = _Tp;\n> >+    };\n> >+\n> >+  template<size_t __i, class _Tp, _Tp... _Idx>\n> >+    struct tuple_element<__i, const integer_sequence<_Tp, _Idx...>>\n> >+    {\n> >+      static_assert(__i < sizeof...(_Idx));\n> >+      using type = _Tp;\n> >+    };\n> >+\n> >+  template<size_t __i, class _Tp, _Tp... _Idx>\n> >+    constexpr _Tp\n> >+    get (integer_sequence<_Tp, _Idx...>) noexcept\n>\n> I agree with the suggestion to add [[nodiscard]] here.\n>\n> OK with those changes (and the \"partial\" typo that Matthias noticed).\n>\n> Thanks to all three of you for doing this.\n>\nMerged to trunk. Thanks!\n\n>\n> >+    {\n> >+      static_assert(__i < sizeof...(_Idx));\n> >+      return _Idx...[__i];\n> >+    }\n> >+#endif // __glibcxx_integer_sequence >= 202511L\n> >+\n> >   /// Alias template make_integer_sequence\n> >   template<typename _Tp, _Tp _Num>\n> >     using make_integer_sequence\n> >diff --git a/libstdc++-v3/include/bits/version.def\n> b/libstdc++-v3/include/bits/version.def\n> >index cfb90533ce4..8db3c1d2df3 100644\n> >--- a/libstdc++-v3/include/bits/version.def\n> >+++ b/libstdc++-v3/include/bits/version.def\n> >@@ -184,6 +184,11 @@ ftms = {\n> >\n> > ftms = {\n> >   name = integer_sequence;\n> >+  values = {\n> >+    v = 202511;\n> >+    cxxmin = 26;\n> >+    extra_cond = \"__cpp_pack_indexing\";\n> >+  };\n> >   values = {\n> >     v = 201304;\n> >     cxxmin = 14;\n> >diff --git a/libstdc++-v3/include/bits/version.h\n> b/libstdc++-v3/include/bits/version.h\n> >index 22dd31b9d32..455d7190e90 100644\n> >--- a/libstdc++-v3/include/bits/version.h\n> >+++ b/libstdc++-v3/include/bits/version.h\n> >@@ -186,7 +186,12 @@\n> > #undef __glibcxx_want_exchange_function\n> >\n> > #if !defined(__cpp_lib_integer_sequence)\n> >-# if (__cplusplus >= 201402L)\n> >+# if (__cplusplus >  202302L) && (__cpp_pack_indexing)\n> >+#  define __glibcxx_integer_sequence 202511L\n> >+#  if defined(__glibcxx_want_all) ||\n> defined(__glibcxx_want_integer_sequence)\n> >+#   define __cpp_lib_integer_sequence 202511L\n> >+#  endif\n> >+# elif (__cplusplus >= 201402L)\n> > #  define __glibcxx_integer_sequence 201304L\n> > #  if defined(__glibcxx_want_all) ||\n> defined(__glibcxx_want_integer_sequence)\n> > #   define __cpp_lib_integer_sequence 201304L\n> >diff --git\n> a/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc\n> b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc\n> >new file mode 100644\n> >index 00000000000..afa644e7dab\n> >--- /dev/null\n> >+++ b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc\n> >@@ -0,0 +1,143 @@\n> >+// { dg-do compile { target c++26 } }\n> >+\n> >+#include <utility>\n> >+#include <tuple>\n> >+#include <testsuite_hooks.h>\n> >+\n> >+#if __cpp_lib_integer_sequence < 202511L\n> >+# error \"Feature-test macro __cpp_lib_integer_sequence is incorrect\"\n> >+#endif\n> >+\n> >+constexpr auto\n> >+destructure_sum(auto seq)\n> >+{\n> >+  auto [...elems] = seq;\n> >+  return (0 + ... + elems);\n> >+}\n> >+\n> >+using IS1 = std::make_index_sequence<10>;\n> >+static_assert( std::tuple_size_v<IS1> == 10 );\n> >+static_assert( std::is_same_v<std::tuple_element_t<3, IS1>, std::size_t>\n> );\n> >+static_assert( std::get<7>(IS1{}) == 7 );\n> >+static_assert( destructure_sum(IS1{}) == 45 );\n> >+static_assert( noexcept(get<0>(IS1{})) );\n> >+\n> >+using IS2 = std::integer_sequence<int, 42, 101, -13>;\n> >+static_assert( std::tuple_size_v<IS2> == 3 );\n> >+static_assert( std::is_same_v<std::tuple_element_t<1, IS2>, int> );\n> >+static_assert( std::get<2>(IS2{}) == -13 );\n> >+static_assert( destructure_sum(IS2{}) == 130 );\n> >+static_assert( noexcept(get<0>(IS2{})) );\n> >+\n> >+using IS3 = std::integer_sequence<char>;\n> >+static_assert( std::tuple_size_v<IS3> == 0 );\n> >+\n> >+using IS4 = std::integer_sequence<int, 1, 2>;\n> >+static_assert( !std::is_constructible_v<std::pair<int, int>, IS4> );\n> >+static_assert( !std::is_constructible_v<std::tuple<int, int>, IS4> );\n> >+\n> >+template<typename = void>\n> >+constexpr bool\n> >+test_basic()\n> >+{\n> >+  {\n> >+    auto [...elems] = std::make_index_sequence<0>{};\n> >+    static_assert( sizeof...(elems) == 0 );\n> >+  }\n> >+\n> >+  {\n> >+    auto [...elems] = std::integer_sequence<int, 3, 5, 7, 11>{};\n> >+\n> >+    static_assert( sizeof...(elems) == 4 );\n> >+\n> >+    VERIFY( elems...[0] == 3 );\n> >+    VERIFY( elems...[1] == 5 );\n> >+    VERIFY( elems...[2] == 7 );\n> >+    VERIFY( elems...[3] == 11 );\n> >+  }\n> >+\n> >+  {\n> >+    static constexpr auto [...elems] = std::integer_sequence<short, 2,\n> 4, 8, 16>{};\n> >+\n> >+    static_assert( sizeof...(elems) == 4 );\n> >+\n> >+    static_assert( elems...[0] == 2 );\n> >+    static_assert( elems...[1] == 4 );\n> >+    static_assert( elems...[2] == 8 );\n> >+    static_assert( elems...[3] == 16 );\n> >+  }\n> >+\n> >+  {\n> >+    constexpr auto [...elems] = std::integer_sequence<int, 1, 8, 2,\n> 11>{};\n> >+\n> >+    static_assert( sizeof...(elems) == 4 );\n> >+\n> >+    static_assert( elems...[0] == 1 );\n> >+    static_assert( elems...[1] == 8 );\n> >+    static_assert( elems...[2] == 2 );\n> >+    static_assert( elems...[3] == 11 );\n> >+  }\n> >+\n> >+  {\n> >+    static constexpr auto&& [...elems] = std::integer_sequence<short, 2,\n> 4, 8, 16>{};\n> >+\n> >+    static_assert( sizeof...(elems) == 4 );\n> >+\n> >+    static_assert( elems...[0] == 2 );\n> >+    static_assert( elems...[1] == 4 );\n> >+    static_assert( elems...[2] == 8 );\n> >+    static_assert( elems...[3] == 16 );\n> >+  }\n> >+\n> >+  /* Unimplemented, see PR117784\n> >+  {\n> >+    constexpr auto&& [...elems] = std::integer_sequence<int, 1, 8, 2,\n> 11>{};\n> >+\n> >+    static_assert( sizeof...(elems) == 4 );\n> >+\n> >+    static_assert( elems...[0] == 1 );\n> >+    static_assert( elems...[1] == 8 );\n> >+    static_assert( elems...[2] == 2 );\n> >+    static_assert( elems...[3] == 11 );\n> >+  }\n> >+  */\n> >+\n> >+  {\n> >+    auto idx = 0;\n> >+    static constexpr auto seq = std::make_index_sequence<4>{};\n> >+    template for (constexpr auto elem : seq)\n> >+      {\n> >+      VERIFY( elem == idx );\n> >+      ++idx;\n> >+      }\n> >+    VERIFY( idx == 4 );\n> >+  }\n> >+\n> >+\n> >+  /* Unimplemented, see PR117784\n> >+  {\n> >+    auto idx = 0;\n> >+    constexpr auto seq = std::make_index_sequence<4>{};\n> >+    template for (constexpr auto elem : seq)\n> >+      {\n> >+      VERIFY( elem == idx );\n> >+      ++idx;\n> >+      }\n> >+    VERIFY( idx == 4 );\n> >+  }\n> >+\n> >+  {\n> >+    auto idx = 0;\n> >+    template for (constexpr auto elem : std::make_index_sequence<4>{})\n> >+      {\n> >+      VERIFY( elem == idx );\n> >+      ++idx;\n> >+      }\n> >+    VERIFY( idx == 4 );\n> >+  }\n> >+  */\n> >+\n> >+  return true;\n> >+}\n> >+\n> >+static_assert( test_basic() );\n> >diff --git\n> a/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc\n> b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc\n> >new file mode 100644\n> >index 00000000000..8640114e7d3\n> >--- /dev/null\n> >+++ b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc\n> >@@ -0,0 +1,22 @@\n> >+// { dg-do compile { target c++26 } }\n> >+\n> >+#include <utility>\n> >+\n> >+using empty = std::integer_sequence<int>;\n> >+static_assert( std::is_same_v<std::tuple_element_t<0, empty>, int> ); //\n> { dg-error \"here\" }\n> >+static_assert( std::is_same_v<std::tuple_element_t<0, const empty>, int>\n> ); // { dg-error \"here\" }\n> >+\n> >+using size4 = std::integer_sequence<int, 1, 9, 7, 15>;\n> >+static_assert( std::is_same_v<std::tuple_element_t<4, size4>, int> ); //\n> { dg-error \"here\" }\n> >+static_assert( std::is_same_v<std::tuple_element_t<4, const size4>, int>\n> ); // { dg-error \"here\" }\n> >+\n> >+void\n> >+test()\n> >+{\n> >+  (void)std::get<0>(empty{}); // { dg-error \"here\" }\n> >+  (void)std::get<4>(size4{}); // { dg-error \"here\" }\n> >+}\n> >+\n> >+// { dg-error \"static assertion failed\" \"\" { target *-*-* } 0 }\n> >+// { dg-error \"cannot index an empty pack\" \"\" { target *-*-* } 0 }\n> >+// { dg-error \"pack index '.' is out of range for pack of length\" \"\" {\n> target *-*-* } 0 }\n> >diff --git a/libstdc++-v3/testsuite/experimental/feat-cxx14.cc\n> b/libstdc++-v3/testsuite/experimental/feat-cxx14.cc\n> >index c009062b55c..4cc56c5f76e 100644\n> >--- a/libstdc++-v3/testsuite/experimental/feat-cxx14.cc\n> >+++ b/libstdc++-v3/testsuite/experimental/feat-cxx14.cc\n> >@@ -18,8 +18,8 @@\n> >\n> > #ifndef  __cpp_lib_integer_sequence\n> > #  error \"__cpp_lib_integer_sequence\"\n> >-#elif  __cpp_lib_integer_sequence != 201304\n> >-#  error \"__cpp_lib_integer_sequence != 201304\"\n> >+#elif  __cpp_lib_integer_sequence < 201304\n> >+#  error \"__cpp_lib_integer_sequence < 201304\"\n> > #endif\n> >\n> > #ifndef  __cpp_lib_exchange_function\n> >--\n> >2.53.0\n> >\n> >\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=MsUbIM3p;\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=MsUbIM3p","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 4fw1hs3dmzz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 14 Apr 2026 21:07:57 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 7B8A44BA23EC\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 14 Apr 2026 11:07:55 +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 4AA504BA2E2D\n for <gcc-patches@gcc.gnu.org>; Tue, 14 Apr 2026 11:07:13 +0000 (GMT)","from mail-yw1-f197.google.com (mail-yw1-f197.google.com\n [209.85.128.197]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-584-8rM7NthqOT6viPKuVqAtDw-1; Tue, 14 Apr 2026 07:07:09 -0400","by mail-yw1-f197.google.com with SMTP id\n 00721157ae682-794d80fea59so103245337b3.1\n for <gcc-patches@gcc.gnu.org>; Tue, 14 Apr 2026 04:07:09 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 7B8A44BA23EC","OpenDKIM Filter v2.11.0 sourceware.org 4AA504BA2E2D"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 4AA504BA2E2D","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 4AA504BA2E2D","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776164833; cv=none;\n b=rGOLFE7gryPu5U72QKK//8uMvrs2P+CoK4e9bCP2CE6L/jqPoFMdwVBRGFnUn+IVBLFe+aFi83iAvZlvrwEOm6goKPlMv7HzwvbzOoquHIwoeQrxw6cVMu+3rQ8qGPtHahRYXYRNbEALtqXCCCQ5uxpM3pqtK088hCxHy+xJhNw=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776164833; c=relaxed/simple;\n bh=ObTNB4eeqYrtRipiPcVl6R0Pu+MBVF8T+VPM3oYWAAE=;\n h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To;\n b=htWZsaepXMRoiTUKgVmekkRcrMtdgunC9CYJURe8KshZ068ErDwxiW4bgs3MLM1KmmWO8DagTj04v/fxvPl8Ip5H+fW3Pfu2g1g5K5QS40vkvHea5rZqUJedWPDFwNB+B+tSgQ1eZEzmqHvj3FQuzAQ6nqgMA+JMbW7zZNK7oLo=","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=1776164833;\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=63VaHabyQBXmufGkSZnqrxwgsy0B4KQ05y/niMX/6Wk=;\n b=MsUbIM3pCcZyYDMX3BtwH55eYzEmKLHCD82IAriOaXzcUTbjKlnhAYSbNGfJF5zeifNP/z\n Axtdh42o1w4m6kT59Mz0jF4R1KQnV1AWACM7i3YMzyI+4I8SfNrU5yLzN9qqgSf9ZNaZQq\n slI6k1EkUJzI4O0nv3eIrV1TMRAYgZA=","X-MC-Unique":"8rM7NthqOT6viPKuVqAtDw-1","X-Mimecast-MFC-AGG-ID":"8rM7NthqOT6viPKuVqAtDw_1776164829","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776164829; x=1776769629;\n h=cc:to:subject:message-id:date:from:in-reply-to:references\n :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=63VaHabyQBXmufGkSZnqrxwgsy0B4KQ05y/niMX/6Wk=;\n b=CJA4l34brvgMidlS+s7b7tGgNf8cti7DMhuCKOA8fqWxxkZMDUpaC1RNLFIQrDYfmC\n Nf6LlE2J2no9KGBqt3obdFQHsfqBn9gRCI/zIpdSK4dfLDxZoQcYDgqSoQCT7eU6IBGT\n 1Y0RhVp+8FJn1a0yEHw7CJ8jXaUGwhSzTPEioB0O0Q22tLDWoGATskktY5ympIlhEjPQ\n S0TZHQ6d8EU6aEP6XYlpuq34sV0Pt6lEtrXZE4kqcKLuETnFtrKeq90rjTtWCUFO6Fwy\n 02ssx5fyVUPpBb6ODM+CtR0jTdVzwvsE/F2qGhcw1BW+/tjAB3GkrhO/fKul0MX2cokc\n 1otA==","X-Forwarded-Encrypted":"i=1;\n AFNElJ/lCehzJqZ786bh+LawQIV6zqtvmuDKt3v05FdWJ9xOubgrhYIDyTGXVugOaxVjR4sSbPxvTWLaKUTowg==@gcc.gnu.org","X-Gm-Message-State":"AOJu0YwQne5qUYRhG0Rpi/XIeFH7IvnvzhPnLhf/DwgyL5xsX/Bz51UV\n l8ufxub1N/v9vFqNI0yTbtPj0ZOJUFKfIMW9bKfTfg0RoG2XQ91IY9BDPxfaUOspBgUIB0S5v+6\n Qx18VO43k9e0hoDGyGjctnpVq4D6DiMQ0Z7/NPPiJK+k+u9paZ5SpPzX9oyEa7p2dbpymlMun3S\n A2Ovbr49dU7ZQK9n0Ttq55zYBlD1Ii6sAqFw==","X-Gm-Gg":"AeBDievgo6WDVwBXTaTGDkqB0t2YSVVF9cyFmW0gP4gDVbnjmVI2MXgQyaB8e85wJnn\n D8qtZIFPzJw1VzU0+5NmTGT+R7zwJaURViMRrGnkMWYAsXuZ1ZXzp10RJeBywHTbTg1NQdPH2+b\n tMQ2DMqxELe4s/IgquYBp29hHP2HNXijo8b72otvhtyJlyydJwgy97jBOLmrBPU9VlsGsL9kslC\n Dx9cBVv3pEfhZUDFeyygRTtv0qfC+1Y5cfk6nYojuZMhk0AmyFIi/gbQIp8mgOuFFE=","X-Received":["by 2002:a05:690c:6983:b0:7b3:a5ae:4204 with SMTP id\n 00721157ae682-7b3a5ae4d27mr68434457b3.14.1776164828802;\n Tue, 14 Apr 2026 04:07:08 -0700 (PDT)","by 2002:a05:690c:6983:b0:7b3:a5ae:4204 with SMTP id\n 00721157ae682-7b3a5ae4d27mr68434097b3.14.1776164828291; Tue, 14 Apr 2026\n 04:07:08 -0700 (PDT)"],"MIME-Version":"1.0","References":"\n <CAKvuMXARGgP=nX0sedLruVdEtLsoyNxyPmOdmy5_9nhyZD8aYw@mail.gmail.com>\n <20260409080243.196495-1-tkaminsk@redhat.com>\n <ad4N-X71mue55hjr@zen.kayari.org>","In-Reply-To":"<ad4N-X71mue55hjr@zen.kayari.org>","From":"Tomasz Kaminski <tkaminsk@redhat.com>","Date":"Tue, 14 Apr 2026 13:06:57 +0200","X-Gm-Features":"AQROBzATcceSML2IAKWPBhI_ak5erGNtAZ7lgdjOqKHeeBzU7sk1EGWMmKBC15M","Message-ID":"\n <CAKvuMXB8R6sD6E+3-0XJkGC5wojW3a7PdcSwSwGBfsMv6KF=5A@mail.gmail.com>","Subject":"Re: [PATCH v2] libstdc++: Implement structured binding support for\n integer_sequence","To":"Jonathan Wakely <jwakely@redhat.com>","Cc":"libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org,\n Matthias Wippich <mfwippich@gmail.com>,\n Ivan Lazaric <ivan.lazaric1@gmail.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"5p5sIs_7mbDyp_8Y6d0XivqLYZ81MkfwojXEcKpvDz4_1776164829","X-Mimecast-Originator":"redhat.com","Content-Type":"multipart/alternative; boundary=\"000000000000a7ba91064f699976\"","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"}}]