[libcxx-commits] [libcxx] [libc++] Remove `_Tag` template parameter from __capacity_aware_iterator (PR #224983)

William Tran-Viet via libcxx-commits libcxx-commits at lists.llvm.org
Sun Sep 20 18:37:11 PDT 2026


https://github.com/smallp-o-p created https://github.com/llvm/llvm-project/pull/224983

Since it was decided that `_Tag` likely brings more trouble than it does benefits, remove it and all locations that used `__capacity_aware_iterator` (so just `optional`).

>From 5578660aed0ebb147967381d70f5329d8b7b822f Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Sun, 20 Sep 2026 21:35:13 -0400
Subject: [PATCH] Remove _Tag template parameter from __capacity_aware_iterator

---
 .../__iterator/capacity_aware_iterator.h      | 15 +++++------
 libcxx/include/__optional/optional.h          |  8 +++---
 libcxx/include/__optional/optional_ref.h      |  4 +--
 .../capacity_aware_iter/arithmetic.pass.cpp   | 26 +++++++++----------
 .../capacity_aware_iter/assert.pass.cpp       |  4 +--
 .../capacity_aware_iter/comparison.pass.cpp   |  6 ++---
 .../capacity_aware_iter/contiguous.verify.cpp | 10 +++----
 .../capacity_aware_iter/dereference.pass.cpp  |  4 +--
 .../types.compile.pass.cpp                    |  2 +-
 9 files changed, 38 insertions(+), 41 deletions(-)

diff --git a/libcxx/include/__iterator/capacity_aware_iterator.h b/libcxx/include/__iterator/capacity_aware_iterator.h
index a516feef60f36..f77c2a528b582 100644
--- a/libcxx/include/__iterator/capacity_aware_iterator.h
+++ b/libcxx/include/__iterator/capacity_aware_iterator.h
@@ -37,16 +37,13 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 // __capacity_aware_iterator is an iterator that wraps a contiguous iterator and encodes the maximum number of
 // elements that can appear in a range of such iterators. That maximum number of elements must be known at compile-time.
 // As of writing, the only standard library containers which fulfill these requirements are inplace_vector and optional.
-//
-// It also embeds a tag type to prevent mixing iterators from e.g. different containers. This also allows for some
-// algorithms to detect this iterator and perform optimizations based on the added semantic information.
 
-template <class _Iter, class _Tag, size_t _RangeMaxElements>
+template <class _Iter, size_t _RangeMaxElements>
 class __capacity_aware_iterator {
 private:
   _Iter __iter_;
 
-  template <class, class, size_t>
+  template <class, size_t>
   friend class __capacity_aware_iterator;
 
 public:
@@ -66,10 +63,10 @@ class __capacity_aware_iterator {
   template <typename _Iter2>
     requires is_convertible_v<_Iter2, _Iter>
   _LIBCPP_HIDE_FROM_ABI constexpr __capacity_aware_iterator(
-      const __capacity_aware_iterator<_Iter2, _Tag, _RangeMaxElements>& __y) noexcept
+      const __capacity_aware_iterator<_Iter2, _RangeMaxElements>& __y) noexcept
       : __iter_(__y.__iter_) {}
 
-  template <class _It, class _Tag2, size_t _RangeMaxElems2>
+  template <class _It, size_t _RangeMaxElems2>
   _LIBCPP_HIDE_FROM_ABI friend constexpr auto __make_capacity_aware_iterator(_It __iter) noexcept;
 
 private:
@@ -172,9 +169,9 @@ class __capacity_aware_iterator {
   }
 };
 
-template <class _It, class _Tag2, size_t _RangeMaxElems2>
+template <class _It, size_t _RangeMaxElems2>
 _LIBCPP_HIDE_FROM_ABI constexpr auto __make_capacity_aware_iterator(_It __iter) noexcept {
-  return __capacity_aware_iterator<_It, _Tag2, _RangeMaxElems2>(__iter);
+  return __capacity_aware_iterator<_It, _RangeMaxElems2>(__iter);
 }
 
 _LIBCPP_END_NAMESPACE_STD
diff --git a/libcxx/include/__optional/optional.h b/libcxx/include/__optional/optional.h
index 0fc27d90f9793..52f3bde864f90 100644
--- a/libcxx/include/__optional/optional.h
+++ b/libcxx/include/__optional/optional.h
@@ -692,8 +692,8 @@ class _LIBCPP_DECLSPEC_EMPTY_BASES optional
   using iterator       = __bounded_iter<__pointer>;
   using const_iterator = __bounded_iter<__const_pointer>;
 #    else
-  using iterator       = __capacity_aware_iterator<__pointer, optional<_Tp>, 1>;
-  using const_iterator = __capacity_aware_iterator<__const_pointer, optional<_Tp>, 1>;
+  using iterator       = __capacity_aware_iterator<__pointer, 1>;
+  using const_iterator = __capacity_aware_iterator<__const_pointer, 1>;
 #    endif
 
   // [optional.iterators], iterator support
@@ -703,7 +703,7 @@ class _LIBCPP_DECLSPEC_EMPTY_BASES optional
 #    ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_OPTIONAL
     return std::__make_bounded_iter(__ptr, __ptr, __ptr + (this->has_value() ? 1 : 0));
 #    else
-    return std::__make_capacity_aware_iterator<__pointer, optional<_Tp>, 1>(__ptr);
+    return std::__make_capacity_aware_iterator<__pointer, 1>(__ptr);
 #    endif
   }
 
