[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