Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.1/patches/2221469/?format=api
{ "id": 2221469, "url": "http://patchwork.ozlabs.org/api/1.1/patches/2221469/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/patch/20260409132833.451634-1-tkaminsk@redhat.com/", "project": { "id": 17, "url": "http://patchwork.ozlabs.org/api/1.1/projects/17/?format=api", "name": "GNU Compiler Collection", "link_name": "gcc", "list_id": "gcc-patches.gcc.gnu.org", "list_email": "gcc-patches@gcc.gnu.org", "web_url": null, "scm_url": null, "webscm_url": null }, "msgid": "<20260409132833.451634-1-tkaminsk@redhat.com>", "date": "2026-04-09T13:09:14", "name": "libstdc++: Remove span constructor from initializer_list.", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "86d681ea7ad524ff97acfbd61af948eed27b6f3f", "submitter": { "id": 90409, "url": "http://patchwork.ozlabs.org/api/1.1/people/90409/?format=api", "name": "Tomasz Kamiński", "email": "tkaminsk@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/20260409132833.451634-1-tkaminsk@redhat.com/mbox/", "series": [ { "id": 499301, "url": "http://patchwork.ozlabs.org/api/1.1/series/499301/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/list/?series=499301", "date": "2026-04-09T13:09:14", "name": "libstdc++: Remove span constructor from initializer_list.", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/499301/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2221469/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2221469/checks/", "tags": {}, "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=fGMln4yq;\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=fGMln4yq", "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 [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 4fs1493klHz1yD3\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 09 Apr 2026 23:29:12 +1000 (AEST)", "from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 695BA4BA2E17\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 9 Apr 2026 13:29:10 +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 77AAE4BA2E0F\n for <gcc-patches@gcc.gnu.org>; Thu, 9 Apr 2026 13:28:40 +0000 (GMT)", "from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-25-7bvhRqVcPXWDVh5PSm2QcQ-1; Thu,\n 09 Apr 2026 09:28:37 -0400", "from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17])\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-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 261A01956095; Thu, 9 Apr 2026 13:28:36 +0000 (UTC)", "from localhost (unknown [10.44.33.240])\n by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 91E24195608E; Thu, 9 Apr 2026 13:28:35 +0000 (UTC)" ], "DKIM-Filter": [ "OpenDKIM Filter v2.11.0 sourceware.org 695BA4BA2E17", "OpenDKIM Filter v2.11.0 sourceware.org 77AAE4BA2E0F" ], "DMARC-Filter": "OpenDMARC Filter v1.4.2 sourceware.org 77AAE4BA2E0F", "ARC-Filter": "OpenARC Filter v1.0.0 sourceware.org 77AAE4BA2E0F", "ARC-Seal": "i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1775741320; cv=none;\n b=fthhLy2EPDvxUxrJKHnS4Syej5ITn1o0t3BoY5Vt5Wq8AiIvIt1+nMfPn4PWr/kmTEc0Tex6CflNR/MxSgDOnuVZqYqEbqJvWX/PgvtJlnVkwFhhSqD5Dzjvi0cre64nQYMNA1si7Q1gYmQV8+baUPWmRSFYCzsv8Xnn8/az3rA=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1775741320; c=relaxed/simple;\n bh=FY/Jh4o1sTnC8wv1pxAnvdgpNmL/Kr5zWr0s06gjupI=;\n h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version;\n b=HkCEwx/X95YyF0tOLcQE2cBe6DLWksu3athCrdhnh6VdAJlBTsEv++IHofyxRCDlHhFTLkaLpo8Syh4Q+woPCEZhqDg+zqd9PX5ACzJlj+//ud/XWWmaDlpXNFewapHNBF2/jSBBYWt2wsumDBYWZ4uIffPblPrrAtUrgMakAGc=", "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=1775741320;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding;\n bh=82qJEzwx/Kowb+NPDHFcaN1KIhzZr//TKG5tjshKcQ8=;\n b=fGMln4yqYHdwT7Ptv5pEa0dLtrC8xGSoFDkojfzmFFJfFnRdHqkYJRrUilb6QToIu8G/BK\n IcfVF1eosPi+PVeNOXIr+8Axi6MBqSTxfEYoRVEd1kgSEFO5n72qWa9ieFu64No1FquyMm\n LOUx2gHBgTogxRJqDQxCwF/kwlAqqSc=", "X-MC-Unique": "7bvhRqVcPXWDVh5PSm2QcQ-1", "X-Mimecast-MFC-AGG-ID": "7bvhRqVcPXWDVh5PSm2QcQ_1775741316", "From": "=?utf-8?q?Tomasz_Kami=C5=84ski?= <tkaminsk@redhat.com>", "To": "libstdc++@gcc.gnu.org,\n\tgcc-patches@gcc.gnu.org", "Subject": "[PATCH] libstdc++: Remove span constructor from initializer_list.", "Date": "Thu, 9 Apr 2026 15:09:14 +0200", "Message-ID": "<20260409132833.451634-1-tkaminsk@redhat.com>", "MIME-Version": "1.0", "X-Scanned-By": "MIMEDefang 3.0 on 10.30.177.17", "X-Mimecast-Spam-Score": "0", "X-Mimecast-MFC-PROC-ID": "2LypKuFOtXdLmrb3FtzhD-A-khv4T2q3MHm9ClCG-lw_1775741316", "X-Mimecast-Originator": "redhat.com", "Content-Type": "text/plain; charset=UTF-8", "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" }, "content": "Following LWG4520 resolution from paper\nP4144R1 Remove span’s initializer_list constructor for C++26.\n\nlibstdc++-v3/ChangeLog:\n\n\t* include/bits/version.def (span_initializer_list): Remove.\n\t* include/bits/version.h: Regenerate.\n\t* include/std/span (span::span(initializer_list<value_type>)):\n\tRemove.\n\t* testsuite/23_containers/span/init_list_cons.cc: Removed.\n\t* testsuite/23_containers/span/init_list_cons_neg.cc: Removed.\n\t* testsuite/23_containers/inplace_vector/copy.cc: Replace span\n\twith initializer_list in eq helper.\n\t* testsuite/23_containers/inplace_vector/erasure.cc: Likewise.\n\t* testsuite/23_containers/inplace_vector/move.cc: Likewise.\n---\nOf course I have managed to use this constructor in inplace_vector test,\nreplaced it with initializer_list.\n\nTested on x86_64-linux. OK for trunk?\n\n libstdc++-v3/include/bits/version.def | 8 ---\n libstdc++-v3/include/bits/version.h | 10 ---\n libstdc++-v3/include/std/span | 16 +----\n .../23_containers/inplace_vector/copy.cc | 2 +-\n .../23_containers/inplace_vector/erasure.cc | 11 +---\n .../23_containers/inplace_vector/move.cc | 2 +-\n .../23_containers/span/init_list_cons.cc | 65 -------------------\n .../23_containers/span/init_list_cons_neg.cc | 36 ----------\n 8 files changed, 6 insertions(+), 144 deletions(-)\n delete mode 100644 libstdc++-v3/testsuite/23_containers/span/init_list_cons.cc\n delete mode 100644 libstdc++-v3/testsuite/23_containers/span/init_list_cons_neg.cc", "diff": "diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def\nindex cfb90533ce4..bdc282ab123 100644\n--- a/libstdc++-v3/include/bits/version.def\n+++ b/libstdc++-v3/include/bits/version.def\n@@ -2168,14 +2168,6 @@ ftms = {\n };\n };\n \n-ftms = {\n- name = span_initializer_list;\n- values = {\n- v = 202311;\n- cxxmin = 26;\n- };\n-};\n-\n ftms = {\n name = text_encoding;\n values = {\ndiff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h\nindex 22dd31b9d32..1278725cfa2 100644\n--- a/libstdc++-v3/include/bits/version.h\n+++ b/libstdc++-v3/include/bits/version.h\n@@ -2426,16 +2426,6 @@\n #endif /* !defined(__cpp_lib_saturation_arithmetic) */\n #undef __glibcxx_want_saturation_arithmetic\n \n-#if !defined(__cpp_lib_span_initializer_list)\n-# if (__cplusplus > 202302L)\n-# define __glibcxx_span_initializer_list 202311L\n-# if defined(__glibcxx_want_all) || defined(__glibcxx_want_span_initializer_list)\n-# define __cpp_lib_span_initializer_list 202311L\n-# endif\n-# endif\n-#endif /* !defined(__cpp_lib_span_initializer_list) */\n-#undef __glibcxx_want_span_initializer_list\n-\n #if !defined(__cpp_lib_text_encoding)\n # if (__cplusplus > 202302L) && _GLIBCXX_HOSTED && (_GLIBCXX_USE_NL_LANGINFO_L)\n # define __glibcxx_text_encoding 202306L\ndiff --git a/libstdc++-v3/include/std/span b/libstdc++-v3/include/std/span\nindex a2f338449c8..a5f5bf48f90 100644\n--- a/libstdc++-v3/include/std/span\n+++ b/libstdc++-v3/include/std/span\n@@ -47,9 +47,7 @@\n #include <cstddef>\n #include <bits/stl_iterator.h>\n #include <bits/ranges_base.h>\n-#ifdef __cpp_lib_span_initializer_list\n-# include <initializer_list>\n-#endif\n+\n namespace std _GLIBCXX_VISIBILITY(default)\n {\n _GLIBCXX_BEGIN_NAMESPACE_VERSION\n@@ -232,18 +230,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t: _M_ptr(ranges::data(__range)), _M_extent(ranges::size(__range))\n \t{ }\n \n-#if __cpp_lib_span_initializer_list >= 202311L // >= C++26\n-#pragma GCC diagnostic push\n-#pragma GCC diagnostic ignored \"-Winit-list-lifetime\"\n- constexpr\n- explicit(extent != dynamic_extent)\n- span(initializer_list<value_type> __il)\n- requires (is_const_v<_Type>)\n- : _M_ptr(__il.begin()), _M_extent(__il.size())\n- { }\n-#pragma GCC diagnostic pop\n-#endif\n-\n constexpr\n span(const span&) noexcept = default;\n \ndiff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/copy.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/copy.cc\nindex 917eebd80f7..11260c63313 100644\n--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/copy.cc\n+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/copy.cc\n@@ -138,7 +138,7 @@ static_assert(std::is_trivially_copy_assignable_v<std::inplace_vector<Z, 0>>);\n \n template<typename T, size_t N>\n constexpr bool\n-eq(const std::inplace_vector<T, N>& s, std::span<const T> o)\n+eq(const std::inplace_vector<T, N>& s, std::initializer_list<std::type_identity_t<T>> o)\n { return std::ranges::equal(s, o); }\n \n constexpr void\ndiff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/erasure.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/erasure.cc\nindex 8fb56e90623..a019dc0a1f1 100644\n--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/erasure.cc\n+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/erasure.cc\n@@ -1,18 +1,13 @@\n // { dg-do run { target c++26 } }\n \n #include <inplace_vector>\n+#include <ranges>\n #include <testsuite_hooks.h>\n-#include <span>\n \n template<typename T, size_t N>\n constexpr bool\n-eq(const std::inplace_vector<T, N>& l, std::span<const T> r) {\n- if (l.size() != r.size())\n- return false;\n- for (auto i = 0u; i < l.size(); ++i)\n- if (l[i] != r[i])\n- return false;\n- return true;\n+eq(const std::inplace_vector<T, N>& l, std::initializer_list<std::type_identity_t<T>> r) {\n+ return std::ranges::equal(l, r);\n };\n \n constexpr void\ndiff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/move.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/move.cc\nindex e8703e027fe..8b5c3e9f247 100644\n--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/move.cc\n+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/move.cc\n@@ -177,7 +177,7 @@ static_assert(std::is_nothrow_swappable_v<std::inplace_vector<Z, 0>>);\n \n template<typename T, size_t N>\n constexpr bool\n-eq(const std::inplace_vector<T, N>& s, std::span<const T> o)\n+eq(const std::inplace_vector<T, N>& s, std::initializer_list<std::type_identity_t<T>> o)\n { return std::ranges::equal(s, o); }\n \n constexpr void\ndiff --git a/libstdc++-v3/testsuite/23_containers/span/init_list_cons.cc b/libstdc++-v3/testsuite/23_containers/span/init_list_cons.cc\ndeleted file mode 100644\nindex 1dc30ab1a50..00000000000\n--- a/libstdc++-v3/testsuite/23_containers/span/init_list_cons.cc\n+++ /dev/null\n@@ -1,65 +0,0 @@\n-// { dg-do compile { target c++26 } }\n-\n-#include <span>\n-#include <type_traits>\n-\n-#if !defined(__cpp_lib_span_initializer_list)\n-# error \"__cpp_lib_span_initializer_list should be defined\"\n-#elif __cpp_lib_span_initializer_list < 202311L\n-# error \"Wrong value for __cpp_lib_span_initializer_list (should be >= 202311L)\"\n-#endif\n-\n-// Check the constraint on the initializer_list constructor\n-static_assert( std::is_const_v<std::span<const int>::element_type>);\n-static_assert(!std::is_const_v<std::span< int>::element_type>);\n-\n-static_assert( std::is_constructible_v<std::span<const int >, std::initializer_list< int>>);\n-static_assert( std::is_constructible_v<std::span<const int >, std::initializer_list<const int>>);\n-static_assert( std::is_constructible_v<std::span<const int, 42>, std::initializer_list< int>>);\n-static_assert( std::is_constructible_v<std::span<const int, 42>, std::initializer_list<const int>>);\n-static_assert(!std::is_constructible_v<std::span< int >, std::initializer_list< int>>);\n-static_assert(!std::is_constructible_v<std::span< int >, std::initializer_list<const int>>);\n-static_assert(!std::is_constructible_v<std::span< int, 42>, std::initializer_list< int>>);\n-static_assert(!std::is_constructible_v<std::span< int, 42>, std::initializer_list<const int>>);\n-\n-// Check the explicit-ness on the initializer_list constructor\n-static_assert( std::is_convertible_v<std::initializer_list< int>, std::span<const int >>);\n-static_assert( std::is_convertible_v<std::initializer_list<const int>, std::span<const int >>);\n-static_assert(!std::is_convertible_v<std::initializer_list< int>, std::span<const int, 42>>);\n-static_assert(!std::is_convertible_v<std::initializer_list<const int>, std::span<const int, 42>>);\n-static_assert(!std::is_convertible_v<std::initializer_list< int>, std::span< int >>);\n-static_assert(!std::is_convertible_v<std::initializer_list<const int>, std::span< int >>);\n-static_assert(!std::is_convertible_v<std::initializer_list< int>, std::span< int, 42>>);\n-static_assert(!std::is_convertible_v<std::initializer_list<const int>, std::span< int, 42>>);\n-\n-constexpr size_t fun1(std::span<const int> s)\n-{\n- return s.size();\n-}\n-\n-static_assert(fun1({}) == 0);\n-static_assert(fun1({1, 2, 3}) == 3);\n-static_assert(fun1(std::initializer_list<int>{1, 2, 3}) == 3);\n-\n-// Stress-test array->pointer decays\n-struct decayer {\n- constexpr decayer() = default;\n- constexpr decayer(decayer *) {}\n-};\n-\n-constexpr size_t fun2(std::span<const decayer> s)\n-{\n- return s.size();\n-}\n-\n-void test01()\n-{\n- int intArray[42];\n- static_assert(fun1(intArray) == 42);\n-\n- decayer decArray[42];\n- static_assert(fun2(decArray) == 42);\n- static_assert(fun2({decArray}) == 1); // decayer[] -> decayer* -> decayer(decayer*) -> init_list<decayer> of 1 element\n- static_assert(fun2({decArray, decArray + 42}) == 2); // does not select span(iterator, iterator)\n- static_assert(fun2({decArray, decArray, decArray}) == 3);\n-}\ndiff --git a/libstdc++-v3/testsuite/23_containers/span/init_list_cons_neg.cc b/libstdc++-v3/testsuite/23_containers/span/init_list_cons_neg.cc\ndeleted file mode 100644\nindex 6b78156ad5d..00000000000\n--- a/libstdc++-v3/testsuite/23_containers/span/init_list_cons_neg.cc\n+++ /dev/null\n@@ -1,36 +0,0 @@\n-// { dg-do run { target { c++20 && c++23_down } } }\n-// { dg-do compile { target c++26 } }\n-\n-#include <span>\n-#include <utility>\n-\n-#include <testsuite_hooks.h>\n-\n-struct Any {\n- constexpr Any() { }\n- template<typename T> constexpr Any(T) { }\n-};\n-\n-// Examples from P2447R4\n-void one(std::pair<int, int>) {}\n-void one(std::span<const int>) {}\n-void two(std::span<const int, 2>) {}\n-constexpr std::size_t three(std::span<void * const> v) { return v.size(); }\n-constexpr std::size_t four(std::span<const Any> v) { return v.size(); }\n-\n-void *array3[10];\n-Any array4[10];\n-\n-int main()\n-{\n- one({1, 2}); // { dg-error \"call of overloaded\" \"should be ambiguous with the one(std::pair) overload\" { target c++26 } }\n- two({{1, 2}}); // { dg-error \"would use explicit constructor\" \"should prefer the initializer_list constructor, which is explicit\" { target c++26 } }\n-\n-#if __cpp_lib_span_initializer_list\n- static_assert(three({array3, 0}) == 2);\n- static_assert(four({array4, array4 + 10}) == 2);\n-#else\n- static_assert(three({array3, 0}) == 0);\n- static_assert(four({array4, array4 + 10}) == 10);\n-#endif\n-}\n", "prefixes": [] }