@@ -713,7 +713,7 @@ class _LIBCPP_DECLSPEC_EMPTY_BASES optional
 #    ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_OPTIONAL
     return std::__make_bounded_iter(__ptr, __ptr, __ptr + (this->has_value() ? 1 : 0));
 #    else
-    return std::__make_capacity_aware_iterator<__const_pointer, optional<_Tp>, 1>(__ptr);
+    return std::__make_capacity_aware_iterator<__const_pointer, 1>(__ptr);
 #    endif
   }
 
diff --git a/libcxx/include/__optional/optional_ref.h b/libcxx/include/__optional/optional_ref.h
index 995b122cecdda..93ce0a9fa6746 100644
--- a/libcxx/include/__optional/optional_ref.h
+++ b/libcxx/include/__optional/optional_ref.h
@@ -63,7 +63,7 @@ struct __optional_ref_iterator_base<_Tp&> {
 #    ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_OPTIONAL
   using iterator = __bounded_iter<_Tp*>;
 #    else
-  using iterator = __capacity_aware_iterator<_Tp*, optional<_Tp&>, 1>;
+  using iterator = __capacity_aware_iterator<_Tp*, 1>;
 #    endif
 };
 
@@ -283,7 +283,7 @@ class optional<_Tp&> : public __optional_ref_iterator_base<_Tp&> {
 #    ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_OPTIONAL
     return std::__make_bounded_iter(__value_, __value_, __value_ + (this->has_value() ? 1 : 0));
 #    else
-    return std::__make_capacity_aware_iterator<_Tp*, optional<_Tp&>, 1>(__value_);
+    return std::__make_capacity_aware_iterator<_Tp*, 1>(__value_);
 #    endif
   }
 
diff --git a/libcxx/test/libcxx/iterators/capacity_aware_iter/arithmetic.pass.cpp b/libcxx/test/libcxx/iterators/capacity_aware_iter/arithmetic.pass.cpp
index f4aa5c29790ff..91c6654921b67 100644
--- a/libcxx/test/libcxx/iterators/capacity_aware_iter/arithmetic.pass.cpp
+++ b/libcxx/test/libcxx/iterators/capacity_aware_iter/arithmetic.pass.cpp
@@ -38,13 +38,13 @@ constexpr bool test() {
   int arr[]           = {1, 2, 3, 4, 5, 6};
   constexpr size_t sz = std::size(arr);
 
-  using CapIter = std::__capacity_aware_iterator<Iter, decltype(arr), sz>;
+  using CapIter = std::__capacity_aware_iterator<Iter, sz>;
 
   int* i = arr + 0;
 
   // operator++()
   {
-    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i));
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, sz>(Iter(i));
 
     std::same_as<CapIter&> decltype(auto) res = ++iter;
 
@@ -55,7 +55,7 @@ constexpr bool test() {
 
   // operator++(int)
   {
-    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i));
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, sz>(Iter(i));
 
     std::same_as<CapIter> decltype(auto) res = iter++;
 
@@ -66,7 +66,7 @@ constexpr bool test() {
 
   // operator--()
   {
-    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i + 1));
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, sz>(Iter(i + 1));
 
     std::same_as<CapIter&> decltype(auto) res = --iter;
 
