Skip to content

[libc++] Use __underlying_type directly in underyling_type_t #135423

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions libcxx/include/__atomic/memory_order.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion libcxx/include/__functional/hash.h
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
};
Expand Down
13 changes: 11 additions & 2 deletions libcxx/include/__type_traits/underlying_type.h
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand All @@ -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
Expand Down
2 changes: 1 addition & 1 deletion libcxx/include/__utility/convert_to_integral.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};

Expand Down
4 changes: 2 additions & 2 deletions libcxx/include/__utility/to_underlying.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion libcxx/include/future
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down