[libcxx-commits] [libcxx] 48e8a2c - [libc++][C++03] Cherry-pick #115271 (#198804)

via libcxx-commits libcxx-commits at lists.llvm.org
Wed May 20 09:02:35 PDT 2026


Author: Nikolas Klauser
Date: 2026-05-20T18:02:29+02:00
New Revision: 48e8a2c7fa475712a44ad4cca5ea55b8e6cc5252

URL: https://github.com/llvm/llvm-project/commit/48e8a2c7fa475712a44ad4cca5ea55b8e6cc5252
DIFF: https://github.com/llvm/llvm-project/commit/48e8a2c7fa475712a44ad4cca5ea55b8e6cc5252.diff

LOG: [libc++][C++03] Cherry-pick #115271 (#198804)

Added: 
    

Modified: 
    libcxx/include/__cxx03/__iterator/bounded_iter.h
    libcxx/include/__cxx03/__iterator/wrap_iter.h
    libcxx/test/libcxx-03/iterators/contiguous_iterators.conv.compile.pass.cpp

Removed: 
    


################################################################################
diff  --git a/libcxx/include/__cxx03/__iterator/bounded_iter.h b/libcxx/include/__cxx03/__iterator/bounded_iter.h
index 83296a4cf20b4..d16957c984d67 100644
--- a/libcxx/include/__cxx03/__iterator/bounded_iter.h
+++ b/libcxx/include/__cxx03/__iterator/bounded_iter.h
@@ -14,9 +14,13 @@
 #include <__cxx03/__config>
 #include <__cxx03/__iterator/iterator_traits.h>
 #include <__cxx03/__memory/pointer_traits.h>
+#include <__cxx03/__type_traits/conjunction.h>
+#include <__cxx03/__type_traits/disjunction.h>
 #include <__cxx03/__type_traits/enable_if.h>
 #include <__cxx03/__type_traits/integral_constant.h>
 #include <__cxx03/__type_traits/is_convertible.h>
+#include <__cxx03/__type_traits/is_same.h>
+#include <__cxx03/__type_traits/make_const_lvalue_ref.h>
 #include <__cxx03/__utility/move.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
@@ -62,7 +66,12 @@ struct __bounded_iter {
   _LIBCPP_HIDE_FROM_ABI __bounded_iter(__bounded_iter const&) = default;
   _LIBCPP_HIDE_FROM_ABI __bounded_iter(__bounded_iter&&)      = default;
 
-  template <class _OtherIterator, __enable_if_t< is_convertible<_OtherIterator, _Iterator>::value, int> = 0>
+  template <class _OtherIterator,
+            __enable_if_t<
+                _And<is_convertible<const _OtherIterator&, _Iterator>,
+                     _Or<is_same<reference, __iter_reference<_OtherIterator> >,
+                         is_same<reference, __make_const_lvalue_ref<__iter_reference<_OtherIterator> > > > >::value,
+                int> = 0>
   _LIBCPP_HIDE_FROM_ABI __bounded_iter(__bounded_iter<_OtherIterator> const& __other) _NOEXCEPT
       : __current_(__other.__current_),
         __begin_(__other.__begin_),

diff  --git a/libcxx/include/__cxx03/__iterator/wrap_iter.h b/libcxx/include/__cxx03/__iterator/wrap_iter.h
index 22c9e2dfb5f5a..3fe12cbe015f0 100644
--- a/libcxx/include/__cxx03/__iterator/wrap_iter.h
+++ b/libcxx/include/__cxx03/__iterator/wrap_iter.h
@@ -14,8 +14,12 @@
 #include <__cxx03/__iterator/iterator_traits.h>
 #include <__cxx03/__memory/addressof.h>
 #include <__cxx03/__memory/pointer_traits.h>
+#include <__cxx03/__type_traits/conjunction.h>
+#include <__cxx03/__type_traits/disjunction.h>
 #include <__cxx03/__type_traits/enable_if.h>
 #include <__cxx03/__type_traits/is_convertible.h>
+#include <__cxx03/__type_traits/is_same.h>
+#include <__cxx03/__type_traits/make_const_lvalue_ref.h>
 #include <__cxx03/cstddef>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
@@ -39,8 +43,13 @@ class __wrap_iter {
 
 public:
   _LIBCPP_HIDE_FROM_ABI __wrap_iter() _NOEXCEPT : __i_() {}
-  template <class _Up, __enable_if_t<is_convertible<_Up, iterator_type>::value, int> = 0>
-  _LIBCPP_HIDE_FROM_ABI __wrap_iter(const __wrap_iter<_Up>& __u) _NOEXCEPT : __i_(__u.base()) {}
+  template <
+      class _OtherIter,
+      __enable_if_t<_And<is_convertible<const _OtherIter&, _Iter>,
+                         _Or<is_same<reference, __iter_reference<_OtherIter> >,
+                             is_same<reference, __make_const_lvalue_ref<__iter_reference<_OtherIter> > > > >::value,
+                    int> = 0>
+  _LIBCPP_HIDE_FROM_ABI __wrap_iter(const __wrap_iter<_OtherIter>& __u) _NOEXCEPT : __i_(__u.__i_) {}
   _LIBCPP_HIDE_FROM_ABI reference operator*() const _NOEXCEPT { return *__i_; }
   _LIBCPP_HIDE_FROM_ABI pointer operator->() const _NOEXCEPT { return std::__to_address(__i_); }
   _LIBCPP_HIDE_FROM_ABI __wrap_iter& operator++() _NOEXCEPT {

diff  --git a/libcxx/test/libcxx-03/iterators/contiguous_iterators.conv.compile.pass.cpp b/libcxx/test/libcxx-03/iterators/contiguous_iterators.conv.compile.pass.cpp
index 3e9707a38bcc9..62bd9677791d1 100644
--- a/libcxx/test/libcxx-03/iterators/contiguous_iterators.conv.compile.pass.cpp
+++ b/libcxx/test/libcxx-03/iterators/contiguous_iterators.conv.compile.pass.cpp
@@ -15,8 +15,6 @@
 
 // Verify that libc++-wrapped iterators do not permit slicing conversion or construction.
 
-// XFAIL: FROZEN-CXX03-HEADERS-FIXME
-
 #include <array>
 #include <span>
 #include <type_traits>


        


More information about the libcxx-commits mailing list