[libcxx-commits] [libcxx] 33025a2 - [libc++] Make `__wrap_iter` comparison operators hidden friends (#179590)
via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Feb 24 00:18:20 PST 2026
Author: William Tran-Viet
Date: 2026-02-24T09:18:15+01:00
New Revision: 33025a267d716feac257cb052ef183440d76691b
URL: https://github.com/llvm/llvm-project/commit/33025a267d716feac257cb052ef183440d76691b
DIFF: https://github.com/llvm/llvm-project/commit/33025a267d716feac257cb052ef183440d76691b.diff
LOG: [libc++] Make `__wrap_iter` comparison operators hidden friends (#179590)
Prelude to #179389
Added:
Modified:
libcxx/include/__iterator/wrap_iter.h
lldb/test/API/commands/expression/import-std-module/iterator/TestIteratorFromStdModule.py
Removed:
################################################################################
diff --git a/libcxx/include/__iterator/wrap_iter.h b/libcxx/include/__iterator/wrap_iter.h
index 128aeab3ac7cd..234c9a4f8c704 100644
--- a/libcxx/include/__iterator/wrap_iter.h
+++ b/libcxx/include/__iterator/wrap_iter.h
@@ -119,117 +119,111 @@ class __wrap_iter {
friend struct array;
template <class _Tp, class>
friend struct __optional_iterator;
-};
-template <class _Iter1>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool
-operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT {
- return __x.base() == __y.base();
-}
-
-template <class _Iter1, class _Iter2>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool
-operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT {
- return __x.base() == __y.base();
-}
-
-template <class _Iter1>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool
-operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT {
- return __x.base() < __y.base();
-}
-
-template <class _Iter1, class _Iter2>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool
-operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT {
- return __x.base() < __y.base();
-}
+ _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR bool
+ operator==(const __wrap_iter& __x, const __wrap_iter& __y) _NOEXCEPT {
+ return __x.base() == __y.base();
+ }
+
+ 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();
+ }
+
+ _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();
+ }
+
+ 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();
+ }
#if _LIBCPP_STD_VER <= 17
-template <class _Iter1>
-_LIBCPP_HIDE_FROM_ABI
-_LIBCPP_CONSTEXPR bool operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT {
- return !(__x == __y);
-}
-
-template <class _Iter1, class _Iter2>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool
-operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT {
- return !(__x == __y);
-}
-template <class _Iter1>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool
-operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT {
- return __y < __x;
-}
-
-template <class _Iter1, class _Iter2>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool
-operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT {
- return __y < __x;
-}
-
-template <class _Iter1>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool
-operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT {
- return !(__x < __y);
-}
-
-template <class _Iter1, class _Iter2>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool
-operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT {
- return !(__x < __y);
-}
-
-template <class _Iter1>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool
-operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT {
- return !(__y < __x);
-}
-
-template <class _Iter1, class _Iter2>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool
-operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT {
- return !(__y < __x);
-}
+ _LIBCPP_HIDE_FROM_ABI friend
+ _LIBCPP_CONSTEXPR bool operator!=(const __wrap_iter& __x, const __wrap_iter& __y) _NOEXCEPT {
+ return !(__x == __y);
+ }
-#else
-template <class _Iter1, class _Iter2>
-_LIBCPP_HIDE_FROM_ABI 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.base() <=> __y.base();
- } else {
- if (__x.base() < __y.base())
- return strong_ordering::less;
+ template <class _Iter2>
+ _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR bool
+ operator!=(const __wrap_iter& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT {
+ return !(__x == __y);
+ }
- if (__x.base() == __y.base())
- return strong_ordering::equal;
+ _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR bool
+ operator>(const __wrap_iter& __x, const __wrap_iter& __y) _NOEXCEPT {
+ return __y < __x;
+ }
+
+ template <class _Iter2>
+ _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR bool
+ operator>(const __wrap_iter& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT {
+ return __y < __x;
+ }
- return strong_ordering::greater;
+ _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR bool
+ operator>=(const __wrap_iter& __x, const __wrap_iter& __y) _NOEXCEPT {
+ return !(__x < __y);
+ }
+
+ template <class _Iter2>
+ _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR bool
+ operator>=(const __wrap_iter& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT {
+ return !(__x < __y);
+ }
+
+ _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR bool
+ operator<=(const __wrap_iter& __x, const __wrap_iter& __y) _NOEXCEPT {
+ return !(__y < __x);
+ }
+
+ template <class _Iter2>
+ _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR bool
+ operator<=(const __wrap_iter& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT {
+ return !(__y < __x);
+ }
+
+#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;
+ }
}
-}
#endif // _LIBCPP_STD_VER >= 20
-template <class _Iter1, class _Iter2>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
#ifndef _LIBCPP_CXX03_LANG
-auto operator-(const __wrap_iter<_Iter1>& __x,
- const __wrap_iter<_Iter2>& __y) _NOEXCEPT->decltype(__x.base() - __y.base())
+ template <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())
#else
-typename __wrap_iter<_Iter1>::
diff erence_type
-operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
+ template <class _Iter2>
+ _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14
+ typename __wrap_iter::
diff erence_type operator-(const __wrap_iter& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
#endif // C++03
-{
- return __x.base() - __y.base();
-}
-
-template <class _Iter1>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __wrap_iter<_Iter1>
-operator+(typename __wrap_iter<_Iter1>::
diff erence_type __n, __wrap_iter<_Iter1> __x) _NOEXCEPT {
- __x += __n;
- return __x;
-}
+ {
+ return __x.base() - __y.base();
+ }
+
+ _LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR_SINCE_CXX14 __wrap_iter
+ operator+(typename __wrap_iter::
diff erence_type __n, __wrap_iter __x) _NOEXCEPT {
+ __x += __n;
+ return __x;
+ }
+};
#if _LIBCPP_STD_VER <= 17
template <class _It>
diff --git a/lldb/test/API/commands/expression/import-std-module/iterator/TestIteratorFromStdModule.py b/lldb/test/API/commands/expression/import-std-module/iterator/TestIteratorFromStdModule.py
index 370c3674faeca..f0b3b5445cf63 100644
--- a/lldb/test/API/commands/expression/import-std-module/iterator/TestIteratorFromStdModule.py
+++ b/lldb/test/API/commands/expression/import-std-module/iterator/TestIteratorFromStdModule.py
@@ -27,6 +27,18 @@ def test(self):
self.expect_expr("move_begin + 3 == move_end", result_value="true")
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @expectedFailureAll(bugnumber="https://github.com/llvm/llvm-project/issues/149477")
+ def test_xfail(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(
+ self, "// Set break point at this line.", lldb.SBFileSpec("main.cpp")
+ )
+
+ self.runCmd("settings set target.import-std-module true")
+
self.expect("expr move_begin++")
self.expect_expr("move_begin + 2 == move_end", result_value="true")
self.expect("expr move_begin--")
More information about the libcxx-commits
mailing list