git: 9058186bc1fa - stable/13 - Apply libc++ fix for compiling <type_traits> with clang 16

From: Dimitry Andric <dim_at_FreeBSD.org>
Date: Thu, 01 Jun 2023 19:16:49 UTC
The branch stable/13 has been updated by dim:

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

commit 9058186bc1fa513a264fe949375f25f0061528eb
Author:     Dimitry Andric <dim@FreeBSD.org>
AuthorDate: 2023-05-27 16:19:37 +0000
Commit:     Dimitry Andric <dim@FreeBSD.org>
CommitDate: 2023-06-01 19:15:25 +0000

    Apply libc++ fix for compiling <type_traits> with clang 16
    
    Merge commit 0e7971154ecb from llvm-project (by Christopher Di Bella):
    
      [libcxx][NFC] utilises compiler builtins for unary transform type-traits
    
      Depends on D116203
    
      Reviewed By: #libc, philnik
    
      Differential Revision: https://reviews.llvm.org/D131732
    
    Clang 16 got new builtins that are equivalent to hand-written parts of
    <type_traits>. When building world with the devel/llvm16 package
    installed and CROSS_TOOLCHAIN=llvm16 set, this would lead to -Werror
    warnings about those builtins being overridden.
    
    Reported by:    emaste
    MFC after:      3 days
    
    (cherry picked from commit 1f571f8767e6e48e7175cdaa27ed11d0c473d4c2)
---
 .../include/__type_traits/add_lvalue_reference.h      | 12 +++++++++++-
 .../libcxx/include/__type_traits/add_pointer.h        | 15 +++++++++++----
 .../include/__type_traits/add_rvalue_reference.h      | 12 +++++++++++-
 .../llvm-project/libcxx/include/__type_traits/decay.h |  9 ++++++++-
 .../libcxx/include/__type_traits/is_referenceable.h   | 18 +++++++++++++-----
 .../libcxx/include/__type_traits/make_signed.h        | 19 +++++++++++++------
 .../libcxx/include/__type_traits/make_unsigned.h      | 19 +++++++++++++------
 .../libcxx/include/__type_traits/remove_all_extents.h |  7 +++++++
 .../libcxx/include/__type_traits/remove_const.h       |  8 ++++++++
 .../libcxx/include/__type_traits/remove_cv.h          |  8 ++++++++
 .../libcxx/include/__type_traits/remove_cvref.h       |  5 +++++
 .../libcxx/include/__type_traits/remove_extent.h      |  7 +++++++
 .../libcxx/include/__type_traits/remove_pointer.h     |  7 +++++++
 .../libcxx/include/__type_traits/remove_reference.h   |  7 +++++++
 .../libcxx/include/__type_traits/remove_volatile.h    |  8 ++++++++
 contrib/llvm-project/libcxx/include/type_traits       |  4 ++--
 16 files changed, 139 insertions(+), 26 deletions(-)

diff --git a/contrib/llvm-project/libcxx/include/__type_traits/add_lvalue_reference.h b/contrib/llvm-project/libcxx/include/__type_traits/add_lvalue_reference.h
index 0d1ee4185c8c..9126caa9c7e9 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/add_lvalue_reference.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/add_lvalue_reference.h
@@ -18,11 +18,21 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
-template <class _Tp, bool = __is_referenceable<_Tp>::value> struct __add_lvalue_reference_impl            { typedef _LIBCPP_NODEBUG _Tp  type; };
+#if __has_builtin(__add_lvalue_reference)
+template <class _Tp>
+struct add_lvalue_reference {
+  using type _LIBCPP_NODEBUG = __add_lvalue_reference(_Tp);
+};
+#else
+template <class _Tp, bool = __libcpp_is_referenceable<_Tp>::value>
+struct __add_lvalue_reference_impl {
+  typedef _LIBCPP_NODEBUG _Tp type;
+};
 template <class _Tp                                       > struct __add_lvalue_reference_impl<_Tp, true> { typedef _LIBCPP_NODEBUG _Tp& type; };
 
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS add_lvalue_reference
 {typedef _LIBCPP_NODEBUG typename  __add_lvalue_reference_impl<_Tp>::type type;};
