diff options
author | Nikolas Klauser <nikolasklauser@berlin.de> | 2025-04-13 11:01:17 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-13 11:01:17 +0200 |
commit | 4e0876ee43d00c5fc28ed30bcb7c1aac2b18674f (patch) | |
tree | ed1fe71ef8adf97055b13389b9fb3099e2be9516 | |
parent | 1004fae222efeee215780c4bb4e64eb82b07fb4f (diff) | |
download | llvm-4e0876ee43d00c5fc28ed30bcb7c1aac2b18674f.zip llvm-4e0876ee43d00c5fc28ed30bcb7c1aac2b18674f.tar.gz llvm-4e0876ee43d00c5fc28ed30bcb7c1aac2b18674f.tar.bz2 |
[libc++] Use __underlying_type directly in underyling_type_t (#135423)
This avoids instantiating multiple classes, reducing compile times. This
patch also introduces `__underyling_type_t` for internal use, similar to
other type traits.
-rw-r--r-- | libcxx/include/__atomic/memory_order.h | 4 | ||||
-rw-r--r-- | libcxx/include/__functional/hash.h | 2 | ||||
-rw-r--r-- | libcxx/include/__type_traits/underlying_type.h | 13 | ||||
-rw-r--r-- | libcxx/include/__utility/convert_to_integral.h | 2 | ||||
-rw-r--r-- | libcxx/include/__utility/to_underlying.h | 4 | ||||
-rw-r--r-- | libcxx/include/future | 2 |
6 files changed, 18 insertions, 9 deletions
diff --git a/libcxx/include/__atomic/memory_order.h b/libcxx/include/__atomic/memory_order.h index 44790fe..3558043 100644 --- a/libcxx/include/__atomic/memory_order.h +++ b/libcxx/include/__atomic/memory_order.h @@ -24,7 +24,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD // to pin the underlying type in C++20. enum __legacy_memory_order { __mo_relaxed, __mo_consume, __mo_acquire, __mo_release, __mo_acq_rel, __mo_seq_cst }; -using __memory_order_underlying_t _LIBCPP_NODEBUG = underlying_type<__legacy_memory_order>::type; +using __memory_order_underlying_t _LIBCPP_NODEBUG = __underlying_type_t<__legacy_memory_order>; #if _LIBCPP_STD_VER >= 20 @@ -37,7 +37,7 @@ enum class memory_order : __memory_order_underlying_t { seq_cst = __mo_seq_cst }; -static_assert(is_same<underlying_type<memory_order>::type, __memory_order_underlying_t>::value, +static_assert(is_same<__underlying_type_t<memory_order>, __memory_order_underlying_t>::value, "unexpected underlying type for std::memory_order"); inline constexpr auto memory_order_relaxed = memory_order::relaxed; diff --git a/libcxx/include/__functional/hash.h b/libcxx/include/__functional/hash.h index 3b50ecc..f9f7d2c 100644 --- a/libcxx/include/__functional/hash.h +++ b/libcxx/include/__functional/hash.h @@ -504,7 +504,7 @@ struct hash<long double> : public __scalar_hash<long double> { template <class _Tp, bool = is_enum<_Tp>::value> struct __enum_hash : public __unary_function<_Tp, size_t> { _LIBCPP_HIDE_FROM_ABI size_t operator()(_Tp __v) const _NOEXCEPT { - typedef typename underlying_type<_Tp>::type type; + using type = __underlying_type_t<_Tp>; return hash<type>()(static_cast<type>(__v)); } }; diff --git a/libcxx/include/__type_traits/underlying_type.h b/libcxx/include/__type_traits/underlying_type.h index 45a9b40..100734c 100644 --- a/libcxx/include/__type_traits/underlying_type.h +++ b/libcxx/include/__type_traits/underlying_type.h @@ -18,7 +18,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD -template <class _Tp, bool = is_enum<_Tp>::value> +template <class _Tp, bool> struct __underlying_type_impl; template <class _Tp> @@ -32,9 +32,18 @@ struct __underlying_type_impl<_Tp, true> { template <class _Tp> struct _LIBCPP_NO_SPECIALIZATIONS underlying_type : __underlying_type_impl<_Tp, is_enum<_Tp>::value> {}; +// GCC doesn't SFINAE away when using __underlying_type directly +#if !defined(_LIBCPP_COMPILER_GCC) +template <class _Tp> +using __underlying_type_t _LIBCPP_NODEBUG = __underlying_type(_Tp); +#else +template <class _Tp> +using __underlying_type_t _LIBCPP_NODEBUG = typename underlying_type<_Tp>::type; +#endif + #if _LIBCPP_STD_VER >= 14 template <class _Tp> -using underlying_type_t = typename underlying_type<_Tp>::type; +using underlying_type_t = __underlying_type_t<_Tp>; #endif _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/include/__utility/convert_to_integral.h b/libcxx/include/__utility/convert_to_integral.h index 8947c34..c8149b7 100644 --- a/libcxx/include/__utility/convert_to_integral.h +++ b/libcxx/include/__utility/convert_to_integral.h @@ -50,7 +50,7 @@ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __uint128_t __convert_to_integral template <class _Tp, bool = is_enum<_Tp>::value> struct __sfinae_underlying_type { - typedef typename underlying_type<_Tp>::type type; + using type = __underlying_type_t<_Tp>; typedef decltype(((type)1) + 0) __promoted_type; }; diff --git a/libcxx/include/__utility/to_underlying.h b/libcxx/include/__utility/to_underlying.h index 7758710..3e9d405 100644 --- a/libcxx/include/__utility/to_underlying.h +++ b/libcxx/include/__utility/to_underlying.h @@ -21,8 +21,8 @@ _LIBCPP_BEGIN_NAMESPACE_STD #ifndef _LIBCPP_CXX03_LANG template <class _Tp> -_LIBCPP_HIDE_FROM_ABI constexpr typename underlying_type<_Tp>::type __to_underlying(_Tp __val) noexcept { - return static_cast<typename underlying_type<_Tp>::type>(__val); +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI constexpr __underlying_type_t<_Tp> __to_underlying(_Tp __val) noexcept { + return static_cast<__underlying_type_t<_Tp>>(__val); } #endif // !_LIBCPP_CXX03_LANG diff --git a/libcxx/include/future b/libcxx/include/future index 28850ad..3dfcce8 100644 --- a/libcxx/include/future +++ b/libcxx/include/future @@ -440,7 +440,7 @@ _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(launch) # ifndef _LIBCPP_CXX03_LANG -typedef underlying_type<launch>::type __launch_underlying_type; +using __launch_underlying_type _LIBCPP_NODEBUG = __underlying_type_t<launch>; inline _LIBCPP_HIDE_FROM_ABI constexpr launch operator&(launch __x, launch __y) { return static_cast<launch>(static_cast<__launch_underlying_type>(__x) & static_cast<__launch_underlying_type>(__y)); |