{"id":2227721,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2227721/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/20260424065244.262557-2-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":"<20260424065244.262557-2-tkaminsk@redhat.com>","date":"2026-04-24T06:41:09","name":"[v2,2/4] libstdc++: Support integer-class sized range in inplace_vector.","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"6111e25f03f7b4864a04122801c86faf3fbe7e98","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/20260424065244.262557-2-tkaminsk@redhat.com/mbox/","series":[{"id":501310,"url":"http://patchwork.ozlabs.org/api/1.1/series/501310/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=501310","date":"2026-04-24T06:41:08","name":"[v2,1/4] libstdc++: Merged concept for ranges with static sized.","version":2,"mbox":"http://patchwork.ozlabs.org/series/501310/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2227721/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2227721/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=DLOtjBHC;\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=DLOtjBHC","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 4g23Zp4pWCz1yD5\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 24 Apr 2026 16:53:38 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id D3FE54BB24D8\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 24 Apr 2026 06:53:36 +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 CB48F4BB1C19\n for <gcc-patches@gcc.gnu.org>; Fri, 24 Apr 2026 06:52:51 +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-269-Lz753FrdOTidhFjq2-iUnw-1; Fri,\n 24 Apr 2026 02:52:50 -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-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 0E5E41800345; Fri, 24 Apr 2026 06:52:49 +0000 (UTC)","from localhost (unknown [10.44.48.150])\n by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 72C0C196B8FA; Fri, 24 Apr 2026 06:52:48 +0000 (UTC)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org D3FE54BB24D8","OpenDKIM Filter v2.11.0 sourceware.org CB48F4BB1C19"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org CB48F4BB1C19","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org CB48F4BB1C19","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777013571; cv=none;\n b=tkj/mK8CvEc5fXPmd7xe/JgX7ywVVmyFdAf+AE8kn6hK+yR2VsFvNHqbX/TGar6RMCYgfDcNXJQ3qrNNmy8pK9Rm3xaIxEeMBkCGQaP7UhiP+p2nL22/xhmUlpjslk3t3amr9ULd1AUVbkQvun0brEYtGxmLMIgKRN79Ks5XQog=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777013571; c=relaxed/simple;\n bh=gXLH1NIEEgbrPsVHtU3R7SsAACozrzKlgXCKDlNXvEU=;\n h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version;\n b=L/jzfxYJKE1J2xUKHfxUFn9zOSy6fgTBr8q2cbr5bi1YRFKIVyyfpSZnSMOfzqvc8XciXq0nChnWY/vyrvhl9368NODWKKyhz9YiNj1qE5Ti5+6EV63mgMVW1HHN+cxkDZMyDzpt9gl1KmhXJrelPrlP/wyRpqhylDP/9kWXanM=","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=1777013571;\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 in-reply-to:in-reply-to:references:references;\n bh=lczxq+o+VUPpYBKJz89Res5DohRaIuUv+LSMcW8HFbM=;\n b=DLOtjBHCTpLLD5HJCPhVpD2PBY7uDOLdplXjvYrdoiidYIYzLOniXOJgyiw3dpNMpzfL6A\n /kFdCzaG5ZqhIeYlpL11GcAhrPLXX/p9aNf/i8PfYTmlfH6XOzkubnwE7ctfuRnwco8TvZ\n uRrNrFt4WTcBbSqdK+b45pDLqIlTIc4=","X-MC-Unique":"Lz753FrdOTidhFjq2-iUnw-1","X-Mimecast-MFC-AGG-ID":"Lz753FrdOTidhFjq2-iUnw_1777013569","From":"=?utf-8?q?Tomasz_Kami=C5=84ski?= <tkaminsk@redhat.com>","To":"libstdc++@gcc.gnu.org,\n\tgcc-patches@gcc.gnu.org","Subject":"[PATCH v2 2/4] libstdc++: Support integer-class sized range in\n inplace_vector.","Date":"Fri, 24 Apr 2026 08:41:09 +0200","Message-ID":"<20260424065244.262557-2-tkaminsk@redhat.com>","In-Reply-To":"<20260424065244.262557-1-tkaminsk@redhat.com>","References":"\n <CAKvuMXD7w0Psg1NYzgPYvqPg6WdgzSd0_NaU=8-yD6sVzhpGQQ@mail.gmail.com>\n <20260424065244.262557-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":"rs9tKnFtjN5juFipvQcPxMuCi9f0gSGnEcqmo78YKp0_1777013569","X-Mimecast-Originator":"redhat.com","Content-Transfer-Encoding":"8bit","content-type":"text/plain; charset=\"US-ASCII\"; x-default=true","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":"Simply cast size of the input range to size_t, after verifying that\nit fits in remaining capacity, and thus in size_t.\n\nlibstdc++-v3/ChangeLog:\n\n\t* include/std/inplace_vector (inplace_vector::assign_range)\n\t(inplace_vector::append_range): Cast ranges::distance(__rg)\n\tto size_t.\n\t* testsuite/23_containers/inplace_vector/cons/from_range.cc: New\n\ttest for ranges with integer-class size_type.\n\t* testsuite/23_containers/inplace_vector/modifiers/assign.cc:\n\tLikewise.\n\t* testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc:\n\tLikewise.\n---\nNew in v2 seriers, as I encountered this while testing integer-class ranges\nwith later patches.\n\nTested on x86_64-linux. OK for trunk?\n\n libstdc++-v3/include/std/inplace_vector       |  12 +-\n .../inplace_vector/cons/from_range.cc         |  59 +++++++++-\n .../inplace_vector/modifiers/assign.cc        |  55 ++++++++-\n .../inplace_vector/modifiers/multi_insert.cc  | 106 +++++++++++++++++-\n 4 files changed, 219 insertions(+), 13 deletions(-)","diff":"diff --git a/libstdc++-v3/include/std/inplace_vector b/libstdc++-v3/include/std/inplace_vector\nindex 5ad92332a02..0096bd83a17 100644\n--- a/libstdc++-v3/include/std/inplace_vector\n+++ b/libstdc++-v3/include/std/inplace_vector\n@@ -248,9 +248,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER\n \t{\n \t  if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)\n \t    {\n-\t      const auto __sz = ranges::distance(__rg);\n-\t      if (__sz > _Nm)\n+\t      const auto __len = ranges::distance(__rg);\n+\t      if (__len > _Nm)\n \t\t__throw_bad_alloc();\n+\n+\t      const size_t __sz = size_t(__len);\n \t      if (__sz <= size())\n \t\t{\n \t\t  ranges::copy_n(ranges::begin(__rg), __sz, data());\n@@ -523,9 +525,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER\n \t{\n \t  if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)\n \t    {\n-\t      const auto __sz = ranges::distance(__rg);\n-\t      if (__sz > (_Nm - size()))\n+\t      const auto __len = ranges::distance(__rg);\n+\t      if (__len > (_Nm - size()))\n \t\t__throw_bad_alloc();\n+\n+\t      const size_t __sz = size_t(__len);\n \t      // Bounded on output range due PR121143\n \t      ranges::uninitialized_copy(\n \t\tranges::begin(__rg), unreachable_sentinel,\ndiff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range.cc\nindex b79434dd111..b30fc04e4cd 100644\n--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range.cc\n+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range.cc\n@@ -2,6 +2,7 @@\n \n #include <inplace_vector>\n \n+#include <ranges>\n #include <span>\n #include <testsuite_hooks.h>\n #include <testsuite_iterators.h>\n@@ -77,7 +78,7 @@ test_iterators()\n   do_test_it<int, input_iterator_wrapper>();\n   do_test_it<int, forward_iterator_wrapper>();\n   do_test_it<int, random_access_iterator_wrapper>();\n-  \n+\n   do_test_it<short, forward_iterator_wrapper>();\n   return true;\n }\n@@ -108,7 +109,7 @@ do_test_r()\n     return;\n   }\n #endif\n-  \n+\n   try\n   {\n     std::inplace_vector<V, 5> v9(std::from_range, Range(a, a+9));\n@@ -161,11 +162,65 @@ test_ranges()\n   return true;\n }\n \n+template<typename T>\n+constexpr void\n+test_iota()\n+{\n+  T a[]{1,2,3,4,5,6,7,8,9,10};\n+\n+  std::inplace_vector<T, 10> v1(\n+    std::from_range, std::views::iota(T(1), T(11)));\n+  VERIFY( eq<T>(v1, {a, a+10}) );\n+\n+  std::inplace_vector<T, 10> v2(\n+    std::from_range,\n+    std::views::iota(T(1))\n+    | std::views::as_input\n+    | std::views::take_while([](T t) { return t <= 10; }));\n+  VERIFY( eq<T>(v2, {a, a+10}) );\n+\n+#ifdef __cpp_exceptions\n+#ifndef __cpp_lib_constexpr_exceptions\n+  if consteval {\n+    return;\n+  }\n+#endif\n+  constexpr T max = std::numeric_limits<T>::max();\n+  try\n+  {\n+    std::inplace_vector<T, 10> v(\n+      std::from_range, std::views::iota(T(0), max));\n+    VERIFY(false);\n+  }\n+  catch (std::bad_alloc const&)\n+  {\n+  }\n+\n+  try\n+  {\n+    std::inplace_vector<T, 10> v(\n+      std::from_range,\n+      std::views::iota(T(0))\n+      | std::views::as_input\n+      | std::views::take_while([](T t) { return t < 15; }));\n+    VERIFY(false);\n+  }\n+  catch (std::bad_alloc const&)\n+  {\n+  }\n+#endif\n+}\n+\n int main()\n {\n   auto test_all = [] {\n     test_iterators();\n     test_ranges();\n+\n+    test_iota<long long>();\n+#ifdef __SIZEOF_INT128__\n+    test_iota<__int128>();\n+#endif\n     return true;\n   };\n \ndiff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/assign.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/assign.cc\nindex c1d867ee1d4..577c1047708 100644\n--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/assign.cc\n+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/assign.cc\n@@ -2,6 +2,7 @@\n \n #include <inplace_vector>\n \n+#include <ranges>\n #include <span>\n #include <testsuite_hooks.h>\n #include <testsuite_iterators.h>\n@@ -353,6 +354,53 @@ test_assigns()\n   test_resize<T>();\n }\n \n+template<typename T>\n+constexpr void\n+test_iota()\n+{\n+  T a[]{1,2,3,4,5,6,7,8,9,10};\n+\n+  std::inplace_vector<T, 10> v;\n+  v.assign_range(std::views::iota(T(1), T(11)));\n+  VERIFY( eq<T>(v, {a, a+10}) );\n+\n+  v.assign_range(\n+    std::views::iota(T(1))\n+    | std::views::as_input\n+    | std::views::take_while([](T t) { return t <= 10; }));\n+  VERIFY( eq<T>(v, {a, a+10}) );\n+\n+#ifdef __cpp_exceptions\n+#ifndef __cpp_lib_constexpr_exceptions\n+  if consteval {\n+    return;\n+  }\n+#endif\n+  constexpr T max = std::numeric_limits<T>::max();\n+  try\n+  {\n+    v.assign_range(std::views::iota(T(0), max));\n+    VERIFY(false);\n+  }\n+  catch (std::bad_alloc const&)\n+  {\n+  }\n+  VERIFY( eq<T>(v, {a, 10}) );\n+\n+  try\n+  {\n+    v.assign_range(\n+      std::views::iota(T(0))\n+      | std::views::as_input\n+      | std::views::take_while([](T t) { return t < 15; }));\n+    VERIFY(false);\n+  }\n+  catch (std::bad_alloc const&)\n+  {\n+  }\n+#endif\n+}\n+\n int main()\n {\n   auto test_all = [] {\n@@ -368,10 +416,15 @@ int main()\n       test_assign_empty<2, X>();\n       test_assigns<X>();\n     }\n+\n+    test_iota<long long>();\n+#ifdef __SIZEOF_INT128__\n+    test_iota<__int128>();\n+#endif\n+\n     return true;\n   };\n \n-\n   test_all();\n   static_assert(test_all());\n }\ndiff --git a/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc b/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc\nindex e5a482cdc65..bde66847a34 100644\n--- a/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc\n+++ b/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc\n@@ -2,6 +2,7 @@\n \n #include <inplace_vector>\n \n+#include <ranges>\n #include <span>\n #include <testsuite_hooks.h>\n #include <testsuite_iterators.h>\n@@ -506,6 +507,8 @@ test_insert_repeated()\n #endif\n }\n \n+\n+\n template<typename T>\n constexpr void\n test_inserts()\n@@ -526,16 +529,102 @@ test_inserts()\n   test_insert_iterators<T, forward_iterator_wrapper>();\n   test_insert_iterators<T, random_access_iterator_wrapper>();\n \n-test_insert_initializer_list<T>();\n-test_insert_repeated<T>();\n+  test_insert_initializer_list<T>();\n+  test_insert_repeated<T>();\n+}\n+\n+template<typename T>\n+constexpr void\n+test_iota()\n+{\n+  T a[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};\n+\n+  std::inplace_vector<T, 20> v;\n+  auto it = v.insert_range(v.begin(), std::views::iota(T(1), T(11)));\n+  VERIFY( eq<T>(v, {a, a+10}) );\n+  VERIFY( it == v.begin() );\n+\n+  v.append_range(std::views::iota(T(11), T(16)));\n+  VERIFY( eq<T>(v, {a, 15}) );\n+\n+  v.clear();\n+  it = v.insert_range(v.begin(),\n+    std::views::iota(T(1))\n+    | std::views::as_input\n+    | std::views::take_while([](T t) { return t <= 10; }));\n+  VERIFY( eq<T>(v, {a, a+10}) );\n+  VERIFY( it == v.begin() );\n+\n+  v.append_range(\n+    std::views::iota(T(11))\n+    | std::views::as_input\n+    | std::views::take_while([](T t) { return t <= 15; }));\n+  VERIFY( eq<T>(v, {a, 15}) );\n+\n+#ifdef __cpp_exceptions\n+#ifndef __cpp_lib_constexpr_exceptions\n+  if consteval {\n+    return;\n+  }\n+#endif\n+  constexpr T max = std::numeric_limits<T>::max();\n+  try\n+  {\n+    v.insert_range(v.end(), std::views::iota(T(0), max));\n+    VERIFY(false);\n+  }\n+  catch (std::bad_alloc const&)\n+  {\n+  }\n+  VERIFY( eq<T>(v, {a, 15}) );\n+\n+  try\n+  {\n+    v.append_range(std::views::iota(T(0), max));\n+    VERIFY(false);\n+  }\n+  catch (std::bad_alloc const&)\n+  {\n+  }\n+  VERIFY( eq<T>(v, {a, 15}) );\n+\n+  auto vc = v;\n+  try\n+  {\n+    vc.insert_range(vc.end(),\n+      std::views::iota(T(1))\n+      | std::views::as_input\n+      | std::views::take_while([](T t) { return t <= 20; }));\n+    VERIFY(false);\n+  }\n+  catch (std::bad_alloc const&)\n+  {\n+  }\n+  VERIFY( prefix<T>(vc, {a, 15}) );\n+\n+  vc = v;\n+  try\n+  {\n+    vc.append_range(\n+      std::views::iota(T(1))\n+      | std::views::as_input\n+      | std::views::take_while([](T t) { return t <= 20; }));\n+    VERIFY(false);\n+  }\n+  catch (std::bad_alloc const&)\n+  {\n+  }\n+  VERIFY( prefix<T>(vc, {a, 15}) );\n+\n+#endif\n }\n \n int main()\n {\n-auto test_all = []{\n-  test_add_to_full<0, int>();\n-  test_add_to_full<0, X>();\n-  test_add_to_full<4, int>();\n+  auto test_all = []{\n+    test_add_to_full<0, int>();\n+    test_add_to_full<0, X>();\n+    test_add_to_full<4, int>();\n \n     test_inserts<int>();\n #ifdef __cpp_lib_constexpr_inplace_vector\n@@ -545,6 +634,11 @@ auto test_all = []{\n       test_add_to_full<4, X>();\n       test_inserts<X>();\n     }\n+\n+    test_iota<long long>();\n+#ifdef __SIZEOF_INT128__\n+    test_iota<__int128>();\n+#endif\n     return true;\n   };\n \n","prefixes":["v2","2/4"]}