[libcxx-commits] [libcxx] [libc++] Simplify the implementation of pointer_traits a bit (PR #142260)
    Nikolas Klauser via libcxx-commits 
    libcxx-commits at lists.llvm.org
       
    Sun Jun 15 08:08:22 PDT 2025
    
    
  
================
@@ -257,20 +212,24 @@ template <class _Tp>
 struct __pointer_of {};
 
 template <class _Tp>
-  requires(__has_pointer<_Tp>::value)
+concept __has_pointer_member = requires { typename _Tp::pointer; };
+
+template <class _Tp>
+concept __has_element_type_member = requires { typename _Tp::element_type; };
+
+template <__has_pointer_member _Tp>
 struct __pointer_of<_Tp> {
   using type _LIBCPP_NODEBUG = typename _Tp::pointer;
 };
 
-template <class _Tp>
-  requires(!__has_pointer<_Tp>::value && __has_element_type<_Tp>::value)
+template <__has_element_type_member _Tp>
+  requires(!__has_pointer_member<_Tp>)
 struct __pointer_of<_Tp> {
   using type _LIBCPP_NODEBUG = typename _Tp::element_type*;
 };
 
 template <class _Tp>
-  requires(!__has_pointer<_Tp>::value && !__has_element_type<_Tp>::value &&
-           __has_element_type<pointer_traits<_Tp>>::value)
+  requires(!__has_pointer_member<_Tp> && !__has_element_type_member<_Tp>)
----------------
philnik777 wrote:
That wasn't intended. Curiously the entire CI is happy, so we're either missing coverage or this constraint is unnecessary. I've added it back for now, but we should look into it. CC @Zingam 
https://github.com/llvm/llvm-project/pull/142260
    
    
More information about the libcxx-commits
mailing list