[libcxx-commits] [libcxx] [libc++] Remove `wrap_iter::base()` (PR #179389)

William Tran-Viet via libcxx-commits libcxx-commits at lists.llvm.org
Thu Feb 26 17:53:33 PST 2026


https://github.com/smallp-o-p updated https://github.com/llvm/llvm-project/pull/179389

>From 4b4d17bf7bf54562c444b3e981acc5cf623b8027 Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Mon, 2 Feb 2026 19:54:06 -0500
Subject: [PATCH 01/10] Remove `wrap_iter::base()` from public API

---
 libcxx/docs/ReleaseNotes/22.rst       |  3 +
 libcxx/include/__iterator/wrap_iter.h | 82 +++++++++++++++++++--------
 2 files changed, 60 insertions(+), 25 deletions(-)

diff --git a/libcxx/docs/ReleaseNotes/22.rst b/libcxx/docs/ReleaseNotes/22.rst
index 59990d1aa5feb..719b8dd509146 100644
--- a/libcxx/docs/ReleaseNotes/22.rst
+++ b/libcxx/docs/ReleaseNotes/22.rst
@@ -121,6 +121,9 @@ Potentially breaking changes
   ``_LIBCPP_ABI_NO_ITERATOR_BASES``. If you are using this flag and care about ABI stability, you should set
   ``_LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER`` as well.
 
+- The `base()` function exposed by the contiguous iterator type `wrap_iter` has been removed. Code should no longer
+  rely on this function.
+
 Announcements About Future Releases
 -----------------------------------
 
diff --git a/libcxx/include/__iterator/wrap_iter.h b/libcxx/include/__iterator/wrap_iter.h
index 234c9a4f8c704..932bbfd835814 100644
--- a/libcxx/include/__iterator/wrap_iter.h
+++ b/libcxx/include/__iterator/wrap_iter.h
@@ -47,6 +47,8 @@ class __wrap_iter {
 private:
   iterator_type __i_;
 
+  friend struct pointer_traits<__wrap_iter<_Iter>>;
+
 public:
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __wrap_iter() _NOEXCEPT : __i_() {}
   template <class _OtherIter,
@@ -100,9 +102,39 @@ class __wrap_iter {
     return __i_[__n];
   }
 
-  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 iterator_type base() const _NOEXCEPT { return __i_; }
-
 private:
+  template <class _Iter1>
+  _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR bool
+  operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT;
+
+  template <class _Iter1, class _Iter2>
+  _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR bool
+  operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT;
+
+  template <class _Iter1>
+  _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14 bool
+  operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT;
+
+  template <class _Iter1, class _Iter2>
+  _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14 bool
+  operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT;
+
+#if _LIBCPP_STD_VER >= 20
+  template <class _Iter1, class _Iter2>
+  _LIBCPP_HIDE_FROM_ABI friend constexpr strong_ordering
+  operator<=>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) noexcept;
+#endif
+
+  template <class _Iter1, class _Iter2>
+  _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14
+#ifndef _LIBCPP_CXX03_LANG
+  auto
+  operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT->decltype(__x.__i_ - __y.__i_);
+#else
+  typename __wrap_iter<_Iter>::difference_type
+  operator-(const __wrap_iter<_Iter>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT;
+#endif // C++03
+
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 explicit __wrap_iter(iterator_type __x) _NOEXCEPT : __i_(__x) {}
 
   template <class _Up>
@@ -122,24 +154,24 @@ class __wrap_iter {
 
   _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR bool
   operator==(const __wrap_iter& __x, const __wrap_iter& __y) _NOEXCEPT {
-    return __x.base() == __y.base();
+    return __x.__i_ == __y.__i_;
   }
 
   template <class _Iter2>
   _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR bool
   operator==(const __wrap_iter& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT {
-    return __x.base() == __y.base();
+    return __x.__i_ == __y.__i_;
   }
 
   _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14 bool
   operator<(const __wrap_iter& __x, const __wrap_iter& __y) _NOEXCEPT {
-    return __x.base() < __y.base();
+    return __x.__i_ < __y.__i_;
   }
 
   template <class _Iter2>
   _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14 bool
   operator<(const __wrap_iter& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT {
-    return __x.base() < __y.base();
+    return __x.__i_ < __y.__i_;
   }
 
 #if _LIBCPP_STD_VER <= 17
@@ -188,35 +220,35 @@ class __wrap_iter {
   }
 
 #else
-  template <class _Iter2>
-  _LIBCPP_HIDE_FROM_ABI friend constexpr strong_ordering
-  operator<=>(const __wrap_iter& __x, const __wrap_iter<_Iter2>& __y) noexcept {
-    if constexpr (three_way_comparable_with<_Iter, _Iter2, strong_ordering>) {
-      return __x.base() <=> __y.base();
-    } else {
-      if (__x.base() < __y.base())
-        return strong_ordering::less;
-
-      if (__x.base() == __y.base())
-        return strong_ordering::equal;
-
-      return strong_ordering::greater;
+template <class _Iter1, class _Iter2>
+_LIBCPP_HIDE_FROM_ABI friend constexpr strong_ordering
+operator<=>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) noexcept {
+  if constexpr (three_way_comparable_with<_Iter1, _Iter2, strong_ordering>) {
+    return __x.__i_ <=> __y.__i_;
+  } else {
+    if (__x.__i_ < __y.__i_)
+      return strong_ordering::less;
+
+    if (__x.__i_ == __y.__i_)
+      return strong_ordering::equal;
+
+    return strong_ordering::greater;
     }
   }
 #endif // _LIBCPP_STD_VER >= 20
 
 #ifndef _LIBCPP_CXX03_LANG
-  template <class _Iter2>
+  template <class _Iter1, class _Iter2>
   _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14 auto
-  operator-(const __wrap_iter& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT->decltype(__x.base() - __y.base())
+  operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT->decltype(__x.__i_ - __y.__i_)
 #else
   template <class _Iter2>
   _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14
   typename __wrap_iter::difference_type operator-(const __wrap_iter& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
 #endif // C++03
-  {
-    return __x.base() - __y.base();
-  }
+{
+  return __x.__i_ - __y.__i_;
+}
 
   _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14 __wrap_iter
   operator+(typename __wrap_iter::difference_type __n, __wrap_iter __x) _NOEXCEPT {
@@ -237,7 +269,7 @@ struct pointer_traits<__wrap_iter<_It> > {
   typedef typename pointer_traits<_It>::difference_type difference_type;
 
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR static element_type* to_address(pointer __w) _NOEXCEPT {
-    return std::__to_address(__w.base());
+    return std::__to_address(__w.__i_);
   }
 };
 

>From 50a2c0fc2bed73d26be86c79919da8e148d372d6 Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Mon, 2 Feb 2026 22:56:52 -0500
Subject: [PATCH 02/10] Fix <regex> usage

---
 libcxx/include/regex | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libcxx/include/regex b/libcxx/include/regex
index 620a75f35d102..c17ecdb3494c2 100644
--- a/libcxx/include/regex
+++ b/libcxx/include/regex
@@ -5167,7 +5167,7 @@ regex_search(__wrap_iter<_Iter> __first,
              const basic_regex<_CharT, _Traits>& __e,
              regex_constants::match_flag_type __flags = regex_constants::match_default) {
   match_results<const _CharT*> __mc;
-  bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
+  bool __r = __e.__search(__first.operator->(), __last.operator->(), __mc, __flags);
   __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
   return __r;
 }

>From cb2c53f3eedadb7b6b67dc62cb48e0fdafc3ba8e Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Mon, 2 Feb 2026 23:08:07 -0500
Subject: [PATCH 03/10] Remove note from 22 release notes

---
 libcxx/docs/ReleaseNotes/22.rst | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/libcxx/docs/ReleaseNotes/22.rst b/libcxx/docs/ReleaseNotes/22.rst
index 719b8dd509146..59990d1aa5feb 100644
--- a/libcxx/docs/ReleaseNotes/22.rst
+++ b/libcxx/docs/ReleaseNotes/22.rst
@@ -121,9 +121,6 @@ Potentially breaking changes
   ``_LIBCPP_ABI_NO_ITERATOR_BASES``. If you are using this flag and care about ABI stability, you should set
   ``_LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER`` as well.
 
-- The `base()` function exposed by the contiguous iterator type `wrap_iter` has been removed. Code should no longer
-  rely on this function.
-
 Announcements About Future Releases
 -----------------------------------
 

>From eb496d2b07d6ba18cfc73b011f4fb8a8013a3766 Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Mon, 2 Feb 2026 23:29:19 -0500
Subject: [PATCH 04/10] Formatting

---
 libcxx/include/__iterator/wrap_iter.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libcxx/include/__iterator/wrap_iter.h b/libcxx/include/__iterator/wrap_iter.h
index 932bbfd835814..b69c15dc2ca63 100644
--- a/libcxx/include/__iterator/wrap_iter.h
+++ b/libcxx/include/__iterator/wrap_iter.h
@@ -47,7 +47,7 @@ class __wrap_iter {
 private:
   iterator_type __i_;
 
-  friend struct pointer_traits<__wrap_iter<_Iter>>;
+  friend struct pointer_traits<__wrap_iter<_Iter> >;
 
 public:
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __wrap_iter() _NOEXCEPT : __i_() {}

>From 64c01f9a1ca3ed07be402d9aaa7d7c066176469a Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Tue, 3 Feb 2026 00:01:03 -0500
Subject: [PATCH 05/10] Fix C++03 case

---
 libcxx/include/__iterator/wrap_iter.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libcxx/include/__iterator/wrap_iter.h b/libcxx/include/__iterator/wrap_iter.h
index b69c15dc2ca63..14455a60b7ca3 100644
--- a/libcxx/include/__iterator/wrap_iter.h
+++ b/libcxx/include/__iterator/wrap_iter.h
@@ -131,8 +131,8 @@ class __wrap_iter {
   auto
   operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT->decltype(__x.__i_ - __y.__i_);
 #else
-  typename __wrap_iter<_Iter>::difference_type
-  operator-(const __wrap_iter<_Iter>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT;
+  typename __wrap_iter<_Iter1>::difference_type
+  operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT;
 #endif // C++03
 
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 explicit __wrap_iter(iterator_type __x) _NOEXCEPT : __i_(__x) {}

>From 88d6d132ba2e979ad0b17f21fbc6ec10ac8840f5 Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Tue, 24 Feb 2026 20:47:11 -0500
Subject: [PATCH 06/10] Formatting

---
 libcxx/include/__iterator/wrap_iter.h | 32 +++++++++++++--------------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/libcxx/include/__iterator/wrap_iter.h b/libcxx/include/__iterator/wrap_iter.h
index 14455a60b7ca3..86b85b2b2cea5 100644
--- a/libcxx/include/__iterator/wrap_iter.h
+++ b/libcxx/include/__iterator/wrap_iter.h
@@ -220,19 +220,19 @@ class __wrap_iter {
   }
 
 #else
-template <class _Iter1, class _Iter2>
-_LIBCPP_HIDE_FROM_ABI friend constexpr strong_ordering
-operator<=>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) noexcept {
-  if constexpr (three_way_comparable_with<_Iter1, _Iter2, strong_ordering>) {
-    return __x.__i_ <=> __y.__i_;
-  } else {
-    if (__x.__i_ < __y.__i_)
-      return strong_ordering::less;
-
-    if (__x.__i_ == __y.__i_)
-      return strong_ordering::equal;
-
-    return strong_ordering::greater;
+  template <class _Iter1, class _Iter2>
+  _LIBCPP_HIDE_FROM_ABI friend constexpr strong_ordering
+  operator<=>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) noexcept {
+    if constexpr (three_way_comparable_with<_Iter1, _Iter2, strong_ordering>) {
+      return __x.__i_ <=> __y.__i_;
+    } else {
+      if (__x.__i_ < __y.__i_)
+        return strong_ordering::less;
+
+      if (__x.__i_ == __y.__i_)
+        return strong_ordering::equal;
+
+      return strong_ordering::greater;
     }
   }
 #endif // _LIBCPP_STD_VER >= 20
@@ -246,9 +246,9 @@ operator<=>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) noex
   _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14
   typename __wrap_iter::difference_type operator-(const __wrap_iter& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
 #endif // C++03
-{
-  return __x.__i_ - __y.__i_;
-}
+  {
+    return __x.__i_ - __y.__i_;
+  }
 
   _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14 __wrap_iter
   operator+(typename __wrap_iter::difference_type __n, __wrap_iter __x) _NOEXCEPT {

>From ca64f51f8a2a368b98dc8edfd502b53e73cbad62 Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Tue, 24 Feb 2026 21:13:45 -0500
Subject: [PATCH 07/10] Fix rebase

---
 libcxx/include/__iterator/wrap_iter.h | 42 ++++-----------------------
 1 file changed, 5 insertions(+), 37 deletions(-)

diff --git a/libcxx/include/__iterator/wrap_iter.h b/libcxx/include/__iterator/wrap_iter.h
index 86b85b2b2cea5..d20d7f3fc4c4c 100644
--- a/libcxx/include/__iterator/wrap_iter.h
+++ b/libcxx/include/__iterator/wrap_iter.h
@@ -103,38 +103,6 @@ class __wrap_iter {
   }
 
 private:
-  template <class _Iter1>
-  _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR bool
-  operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT;
-
-  template <class _Iter1, class _Iter2>
-  _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR bool
-  operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT;
-
-  template <class _Iter1>
-  _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14 bool
-  operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT;
-
-  template <class _Iter1, class _Iter2>
-  _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14 bool
-  operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT;
-
-#if _LIBCPP_STD_VER >= 20
-  template <class _Iter1, class _Iter2>
-  _LIBCPP_HIDE_FROM_ABI friend constexpr strong_ordering
-  operator<=>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) noexcept;
-#endif
-
-  template <class _Iter1, class _Iter2>
-  _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14
-#ifndef _LIBCPP_CXX03_LANG
-  auto
-  operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT->decltype(__x.__i_ - __y.__i_);
-#else
-  typename __wrap_iter<_Iter1>::difference_type
-  operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT;
-#endif // C++03
-
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 explicit __wrap_iter(iterator_type __x) _NOEXCEPT : __i_(__x) {}
 
   template <class _Up>
@@ -220,10 +188,10 @@ class __wrap_iter {
   }
 
 #else
-  template <class _Iter1, class _Iter2>
+  template <class _Iter2>
   _LIBCPP_HIDE_FROM_ABI friend constexpr strong_ordering
-  operator<=>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) noexcept {
-    if constexpr (three_way_comparable_with<_Iter1, _Iter2, strong_ordering>) {
+  operator<=>(const __wrap_iter& __x, const __wrap_iter<_Iter2>& __y) noexcept {
+    if constexpr (three_way_comparable_with<_Iter, _Iter2, strong_ordering>) {
       return __x.__i_ <=> __y.__i_;
     } else {
       if (__x.__i_ < __y.__i_)
@@ -238,9 +206,9 @@ class __wrap_iter {
 #endif // _LIBCPP_STD_VER >= 20
 
 #ifndef _LIBCPP_CXX03_LANG
-  template <class _Iter1, class _Iter2>
+  template <class _Iter2>
   _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14 auto
-  operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT->decltype(__x.__i_ - __y.__i_)
+  operator-(const __wrap_iter& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT->decltype(__x.__i_ - __y.__i_)
 #else
   template <class _Iter2>
   _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14

>From 8273ea899f7cee3ab435acf8715acc35d51cdcb7 Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Tue, 24 Feb 2026 23:03:58 -0500
Subject: [PATCH 08/10] Address comments

---
 libcxx/docs/ReleaseNotes/23.rst | 3 ++-
 libcxx/include/regex            | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/libcxx/docs/ReleaseNotes/23.rst b/libcxx/docs/ReleaseNotes/23.rst
index b8a8a088abec4..955eb9eac7081 100644
--- a/libcxx/docs/ReleaseNotes/23.rst
+++ b/libcxx/docs/ReleaseNotes/23.rst
@@ -52,7 +52,8 @@ Deprecations and Removals
 
 - The ``std::launch::any`` enumerator that was accidentally provided as an extension is now deprecated.
   It will be removed in LLVM 25.
-
+- ``wrap_iter``'s (iterator type for ``array``, ``span``, ``string``, ``string_view`` and ``vector``) ``base()``
+  method has been removed as it was non-standard.
 Potentially breaking changes
 ----------------------------
 
diff --git a/libcxx/include/regex b/libcxx/include/regex
index c17ecdb3494c2..ae6ffcbb55481 100644
--- a/libcxx/include/regex
+++ b/libcxx/include/regex
@@ -817,6 +817,7 @@ typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
 #    include <__iterator/wrap_iter.h>
 #    include <__locale>
 #    include <__memory/addressof.h>
+#    include <__memory/pointer_traits.h>
 #    include <__memory/shared_ptr.h>
 #    include <__memory_resource/polymorphic_allocator.h>
 #    include <__type_traits/is_swappable.h>
@@ -5167,7 +5168,7 @@ regex_search(__wrap_iter<_Iter> __first,
              const basic_regex<_CharT, _Traits>& __e,
              regex_constants::match_flag_type __flags = regex_constants::match_default) {
   match_results<const _CharT*> __mc;
-  bool __r = __e.__search(__first.operator->(), __last.operator->(), __mc, __flags);
+  bool __r = __e.__search(std::__to_address(__first), std::__to_address(__last), __mc, __flags);
   __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
   return __r;
 }

>From 5177172f46b4e7c0722a85867123ddc68f5f30dd Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Wed, 25 Feb 2026 20:58:18 -0500
Subject: [PATCH 09/10] Documentation

---
 libcxx/docs/ReleaseNotes/23.rst | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/libcxx/docs/ReleaseNotes/23.rst b/libcxx/docs/ReleaseNotes/23.rst
index 955eb9eac7081..ff4f19794eb3d 100644
--- a/libcxx/docs/ReleaseNotes/23.rst
+++ b/libcxx/docs/ReleaseNotes/23.rst
@@ -52,8 +52,10 @@ Deprecations and Removals
 
 - The ``std::launch::any`` enumerator that was accidentally provided as an extension is now deprecated.
   It will be removed in LLVM 25.
+
 - ``wrap_iter``'s (iterator type for ``array``, ``span``, ``string``, ``string_view`` and ``vector``) ``base()``
   method has been removed as it was non-standard.
+
 Potentially breaking changes
 ----------------------------
 

>From 3dcd905694852c23b2ee39307c15a6e30f8ade76 Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Thu, 26 Feb 2026 20:53:15 -0500
Subject: [PATCH 10/10] kick ci




More information about the libcxx-commits mailing list