@@ -77,7 +77,7 @@ constexpr bool test() {
 
   // operator--(int)
   {
-    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i + 1));
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, sz>(Iter(i + 1));
 
     std::same_as<CapIter> decltype(auto) res = iter--;
 
@@ -88,7 +88,7 @@ constexpr bool test() {
 
   // operator+=(difference_type)
   {
-    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i));
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, sz>(Iter(i));
 
     std::same_as<CapIter&> decltype(auto) res = iter += 2;
 
@@ -99,7 +99,7 @@ constexpr bool test() {
 
   // operator+(__capacity_aware_iterator, difference_type)
   {
-    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i));
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, sz>(Iter(i));
 
     std::same_as<CapIter> decltype(auto) res = iter + 2;
 
@@ -110,7 +110,7 @@ constexpr bool test() {
 
   // operator+(difference_type, __capacity_aware_iterator)
   {
-    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i));
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, sz>(Iter(i));
 
     std::same_as<CapIter> decltype(auto) res = 2 + iter;
 
@@ -121,7 +121,7 @@ constexpr bool test() {
 
   // operator-=(difference_type)
   {
-    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i + 2));
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, sz>(Iter(i + 2));
 
     std::same_as<CapIter&> decltype(auto) res = iter -= 2;
 
@@ -132,7 +132,7 @@ constexpr bool test() {
 
   // operator-(__capacity_aware_iterator, difference_type)
   {
-    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i + 2));
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, sz>(Iter(i + 2));
 
     std::same_as<CapIter> decltype(auto) res = iter - 2;
 
@@ -143,9 +143,9 @@ constexpr bool test() {
 
   // operator-(__capacity_aware_iterator, __capacity_aware_iterator)
   {
-    CapIter iter  = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i));
-    CapIter iter2 = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i + 2));
-    CapIter iter3 = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i + 6));
+    CapIter iter  = std::__make_capacity_aware_iterator<Iter, sz>(Iter(i));
+    CapIter iter2 = std::__make_capacity_aware_iterator<Iter, sz>(Iter(i + 2));
+    CapIter iter3 = std::__make_capacity_aware_iterator<Iter, sz>(Iter(i + 6));
 
     std::same_as<typename CapIter::difference_type> decltype(auto) res  = iter2 - iter;
     std::same_as<typename CapIter::difference_type> decltype(auto) res2 = iter3 - iter;
