Skip to content

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

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
Mar 18, 2024
Merged
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
17 changes: 16 additions & 1 deletion libcxx/include/__type_traits/is_scoped_enum.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {};

Expand All @@ -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

Expand Down