+#endif // __has_builtin(__add_lvalue_reference)
 
 #if _LIBCPP_STD_VER > 11
 template <class _Tp> using add_lvalue_reference_t = typename add_lvalue_reference<_Tp>::type;
diff --git a/contrib/llvm-project/libcxx/include/__type_traits/add_pointer.h b/contrib/llvm-project/libcxx/include/__type_traits/add_pointer.h
index aea2490c5d0c..be3f758da4af 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/add_pointer.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/add_pointer.h
@@ -21,16 +21,23 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
+#if __has_builtin(__add_pointer)
+template <class _Tp>
+struct add_pointer {
+  using type _LIBCPP_NODEBUG = __add_pointer(_Tp);
+};
+#else
 template <class _Tp,
-        bool = __is_referenceable<_Tp>::value ||
-                _IsSame<typename remove_cv<_Tp>::type, void>::value>
-struct __add_pointer_impl
-    {typedef _LIBCPP_NODEBUG typename remove_reference<_Tp>::type* type;};
+          bool = __libcpp_is_referenceable<_Tp>::value || _IsSame<typename remove_cv<_Tp>::type, void>::value>
+struct __add_pointer_impl {
+  typedef _LIBCPP_NODEBUG typename remove_reference<_Tp>::type* type;
+};
 template <class _Tp> struct __add_pointer_impl<_Tp, false>
     {typedef _LIBCPP_NODEBUG _Tp type;};
 
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS add_pointer
     {typedef _LIBCPP_NODEBUG typename __add_pointer_impl<_Tp>::type type;};
+#endif // __has_builtin(__add_pointer)
 
 #if _LIBCPP_STD_VER > 11
 template <class _Tp> using add_pointer_t = typename add_pointer<_Tp>::type;
diff --git a/contrib/llvm-project/libcxx/include/__type_traits/add_rvalue_reference.h b/contrib/llvm-project/libcxx/include/__type_traits/add_rvalue_reference.h
index b2a1428095d8..be01d4ec5ba8 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/add_rvalue_reference.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/add_rvalue_reference.h
@@ -18,11 +18,21 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
-template <class _Tp, bool = __is_referenceable<_Tp>::value> struct __add_rvalue_reference_impl            { typedef _LIBCPP_NODEBUG _Tp   type; };
+#if __has_builtin(__add_rvalue_reference)
+template <class _Tp>
+struct add_rvalue_reference {
+  using type _LIBCPP_NODEBUG = __add_rvalue_reference(_Tp);
+};
+#else
+template <class _Tp, bool = __libcpp_is_referenceable<_Tp>::value>
+struct __add_rvalue_reference_impl {
+  typedef _LIBCPP_NODEBUG _Tp type;
+};
 template <class _Tp                                       > struct __add_rvalue_reference_impl<_Tp, true> { typedef _LIBCPP_NODEBUG _Tp&& type; };
 
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS add_rvalue_reference
 {typedef _LIBCPP_NODEBUG typename __add_rvalue_reference_impl<_Tp>::type type;};
+#endif // __has_builtin(__add_rvalue_reference)
 
 #if _LIBCPP_STD_VER > 11
 template <class _Tp> using add_rvalue_reference_t = typename add_rvalue_reference<_Tp>::type;