diff --git a/libcxx/test/libcxx/iterators/capacity_aware_iter/assert.pass.cpp b/libcxx/test/libcxx/iterators/capacity_aware_iter/assert.pass.cpp
index d7e077360e26a..094652d1b0a5e 100644
--- a/libcxx/test/libcxx/iterators/capacity_aware_iter/assert.pass.cpp
+++ b/libcxx/test/libcxx/iterators/capacity_aware_iter/assert.pass.cpp
@@ -27,9 +27,9 @@ void test() {
 
   constexpr long sz = std::size(arr);
 
-  using CapIter = std::__capacity_aware_iterator<Iter, decltype(arr), sz>;
+  using CapIter = std::__capacity_aware_iterator<Iter, sz>;
 
-  CapIter it = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(arr));
+  CapIter it = std::__make_capacity_aware_iterator<Iter, sz>(Iter(arr));
 
   TEST_LIBCPP_ASSERT_FAILURE(
       it += (sz + 1),
diff --git a/libcxx/test/libcxx/iterators/capacity_aware_iter/comparison.pass.cpp b/libcxx/test/libcxx/iterators/capacity_aware_iter/comparison.pass.cpp
index 34aa73bf4459c..e6209386ab9da 100644
--- a/libcxx/test/libcxx/iterators/capacity_aware_iter/comparison.pass.cpp
+++ b/libcxx/test/libcxx/iterators/capacity_aware_iter/comparison.pass.cpp
@@ -35,10 +35,10 @@ constexpr bool test() {
   int arr[]         = {1, 2, 3, 4};
   constexpr long sz = std::size(arr);
 
-  using CapIter = std::__capacity_aware_iterator<Iter, decltype(arr), sz>;
+  using CapIter = std::__capacity_aware_iterator<Iter, sz>;
 
-  CapIter iter1 = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(arr));
-  CapIter iter2 = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(arr + 4));
+  CapIter iter1 = std::__make_capacity_aware_iterator<Iter, sz>(Iter(arr));
+  CapIter iter2 = std::__make_capacity_aware_iterator<Iter, sz>(Iter(arr + 4));
 
   // operator==
   {
diff --git a/libcxx/test/libcxx/iterators/capacity_aware_iter/contiguous.verify.cpp b/libcxx/test/libcxx/iterators/capacity_aware_iter/contiguous.verify.cpp
index 0c49d2f1ac000..143096453ef18 100644
--- a/libcxx/test/libcxx/iterators/capacity_aware_iter/contiguous.verify.cpp
+++ b/libcxx/test/libcxx/iterators/capacity_aware_iter/contiguous.verify.cpp
@@ -17,14 +17,14 @@
 #include "test_iterators.h"
 
 void test() {
-  std::__capacity_aware_iterator<cpp20_random_access_iterator<int*>, int[], 0>
+  std::__capacity_aware_iterator<cpp20_random_access_iterator<int*>, 0>
       v1; // expected-error@*:* {{static assertion failed: __capacity_aware_iterator can only be used with contiguous iterators}}
-  std::__capacity_aware_iterator<cpp20_input_iterator<int*>, int[], 0>
+  std::__capacity_aware_iterator<cpp20_input_iterator<int*>, 0>
       v2; // expected-error@*:* {{static assertion failed: __capacity_aware_iterator can only be used with contiguous iterators}}
-  std::__capacity_aware_iterator<bidirectional_iterator<int*>, int[], 0>
+  std::__capacity_aware_iterator<bidirectional_iterator<int*>, 0>
       v3; // expected-error@*:* {{static assertion failed: __capacity_aware_iterator can only be used with contiguous iterators}}
-  std::__capacity_aware_iterator<cpp20_output_iterator<int*>, int[], 0>
+  std::__capacity_aware_iterator<cpp20_output_iterator<int*>, 0>
       v4; // expected-error@*:* {{static assertion failed: __capacity_aware_iterator can only be used with contiguous iterators}}
-  std::__capacity_aware_iterator<forward_iterator<int*>, int[], 0>
+  std::__capacity_aware_iterator<forward_iterator<int*>, 0>
       v5; // expected-error@*:* {{static assertion failed: __capacity_aware_iterator can only be used with contiguous iterators}}
 }
diff --git a/libcxx/test/libcxx/iterators/capacity_aware_iter/dereference.pass.cpp b/libcxx/test/libcxx/iterators/capacity_aware_iter/dereference.pass.cpp
index 42ab763896e2f..3735649e7acfb 100644
--- a/libcxx/test/libcxx/iterators/capacity_aware_iter/dereference.pass.cpp
+++ b/libcxx/test/libcxx/iterators/capacity_aware_iter/dereference.pass.cpp
@@ -35,9 +35,9 @@ constexpr bool test() {
   Foo arr[]         = {Foo{1}, Foo{2}, Foo{3}, Foo{4}};
   constexpr long sz = std::size(arr);
 
-  using CapIter = std::__capacity_aware_iterator<Iter, decltype(arr), sz>;
+  using CapIter = std::__capacity_aware_iterator<Iter, sz>;
 
-  CapIter it = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(arr));
+  CapIter it = std::__make_capacity_aware_iterator<Iter, sz>(Iter(arr));
 
   // operator[]
   {
diff --git a/libcxx/test/libcxx/iterators/capacity_aware_iter/types.compile.pass.cpp b/libcxx/test/libcxx/iterators/capacity_aware_iter/types.compile.pass.cpp
index b3b72a0728ed7..a9c8336e9bc64 100644
--- a/libcxx/test/libcxx/iterators/capacity_aware_iter/types.compile.pass.cpp
+++ b/libcxx/test/libcxx/iterators/capacity_aware_iter/types.compile.pass.cpp
@@ -21,7 +21,7 @@
 
 using It = contiguous_iterator<int*>;
 
-using CapIter = std::__capacity_aware_iterator<It, int[], 1>;
+using CapIter = std::__capacity_aware_iterator<It, 1>;
 
 static_assert(std::is_same_v<CapIter::iterator_category, It::iterator_category>);
 static_assert(std::is_same_v<CapIter::iterator_concept, std::contiguous_iterator_tag>);



More information about the libcxx-commits mailing list