[libcxx-commits] [libcxx] 99a8ffe - [libc++] Use __is_scoped_enum for the implementation of is_scoped_enum if it's available (#85580)

via libcxx-commits libcxx-commits at lists.llvm.org
Mon Mar 18 00:51:49 PDT 2024


Author: Nikolas Klauser
Date: 2024-03-18T08:51:45+01:00
New Revision: 99a8ffe6b1e78d16f5dc528048a7c34a236b62bb

URL: https://github.com/llvm/llvm-project/commit/99a8ffe6b1e78d16f5dc528048a7c34a236b62bb
DIFF: https://github.com/llvm/llvm-project/commit/99a8ffe6b1e78d16f5dc528048a7c34a236b62bb.diff

LOG: [libc++] Use __is_scoped_enum for the implementation of is_scoped_enum if it's available (#85580)

Added: 
    

Modified: 
    libcxx/include/__type_traits/is_scoped_enum.h

Removed: 
    


################################################################################
diff  --git a/libcxx/include/__type_traits/is_scoped_enum.h b/libcxx/include/__type_traits/is_scoped_enum.h
index 43b3a6b66b1f5d..1db88e13356e83 100644
--- a/libcxx/include/__type_traits/is_scoped_enum.h
+++ b/libcxx/include/__type_traits/is_scoped_enum.h
@@ -22,6 +22,18 @@
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 #if _LIBCPP_STD_VER >= 23
+
+// TODO: GCC and Clang both have this builtin. Remove the false case once we've updated to GCC 14.
+#  if __has_builtin(__is_scoped_enum)
+
+template <class _Tp>
+struct _LIBCPP_TEMPLATE_VIS is_scoped_enum : bool_constant<__is_scoped_enum(_Tp)> {};
+
+template <class _Tp>
+inline constexpr bool is_scoped_enum_v = __is_scoped_enum(_Tp);
+
+#  else
+
 template <class _Tp, bool = is_enum_v<_Tp> >
 struct __is_scoped_enum_helper : false_type {};
 
@@ -33,7 +45,10 @@ struct _LIBCPP_TEMPLATE_VIS is_scoped_enum : public __is_scoped_enum_helper<_Tp>
 
 template <class _Tp>
 inline constexpr bool is_scoped_enum_v = is_scoped_enum<_Tp>::value;
-#endif
+
+#  endif // __has_builtin(__is_scoped_enum)
+
+#endif // _LIBCPP_STD_VER >= 23
 
 _LIBCPP_END_NAMESPACE_STD
 


        


More information about the libcxx-commits mailing list