diff --git a/contrib/llvm-project/libcxx/include/__type_traits/decay.h b/contrib/llvm-project/libcxx/include/__type_traits/decay.h
index 2af0c1ca42c3..ced21d81c815 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/decay.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/decay.h
@@ -26,6 +26,12 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
+#if __has_builtin(__decay)
+template <class _Tp>
+struct decay {
+  using type _LIBCPP_NODEBUG = __decay(_Tp);
+};
+#else
 template <class _Up, bool>
 struct __decay {
     typedef _LIBCPP_NODEBUG typename remove_cv<_Up>::type type;
@@ -53,8 +59,9 @@ struct _LIBCPP_TEMPLATE_VIS decay
 private:
     typedef _LIBCPP_NODEBUG typename remove_reference<_Tp>::type _Up;
 public:
-    typedef _LIBCPP_NODEBUG typename __decay<_Up, __is_referenceable<_Up>::value>::type type;
+  typedef _LIBCPP_NODEBUG typename __decay<_Up, __libcpp_is_referenceable<_Up>::value>::type type;
 };
+#endif // __has_builtin(__decay)
 
 #if _LIBCPP_STD_VER > 11
 template <class _Tp> using decay_t = typename decay<_Tp>::type;
diff --git a/contrib/llvm-project/libcxx/include/__type_traits/is_referenceable.h b/contrib/llvm-project/libcxx/include/__type_traits/is_referenceable.h
index b97631cc39dd..4b34ec257231 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/is_referenceable.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/is_referenceable.h
@@ -19,14 +19,22 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
-struct __is_referenceable_impl {
-    template <class _Tp> static _Tp& __test(int);
-    template <class _Tp> static false_type __test(...);
+#if __has_builtin(__is_referenceable)
+template <class _Tp>
+struct __libcpp_is_referenceable : integral_constant<bool, __is_referenceable(_Tp)> {};
+#else
+struct __libcpp_is_referenceable_impl {
+  template <class _Tp>
+  static _Tp& __test(int);
+  template <class _Tp>
+  static false_type __test(...);
 };
 
 template <class _Tp>
-struct __is_referenceable : integral_constant<bool,
-    _IsNotSame<decltype(__is_referenceable_impl::__test<_Tp>(0)), false_type>::value> {};
+struct __libcpp_is_referenceable
+    : integral_constant<bool, _IsNotSame<decltype(__libcpp_is_referenceable_impl::__test<_Tp>(0)), false_type>::value> {
+};
+#endif // __has_builtin(__is_referenceable)
 
 _LIBCPP_END_NAMESPACE_STD
 
diff --git a/contrib/llvm-project/libcxx/include/__type_traits/make_signed.h b/contrib/llvm-project/libcxx/include/__type_traits/make_signed.h
index fbc31172a978..c36e2292f16f 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/make_signed.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/make_signed.h
@@ -23,19 +23,25 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
+#if __has_builtin(__make_signed)
+template <class _Tp>
+struct make_signed {
+  using type _LIBCPP_NODEBUG = __make_signed(_Tp);
+};
+#else
 typedef
     __type_list<signed char,
     __type_list<signed short,
     __type_list<signed int,
     __type_list<signed long,
     __type_list<signed long long,
-#ifndef _LIBCPP_HAS_NO_INT128
+#  ifndef _LIBCPP_HAS_NO_INT128
     __type_list<__int128_t,
-#endif
+#  endif
     __nat
-#ifndef _LIBCPP_HAS_NO_INT128
+#  ifndef _LIBCPP_HAS_NO_INT128
     >
-#endif
+#  endif
     > > > > > __signed_types;
 
 template <class _Tp, bool = is_integral<_Tp>::value || is_enum<_Tp>::value>
@@ -56,16 +62,17 @@ template <> struct __make_signed<  signed long,      true> {typedef long      ty
 template <> struct __make_signed<unsigned long,      true> {typedef long      type;};
 template <> struct __make_signed<  signed long long, true> {typedef long long type;};
 template <> struct __make_signed<unsigned long long, true> {typedef long long type;};
-#ifndef _LIBCPP_HAS_NO_INT128
+#  ifndef _LIBCPP_HAS_NO_INT128
 template <> struct __make_signed<__int128_t,         true> {typedef __int128_t type;};
 template <> struct __make_signed<__uint128_t,        true> {typedef __int128_t type;};
-#endif
+#  endif
 
 template <class _Tp>
 struct _LIBCPP_TEMPLATE_VIS make_signed
 {
     typedef typename __apply_cv<_Tp, typename __make_signed<typename remove_cv<_Tp>::type>::type>::type type;
 };
+#endif // __has_builtin(__make_signed)
 
 #if _LIBCPP_STD_VER > 11
 template <class _Tp> using make_signed_t = typename make_signed<_Tp>::type;
diff --git a/contrib/llvm-project/libcxx/include/__type_traits/make_unsigned.h b/contrib/llvm-project/libcxx/include/__type_traits/make_unsigned.h
index 8110a5ca9609..6d4e482a8d97 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/make_unsigned.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/make_unsigned.h
@@ -25,19 +25,25 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
+#if __has_builtin(__make_unsigned)
+template <class _Tp>
+struct make_unsigned {
+  using type _LIBCPP_NODEBUG = __make_unsigned(_Tp);
+};
+#else
 typedef
     __type_list<unsigned char,
     __type_list<unsigned short,
     __type_list<unsigned int,
     __type_list<unsigned long,
     __type_list<unsigned long long,
-#ifndef _LIBCPP_HAS_NO_INT128
+#  ifndef _LIBCPP_HAS_NO_INT128
     __type_list<__uint128_t,
-#endif
+#  endif
     __nat
-#ifndef _LIBCPP_HAS_NO_INT128
+#  ifndef _LIBCPP_HAS_NO_INT128
     >
-#endif
+#  endif
     > > > > > __unsigned_types;
 
 template <class _Tp, bool = is_integral<_Tp>::value || is_enum<_Tp>::value>
@@ -58,16 +64,17 @@ template <> struct __make_unsigned<  signed long,      true> {typedef unsigned l
 template <> struct __make_unsigned<unsigned long,      true> {typedef unsigned long      type;};
 template <> struct __make_unsigned<  signed long long, true> {typedef unsigned long long type;};
 template <> struct __make_unsigned<unsigned long long, true> {typedef unsigned long long type;};
-#ifndef _LIBCPP_HAS_NO_INT128
+#  ifndef _LIBCPP_HAS_NO_INT128
 template <> struct __make_unsigned<__int128_t,         true> {typedef __uint128_t        type;};
 template <> struct __make_unsigned<__uint128_t,        true> {typedef __uint128_t        type;};
-#endif
+#  endif
 
 template <class _Tp>
 struct _LIBCPP_TEMPLATE_VIS make_unsigned
 {
     typedef typename __apply_cv<_Tp, typename __make_unsigned<typename remove_cv<_Tp>::type>::type>::type type;
 };
+#endif // __has_builtin(__make_unsigned)
 
 #if _LIBCPP_STD_VER > 11
 template <class _Tp> using make_unsigned_t = typename make_unsigned<_Tp>::type;
diff --git a/contrib/llvm-project/libcxx/include/__type_traits/remove_all_extents.h b/contrib/llvm-project/libcxx/include/__type_traits/remove_all_extents.h
index 075e3acabb44..cc00a61c92b3 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/remove_all_extents.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/remove_all_extents.h
@@ -18,12 +18,19 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
+#if __has_builtin(__remove_all_extents)
+template <class _Tp>
+struct remove_all_extents {
+  using type _LIBCPP_NODEBUG = __remove_all_extents(_Tp);
+};
+#else
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_all_extents
     {typedef _Tp type;};
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_all_extents<_Tp[]>
     {typedef typename remove_all_extents<_Tp>::type type;};
 template <class _Tp, size_t _Np> struct _LIBCPP_TEMPLATE_VIS remove_all_extents<_Tp[_Np]>
     {typedef typename remove_all_extents<_Tp>::type type;};
+#endif // __has_builtin(__remove_all_extents)
 
 #if _LIBCPP_STD_VER > 11
 template <class _Tp> using remove_all_extents_t = typename remove_all_extents<_Tp>::type;
diff --git a/contrib/llvm-project/libcxx/include/__type_traits/remove_const.h b/contrib/llvm-project/libcxx/include/__type_traits/remove_const.h
index 8efc893e965a..8eefbd099cb3 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/remove_const.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/remove_const.h
@@ -17,8 +17,16 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
+#if __has_builtin(__remove_const)
+template <class _Tp>
+struct remove_const {
+  using type _LIBCPP_NODEBUG = __remove_const(_Tp);
+};
+#else
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_const            {typedef _Tp type;};
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_const<const _Tp> {typedef _Tp type;};
+#endif // __has_builtin(__remove_const)
+
 #if _LIBCPP_STD_VER > 11
 template <class _Tp> using remove_const_t = typename remove_const<_Tp>::type;
 #endif
diff --git a/contrib/llvm-project/libcxx/include/__type_traits/remove_cv.h b/contrib/llvm-project/libcxx/include/__type_traits/remove_cv.h
index ce1e4e45c6d1..9e3dee6c46ed 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/remove_cv.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/remove_cv.h
@@ -19,8 +19,16 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
+#if __has_builtin(__remove_cv)
+template <class _Tp>
+struct remove_cv {
+  using type _LIBCPP_NODEBUG = __remove_cv(_Tp);
+};
+#else
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_cv
 {typedef typename remove_volatile<typename remove_const<_Tp>::type>::type type;};
+#endif // __has_builtin(__remove_cv)
+
 #if _LIBCPP_STD_VER > 11
 template <class _Tp> using remove_cv_t = typename remove_cv<_Tp>::type;
 #endif
diff --git a/contrib/llvm-project/libcxx/include/__type_traits/remove_cvref.h b/contrib/llvm-project/libcxx/include/__type_traits/remove_cvref.h
index d937501fedce..3af261db3949 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/remove_cvref.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/remove_cvref.h
@@ -20,8 +20,13 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
+#if __has_builtin(__remove_cvref)
+template <class _Tp>
+using __uncvref_t _LIBCPP_NODEBUG = __remove_cvref(_Tp);
+#else
 template <class _Tp>
 using __uncvref_t _LIBCPP_NODEBUG = typename remove_cv<typename remove_reference<_Tp>::type>::type;
+#endif // __has_builtin(__remove_cvref)
 
 template <class _Tp, class _Up>
 struct __is_same_uncvref : _IsSame<__uncvref_t<_Tp>, __uncvref_t<_Up> > {};
diff --git a/contrib/llvm-project/libcxx/include/__type_traits/remove_extent.h b/contrib/llvm-project/libcxx/include/__type_traits/remove_extent.h
index e353de361616..88da32a4e265 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/remove_extent.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/remove_extent.h
@@ -18,12 +18,19 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
+#if __has_builtin(__remove_extent)
+template <class _Tp>
+struct remove_extent {
+  using type _LIBCPP_NODEBUG = __remove_extent(_Tp);
+};
+#else
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_extent
     {typedef _Tp type;};
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_extent<_Tp[]>
     {typedef _Tp type;};
 template <class _Tp, size_t _Np> struct _LIBCPP_TEMPLATE_VIS remove_extent<_Tp[_Np]>
     {typedef _Tp type;};
+#endif // __has_builtin(__remove_extent)
 
 #if _LIBCPP_STD_VER > 11
 template <class _Tp> using remove_extent_t = typename remove_extent<_Tp>::type;
diff --git a/contrib/llvm-project/libcxx/include/__type_traits/remove_pointer.h b/contrib/llvm-project/libcxx/include/__type_traits/remove_pointer.h
index 50cde3829470..9042a5250055 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/remove_pointer.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/remove_pointer.h
@@ -17,11 +17,18 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
+#if __has_builtin(__remove_pointer)
+template <class _Tp>
+struct remove_pointer {
+  using type _LIBCPP_NODEBUG = __remove_pointer(_Tp);
+};
+#else
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_pointer                      {typedef _LIBCPP_NODEBUG _Tp type;};
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_pointer<_Tp*>                {typedef _LIBCPP_NODEBUG _Tp type;};
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_pointer<_Tp* const>          {typedef _LIBCPP_NODEBUG _Tp type;};
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_pointer<_Tp* volatile>       {typedef _LIBCPP_NODEBUG _Tp type;};
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_pointer<_Tp* const volatile> {typedef _LIBCPP_NODEBUG _Tp type;};
+#endif // __has_builtin(__remove_pointer)
 
 #if _LIBCPP_STD_VER > 11
 template <class _Tp> using remove_pointer_t = typename remove_pointer<_Tp>::type;
diff --git a/contrib/llvm-project/libcxx/include/__type_traits/remove_reference.h b/contrib/llvm-project/libcxx/include/__type_traits/remove_reference.h
index a69e48dc584b..7ea7fa52ecc5 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/remove_reference.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/remove_reference.h
@@ -18,9 +18,16 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
+#if __has_builtin(__remove_reference)
+template <class _Tp>
+struct remove_reference {
+  using type _LIBCPP_NODEBUG = __remove_reference(_Tp);
+};
+#else
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_reference        {typedef _LIBCPP_NODEBUG _Tp type;};
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_reference<_Tp&>  {typedef _LIBCPP_NODEBUG _Tp type;};
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_reference<_Tp&&> {typedef _LIBCPP_NODEBUG _Tp type;};
+#endif // __has_builtin(__remove_reference)
 
 #if _LIBCPP_STD_VER > 11
 template <class _Tp> using remove_reference_t = typename remove_reference<_Tp>::type;
diff --git a/contrib/llvm-project/libcxx/include/__type_traits/remove_volatile.h b/contrib/llvm-project/libcxx/include/__type_traits/remove_volatile.h
index 79f64c46a27d..8c7aa6744193 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/remove_volatile.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/remove_volatile.h
@@ -17,8 +17,16 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
+#if __has_builtin(__remove_volatile)
+template <class _Tp>
+struct remove_volatile {
+  using type _LIBCPP_NODEBUG = __remove_volatile(_Tp);
+};
+#else
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_volatile               {typedef _Tp type;};
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_volatile<volatile _Tp> {typedef _Tp type;};
+#endif // __has_builtin(__remove_volatile)
+
 #if _LIBCPP_STD_VER > 11
 template <class _Tp> using remove_volatile_t = typename remove_volatile<_Tp>::type;
 #endif
diff --git a/contrib/llvm-project/libcxx/include/type_traits b/contrib/llvm-project/libcxx/include/type_traits
index 3a086c595f92..dc05f9a44daf 100644
--- a/contrib/llvm-project/libcxx/include/type_traits
+++ b/contrib/llvm-project/libcxx/include/type_traits
@@ -679,7 +679,7 @@ struct _LIBCPP_TEMPLATE_VIS is_swappable_with
 template <class _Tp>
 struct _LIBCPP_TEMPLATE_VIS is_swappable
     : public conditional<
-        __is_referenceable<_Tp>::value,
+        __libcpp_is_referenceable<_Tp>::value,
         is_swappable_with<
             typename add_lvalue_reference<_Tp>::type,
             typename add_lvalue_reference<_Tp>::type>,
@@ -697,7 +697,7 @@ struct _LIBCPP_TEMPLATE_VIS is_nothrow_swappable_with
 template <class _Tp>
 struct _LIBCPP_TEMPLATE_VIS is_nothrow_swappable
     : public conditional<
-        __is_referenceable<_Tp>::value,
+        __libcpp_is_referenceable<_Tp>::value,
         is_nothrow_swappable_with<
             typename add_lvalue_reference<_Tp>::type,
             typename add_lvalue_reference<_Tp>::type>,