Old code:
# if _GLIBCXX_USE_BUILTIN_TRAIT(__is_scoped_enum)
template<typename _Tp>
struct is_scoped_enum
: bool_constant<__is_scoped_enum(_Tp)>
{ };
# else
template<typename _Tp>
struct is_scoped_enum
: false_type
{ };
template<typename _Tp>
requires __is_enum(_Tp)
&& requires(remove_cv_t<_Tp> __t) { __t = __t; } // fails if incomplete
struct is_scoped_enum<_Tp>
: bool_constant<!requires(_Tp __t, void(*__f)(int)) { __f(__t); }>
{ };
# endif
New code:
# if _GLIBCXX_USE_BUILTIN_TRAIT(__is_scoped_enum)
template<typename _Tp>
struct is_scoped_enum
: bool_constant<__is_scoped_enum(_Tp)>
{ };
# else
template <class _Tp>
struct is_scoped_enum
: bool_constant<!requires (int __i) { __i = _Tp { }; } && __is_enum(_Tp)>
{ };
# endif