[libcxx-commits] [PATCH] D97283: [libcxx][type_traits] is_unsigned is false for enum types
Louis Dionne via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Mar 5 06:37:44 PST 2021
ldionne added a comment.
In D97283#2605620 <https://reviews.llvm.org/D97283#2605620>, @Mordante wrote:
> It's a clang bug: clang/docs/LanguageExtensions.rst:1024
>
> * ``__is_unsigned`` (C++, Embarcadero)
> Note that this currently returns true for enumeration types if the underlying
> type is unsigned, in violation of the requirements for ``std::is_unsigned``.
> This behavior is likely to change in a future version of Clang.
>
> @zoecarver fixed the signed part in D67897 <https://reviews.llvm.org/D67897>
>
> I want to look at the Clang site unless somebody beats me to it.
I suggest we add the tests present in this patch, fix Clang, and then make libc++ conditionally use just `__is_unsigned` or a combination of `__is_unsigned && !__is_enum` based on the version of Clang. We'll be able to remove that workaround in ~6 months due to the compiler policy, which makes it more acceptable. So:
template <class _Tp>
struct _LIBCPP_TEMPLATE_VIS is_unsigned
: _BoolConstant<
#if _LIBCPP_CLANG_VER < whateverversion // Clang prior to <whateverversion> has a bug and treats enumerations as unsigned
__is_unsigned(_Tp) && !__is_enum(_Tp)
#else
__is_unsigned(_Tp)
#endif
> {};
#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
template <class _Tp>
_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_unsigned_v = is_unsigned<_Tp>::value;
#endif
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D97283/new/
https://reviews.llvm.org/D97283
More information about the libcxx-commits
mailing list