{"id":2221469,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2221469/?format=json","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=json","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=json","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=json","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":[]}