[{"id":3675129,"web_url":"http://patchwork.ozlabs.org/comment/3675129/","msgid":"<CAKvuMXARGgP=nX0sedLruVdEtLsoyNxyPmOdmy5_9nhyZD8aYw@mail.gmail.com>","list_archive_url":null,"date":"2026-04-09T07:52:27","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 4:45 AM Matthias Wippich <mfwippich@gmail.com> wrote:\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> Corresponding C++ draft commit: 3d71a838ed2a1689dd329f964ec4d58152487151\n> Feature-test macro integer_sequence has been bumped to 202511L.\n>\n> libstdc++-v3/ChangeLog:\n>\n>         * include/bits/utility.h:\n>         Implement structured bindings protocol for std::integer_sequence.\n>\nThis should list entities added.\n\n>         * include/bits/version.def: Bump integer_sequence feature-test\n> macro.\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>\n> Co-authored-by: Ivan Lazaric <ivan.lazaric1@gmail.com>\n> Signed-off-by: Matthias Wippich <mfwippich@gmail.com>\n> ---\n>\nThere is another test that needs updating, and few whitespace errors.\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\nI am doing above changes locally and will post new revision.\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  | 96 +++++++++++++++++++\n>  .../integer_sequence/tuple_access_neg.cc      | 21 ++++\n>  5 files changed, 158 insertions(+), 1 deletion(-)\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..a942d1d8396\n> --- /dev/null\n> +++ b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access.cc\n> @@ -0,0 +1,96 @@\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> +  /* Unimplemented, see\n> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117784\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..42c57620e91\n> --- /dev/null\n> +++ b/libstdc++-v3/testsuite/20_util/integer_sequence/tuple_access_neg.cc\n> @@ -0,0 +1,21 @@\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>\nThere are trailing whitespace at the end of the lines above and test()\nfile, removed them.\n\n> +}\n> +\n> +// { dg-error \"static assertion failed\" \"\" { target *-*-* } 0 }\n> +// { dg-excess-errors \"\" }\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=DePye8Yp;\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=DePye8Yp","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 4frscY4qWTz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 09 Apr 2026 17:53:16 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 2CF2A4BA2E3C\n\tfor <incoming@patchwork.ozlabs.org>; Thu,  9 Apr 2026 07:53:14 +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 D4D534BA2E0C\n for <gcc-patches@gcc.gnu.org>; Thu,  9 Apr 2026 07:52:41 +0000 (GMT)","from mail-yw1-f200.google.com (mail-yw1-f200.google.com\n [209.85.128.200]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-588-ZL7y7yO9PUyswmckcH1YTw-1; Thu, 09 Apr 2026 03:52:39 -0400","by mail-yw1-f200.google.com with SMTP id\n 00721157ae682-79a51ba2bf9so15886157b3.3\n for <gcc-patches@gcc.gnu.org>; Thu, 09 Apr 2026 00:52:39 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 2CF2A4BA2E3C","OpenDKIM Filter v2.11.0 sourceware.org D4D534BA2E0C"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org D4D534BA2E0C","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org D4D534BA2E0C","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1775721162; cv=none;\n b=bCVZl5IGMuLrh64U/lKNs7aTT3AHwvGKerQDsBgVglwFe0Bq7KCsR2Z7d+uHJzO3aXA+kLEPU/NunhPzPyeT/vbAUKT3fQNqFj2Hz5SdbWusjRX+4Q7P+lOdkKbhwTlASwnH/8gVAU0XpR5IrdJhrGXRBWoSH+7+EQHKEt9M98w=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1775721162; c=relaxed/simple;\n bh=aNrnz6hKnezg2UcbQgbbe1URQ6qwSXbF6sq+pYX+hsI=;\n h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To;\n b=TO296GkOUDIO2lBPKEujcUkib2B7kmnEG66enul0P67hNJdBAFVGFqA+A4JCCGpeVfADchEQq8cw2y91zI5gHgG1WzNK0E78ryrugH9CBlhl5e5Jpik8e4ti+v1Z0hl9WRu0gKSYYDYJ9Hp2xNrNhwmGvHj5fYTXrdb42H1ZFkA=","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=1775721161;\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=bpB+Ba60qoZn+O41kDgp9qQUFCkUDCddWlMsj1JzMUY=;\n b=DePye8YpG5qtkTDDFEHm4fM0ZFmQKDsqExJSVgCFHNqIZKFSlMOiqlgsbip2yHwcxofEqd\n yZmWavnQHQj3NlpSAlznMXUy9ZH9dIltAQWV9NVHNRTq9kAwptrfuQhg8KFXg7MNMiBMh9\n PFGgxPlHqq2pVPQrwtyxepW8KYd5eVY=","X-MC-Unique":"ZL7y7yO9PUyswmckcH1YTw-1","X-Mimecast-MFC-AGG-ID":"ZL7y7yO9PUyswmckcH1YTw_1775721159","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775721159; x=1776325959;\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=bpB+Ba60qoZn+O41kDgp9qQUFCkUDCddWlMsj1JzMUY=;\n b=JssqPhYdxPlfBw0UiOOXbD4FSb0DMFCiByWG9nwYmnhio2tP1GLjE+CQfN9RRWDbML\n +dyHcKKBnBVdYRLE0+GtD3Ux9MK28ebrZ6WpAf5QrT1jzdGENlNfgpFt8YBWqxcppWIr\n rLbzwA8XzVf2KPi6PnD4AuOUZib04lHP83fMRZU+eTMqXr7qS3rYOheDBCpTLRT/GoUw\n heyr5eyc2X9nbAz/BeEFk2eXGCDUie2gLoDiOruhFrCNHCjdS9U+puqfHV32RYPT/jeB\n m1cE5hsBiTWIFm9cccb2nea502j+N+f3CThD8SzuCcAc+qL/64bMkBkAUM3VnXY4G3Vg\n 4rGw==","X-Forwarded-Encrypted":"i=1;\n AJvYcCWLlm51abONPw3037PuWDcNRazzyaNl3c32Gf6ITi1ePxgIMsZpBOBriZ+/HcVO9UCzanJxbdPOdEzXew==@gcc.gnu.org","X-Gm-Message-State":"AOJu0YzBcm7JNxuAHeTqpjU8TybBqKx2hC2cChCrkswzxYtJqCRBOqAy\n eQ7utV1B0IZSeJkFn0OdWTQcgb3K3l+jnz0ESmJrZHKPfwYhh7CfRBIMU2fxsW87d5Q4uaMsyOZ\n MmsdsOTH4G0YAlztpd7XaV5AlgPZiMVKf0So4mCh8R4plM1ykZbAOv4UWVOQyJUFs6EkSii3n/2\n hnXgGK4AI0jTMnJbHYeIuvj4Erh3pgFYS7LQ==","X-Gm-Gg":"AeBDieuyLRO7mbJTJIpffKArwbblI5arFXaODcXhtcwNBxMbZOe8grs5Ys6m+xeIimZ\n dzadf3W+iHImwHt4TEROI09knggAuosrgUmwPdcWERnY+2QNhG+Ee2aR3NVXf7oV7z1W+zoiJpE\n LsiSkmBm0fAsettSHlfjaiwHcQnnlZ+o0FN1a47Wd09166f86IjwE7spRbzW6TODFe6gGZlqSmj\n tpSP438jH9dmkgSOjVRrkVo89pkH4MoEPeSdP53Vm6gHfR/OEyvc8GWedOYQCiWIXeK","X-Received":["by 2002:a05:690c:768d:b0:7a1:e3cc:d223 with SMTP id\n 00721157ae682-7adf149df19mr22117857b3.4.1775721158977;\n Thu, 09 Apr 2026 00:52:38 -0700 (PDT)","by 2002:a05:690c:768d:b0:7a1:e3cc:d223 with SMTP id\n 00721157ae682-7adf149df19mr22117707b3.4.1775721158557; Thu, 09 Apr 2026\n 00:52:38 -0700 (PDT)"],"MIME-Version":"1.0","References":"<20260409024128.421442-4-mfwippich@gmail.com>","In-Reply-To":"<20260409024128.421442-4-mfwippich@gmail.com>","From":"Tomasz Kaminski <tkaminsk@redhat.com>","Date":"Thu, 9 Apr 2026 09:52:27 +0200","X-Gm-Features":"AQROBzB68ijP8kQXp6pQcqP8XGrxzWw5eMaPFx7Suwe65rwUDZ3msG63vmDdnDM","Message-ID":"\n <CAKvuMXARGgP=nX0sedLruVdEtLsoyNxyPmOdmy5_9nhyZD8aYw@mail.gmail.com>","Subject":"Re: [PATCH v2] libstdc++: Implement structured binding support for\n integer_sequence","To":"Matthias Wippich <mfwippich@gmail.com>","Cc":"libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org,\n Ivan Lazaric <ivan.lazaric1@gmail.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"v5iHeVrj0wmzJp6ON3KEfN0Y7o0vlvPBm2TheBgkZis_1775721159","X-Mimecast-Originator":"redhat.com","Content-Type":"multipart/alternative; boundary=\"000000000000e06234064f024c0c\"","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"}}]