Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 25 Apr 2026 14:20:09 +0000
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Cc:        Dimitry Andric <dimitry@andric.com>
Subject:   git: bb6713d38cc0 - main - libcxx-compat: revert llvmorg-21-init-15984-g650b451d0065:
Message-ID:  <69eccd99.375eb.2b39e3c3@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by dim:

URL: https://cgit.FreeBSD.org/src/commit/?id=bb6713d38cc0d988378394f599d81d3a83dbaf03

commit bb6713d38cc0d988378394f599d81d3a83dbaf03
Author:     Dimitry Andric <dimitry@andric.com>
AuthorDate: 2026-01-04 19:43:58 +0000
Commit:     Dimitry Andric <dim@FreeBSD.org>
CommitDate: 2026-04-25 14:14:20 +0000

    libcxx-compat: revert llvmorg-21-init-15984-g650b451d0065:
    
      [libc++] Simplify the implementation of pointer_traits a bit (#142260)
    
    This is part of making libc++ 21 build with clang 18.
    
    PR:             292067
    MFC after:      1 month
---
 .../libcxx/include/__memory/pointer_traits.h       | 116 +++++++++++++++------
 1 file changed, 83 insertions(+), 33 deletions(-)

diff --git a/contrib/llvm-project/libcxx/include/__memory/pointer_traits.h b/contrib/llvm-project/libcxx/include/__memory/pointer_traits.h
index 8c7f8dff1b76..879b387b9ad1 100644
--- a/contrib/llvm-project/libcxx/include/__memory/pointer_traits.h
+++ b/contrib/llvm-project/libcxx/include/__memory/pointer_traits.h
@@ -16,13 +16,11 @@
 #include <__type_traits/conditional.h>
 #include <__type_traits/conjunction.h>
 #include <__type_traits/decay.h>
-#include <__type_traits/detected_or.h>
 #include <__type_traits/enable_if.h>
 #include <__type_traits/integral_constant.h>
 #include <__type_traits/is_class.h>
 #include <__type_traits/is_function.h>
 #include <__type_traits/is_void.h>
-#include <__type_traits/nat.h>
 #include <__type_traits/void_t.h>
 #include <__utility/declval.h>
 #include <__utility/forward.h>
@@ -36,37 +34,67 @@ _LIBCPP_PUSH_MACROS
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
+// clang-format off
+#define _LIBCPP_CLASS_TRAITS_HAS_XXX(NAME, PROPERTY)                                                                   \
+  template <class _Tp, class = void>                                                                                   \
+  struct NAME : false_type {};                                                                                         \
+  template <class _Tp>                                                                                                 \
+  struct NAME<_Tp, __void_t<typename _Tp::PROPERTY> > : true_type {}
+// clang-format on
+
+_LIBCPP_CLASS_TRAITS_HAS_XXX(__has_pointer, pointer);
+_LIBCPP_CLASS_TRAITS_HAS_XXX(__has_element_type, element_type);
+
+template <class _Ptr, bool = __has_element_type<_Ptr>::value>
+struct __pointer_traits_element_type {};
+
 template <class _Ptr>
-struct __pointer_traits_element_type_impl {};
+struct __pointer_traits_element_type<_Ptr, true> {
+  using type _LIBCPP_NODEBUG = typename _Ptr::element_type;
+};
 
 template <template <class, class...> class _Sp, class _Tp, class... _Args>
-struct __pointer_traits_element_type_impl<_Sp<_Tp, _Args...> > {
+struct __pointer_traits_element_type<_Sp<_Tp, _Args...>, true> {
+  using type _LIBCPP_NODEBUG = typename _Sp<_Tp, _Args...>::element_type;
+};
+
+template <template <class, class...> class _Sp, class _Tp, class... _Args>
+struct __pointer_traits_element_type<_Sp<_Tp, _Args...>, false> {
   using type _LIBCPP_NODEBUG = _Tp;
 };
 
-template <class _Ptr, class = void>
-struct __pointer_traits_element_type : __pointer_traits_element_type_impl<_Ptr> {};
+template <class _Tp, class = void>
+struct __has_difference_type : false_type {};
+
+template <class _Tp>
+struct __has_difference_type<_Tp, __void_t<typename _Tp::difference_type> > : true_type {};
+
+template <class _Ptr, bool = __has_difference_type<_Ptr>::value>
+struct __pointer_traits_difference_type {
+  using type _LIBCPP_NODEBUG = ptrdiff_t;
+};
 
 template <class _Ptr>
-struct __pointer_traits_element_type<_Ptr, __void_t<typename _Ptr::element_type> > {
-  using type _LIBCPP_NODEBUG = typename _Ptr::element_type;
+struct __pointer_traits_difference_type<_Ptr, true> {
+  using type _LIBCPP_NODEBUG = typename _Ptr::difference_type;
 };
 
 template <class _Tp, class _Up>
-struct __pointer_traits_rebind_impl {
-  static_assert(false, "Cannot rebind pointer; did you forget to add a rebind member to your pointer?");
-};
+struct __has_rebind {
+private:
+  template <class _Xp>
+  static false_type __test(...);
+  _LIBCPP_SUPPRESS_DEPRECATED_PUSH
+  template <class _Xp>
+  static true_type __test(typename _Xp::template rebind<_Up>* = 0);
+  _LIBCPP_SUPPRESS_DEPRECATED_POP
 
-template <template <class, class...> class _Sp, class _Tp, class... _Args, class _Up>
-struct __pointer_traits_rebind_impl<_Sp<_Tp, _Args...>, _Up> {
-  using type _LIBCPP_NODEBUG = _Sp<_Up, _Args...>;
+public:
+  static const bool value = decltype(__test<_Tp>(0))::value;
 };
 
-template <class _Tp, class _Up, class = void>
-struct __pointer_traits_rebind : __pointer_traits_rebind_impl<_Tp, _Up> {};
-
-template <class _Tp, class _Up>
-struct __pointer_traits_rebind<_Tp, _Up, __void_t<typename _Tp::template rebind<_Up> > > {
+template <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value>
+struct __pointer_traits_rebind {
 #ifndef _LIBCPP_CXX03_LANG
   using type _LIBCPP_NODEBUG = typename _Tp::template rebind<_Up>;
 #else
@@ -74,8 +102,19 @@ struct __pointer_traits_rebind<_Tp, _Up, __void_t<typename _Tp::template rebind<
 #endif
 };
 
-template <class _Tp>
-using __difference_type_member _LIBCPP_NODEBUG = typename _Tp::difference_type;
+template <template <class, class...> class _Sp, class _Tp, class... _Args, class _Up>
+struct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, true> {
+#ifndef _LIBCPP_CXX03_LANG
+  using type _LIBCPP_NODEBUG = typename _Sp<_Tp, _Args...>::template rebind<_Up>;
+#else
+  using type _LIBCPP_NODEBUG = typename _Sp<_Tp, _Args...>::template rebind<_Up>::other;
+#endif
+};
+
+template <template <class, class...> class _Sp, class _Tp, class... _Args, class _Up>
+struct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, false> {
+  typedef _Sp<_Up, _Args...> type;
+};
 
 template <class _Ptr, class = void>
 struct __pointer_traits_impl {};
@@ -84,7 +123,7 @@ template <class _Ptr>
 struct __pointer_traits_impl<_Ptr, __void_t<typename __pointer_traits_element_type<_Ptr>::type> > {
   typedef _Ptr pointer;
   typedef typename __pointer_traits_element_type<pointer>::type element_type;
-  using difference_type = __detected_or_t<ptrdiff_t, __difference_type_member, pointer>;
+  typedef typename __pointer_traits_difference_type<pointer>::type difference_type;
 
 #ifndef _LIBCPP_CXX03_LANG
   template <class _Up>
@@ -96,6 +135,9 @@ struct __pointer_traits_impl<_Ptr, __void_t<typename __pointer_traits_element_ty
   };
 #endif // _LIBCPP_CXX03_LANG
 
+private:
+  struct __nat {};
+
 public:
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static pointer
   pointer_to(__conditional_t<is_void<element_type>::value, __nat, element_type>& __r) {
@@ -122,6 +164,9 @@ struct pointer_traits<_Tp*> {
   };
 #endif
 
+private:
+  struct __nat {};
+
 public:
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static pointer
   pointer_to(__conditional_t<is_void<element_type>::value, __nat, element_type>& __r) _NOEXCEPT {
@@ -212,26 +257,20 @@ template <class _Tp>
 struct __pointer_of {};
 
 template <class _Tp>
-concept __has_pointer_member = requires { typename _Tp::pointer; };
-
-template <class _Tp>
-concept __has_element_type_member = requires { typename _Tp::element_type; };
-
-template <class _Tp>
-  requires __has_pointer_member<_Tp>
+  requires(__has_pointer<_Tp>::value)
 struct __pointer_of<_Tp> {
   using type _LIBCPP_NODEBUG = typename _Tp::pointer;
 };
 
 template <class _Tp>
-  requires(!__has_pointer_member<_Tp> && __has_element_type_member<_Tp>)
+  requires(!__has_pointer<_Tp>::value && __has_element_type<_Tp>::value)
 struct __pointer_of<_Tp> {
   using type _LIBCPP_NODEBUG = typename _Tp::element_type*;
 };
 
 template <class _Tp>
-  requires(!__has_pointer_member<_Tp> && !__has_element_type_member<_Tp> &&
-           __has_element_type_member<pointer_traits<_Tp>>)
+  requires(!__has_pointer<_Tp>::value && !__has_element_type<_Tp>::value &&
+           __has_element_type<pointer_traits<_Tp>>::value)
 struct __pointer_of<_Tp> {
   using type _LIBCPP_NODEBUG = typename pointer_traits<_Tp>::element_type*;
 };
@@ -239,8 +278,19 @@ struct __pointer_of<_Tp> {
 template <typename _Tp>
 using __pointer_of_t _LIBCPP_NODEBUG = typename __pointer_of<_Tp>::type;
 
+template <class _Tp, class _Up>
+struct __pointer_of_or {
+  using type _LIBCPP_NODEBUG = _Up;
+};
+
+template <class _Tp, class _Up>
+  requires requires { typename __pointer_of_t<_Tp>; }
+struct __pointer_of_or<_Tp, _Up> {
+  using type _LIBCPP_NODEBUG = __pointer_of_t<_Tp>;
+};
+
 template <typename _Tp, typename _Up>
-using __pointer_of_or_t _LIBCPP_NODEBUG = __detected_or_t<_Up, __pointer_of_t, _Tp>;
+using __pointer_of_or_t _LIBCPP_NODEBUG = typename __pointer_of_or<_Tp, _Up>::type;
 
 template <class _Smart>
 concept __resettable_smart_pointer = requires(_Smart __s) { __s.reset(); };


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69eccd99.375eb.2b39e3c3>