zoecarver created this revision.
zoecarver added reviewers: ldionne, rsmith, tmatheson.
zoecarver requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Updates __is_unsigned to have the same behavior as the standard
specifies. This is in line with 511dbd8, which applied the same change
to __is_signed.
Refs D67897 <https://reviews.llvm.org/D67897>.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D98104
Files:
clang/docs/LanguageExtensions.rst
clang/lib/Sema/SemaExprCXX.cpp
clang/test/SemaCXX/type-traits.cpp
Index: clang/test/SemaCXX/type-traits.cpp
===================================================================
--- clang/test/SemaCXX/type-traits.cpp
+++ clang/test/SemaCXX/type-traits.cpp
@@ -13,6 +13,7 @@
// PODs
enum Enum { EV };
enum SignedEnum : signed int { };
+enum UnsignedEnum : unsigned int { };
struct POD { Enum e; int i; float f; NonPOD* p; };
struct Empty {};
struct IncompleteStruct;
@@ -1450,7 +1451,6 @@
int t04[T(__is_unsigned(unsigned int))];
int t05[T(__is_unsigned(unsigned long))];
int t06[T(__is_unsigned(unsigned long long))];
- int t07[T(__is_unsigned(Enum))];
int t10[F(__is_unsigned(void))];
int t11[F(__is_unsigned(cvoid))];
@@ -1468,6 +1468,8 @@
int t24[F(__is_unsigned(Derives))];
int t25[F(__is_unsigned(ClassType))];
int t26[F(__is_unsigned(IntArNB))];
+ int t27[F(__is_unsigned(Enum))];
+ int t28[F(__is_unsigned(UnsignedEnum))];
}
typedef Int& IntRef;
Index: clang/lib/Sema/SemaExprCXX.cpp
===================================================================
--- clang/lib/Sema/SemaExprCXX.cpp
+++ clang/lib/Sema/SemaExprCXX.cpp
@@ -4833,7 +4833,8 @@
// Floating points should always return true.
return !T->isEnumeralType() && (T->isFloatingType() ||
T->isSignedIntegerType());
case UTT_IsUnsigned:
- return T->isUnsignedIntegerType();
+ // Enum types should always return false (same as UTT_IsSigned).
+ return !T->isEnumeralType() && T->isUnsignedIntegerType();
// Type trait expressions which query classes regarding their construction,
// destruction, and copying. Rather than being based directly on the
Index: clang/docs/LanguageExtensions.rst
===================================================================
--- clang/docs/LanguageExtensions.rst
+++ clang/docs/LanguageExtensions.rst
@@ -1194,7 +1194,9 @@
* ``__is_sealed`` (Microsoft):
Synonym for ``__is_final``.
* ``__is_signed`` (C++, Embarcadero):
- Returns false for enumeration types, and returns true for floating-point
types. Note, before Clang 10, returned true for enumeration types if the
underlying type was signed, and returned false for floating-point types.
+ Returns false for enumeration types, and returns true for floating-point
+ types. Note, before Clang 10, returned true for enumeration types if the
+ underlying type was signed, and returned false for floating-point types.
* ``__is_standard_layout`` (C++, GNU, Microsoft, Embarcadero)
* ``__is_trivial`` (C++, GNU, Microsoft, Embarcadero)
* ``__is_trivially_assignable`` (C++, GNU, Microsoft)
@@ -1203,9 +1205,8 @@
* ``__is_trivially_destructible`` (C++, MSVC 2013)
* ``__is_union`` (C++, GNU, Microsoft, Embarcadero)
* ``__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.
+ Returns false for enumeration types. Note, before Clang 13, returned true for
+ enumeration types if the underlying type was unsigned.
* ``__is_void`` (C++, Embarcadero)
* ``__is_volatile`` (C++, Embarcadero)
* ``__reference_binds_to_temporary(T, U)`` (Clang): Determines whether a
Index: clang/test/SemaCXX/type-traits.cpp
===================================================================
--- clang/test/SemaCXX/type-traits.cpp
+++ clang/test/SemaCXX/type-traits.cpp
@@ -13,6 +13,7 @@
// PODs
enum Enum { EV };
enum SignedEnum : signed int { };
+enum UnsignedEnum : unsigned int { };
struct POD { Enum e; int i; float f; NonPOD* p; };
struct Empty {};
struct IncompleteStruct;
@@ -1450,7 +1451,6 @@
int t04[T(__is_unsigned(unsigned int))];
int t05[T(__is_unsigned(unsigned long))];
int t06[T(__is_unsigned(unsigned long long))];
- int t07[T(__is_unsigned(Enum))];
int t10[F(__is_unsigned(void))];
int t11[F(__is_unsigned(cvoid))];
@@ -1468,6 +1468,8 @@
int t24[F(__is_unsigned(Derives))];
int t25[F(__is_unsigned(ClassType))];
int t26[F(__is_unsigned(IntArNB))];
+ int t27[F(__is_unsigned(Enum))];
+ int t28[F(__is_unsigned(UnsignedEnum))];
}
typedef Int& IntRef;
Index: clang/lib/Sema/SemaExprCXX.cpp
===================================================================
--- clang/lib/Sema/SemaExprCXX.cpp
+++ clang/lib/Sema/SemaExprCXX.cpp
@@ -4833,7 +4833,8 @@
// Floating points should always return true.
return !T->isEnumeralType() && (T->isFloatingType() || T->isSignedIntegerType());
case UTT_IsUnsigned:
- return T->isUnsignedIntegerType();
+ // Enum types should always return false (same as UTT_IsSigned).
+ return !T->isEnumeralType() && T->isUnsignedIntegerType();
// Type trait expressions which query classes regarding their construction,
// destruction, and copying. Rather than being based directly on the
Index: clang/docs/LanguageExtensions.rst
===================================================================
--- clang/docs/LanguageExtensions.rst
+++ clang/docs/LanguageExtensions.rst
@@ -1194,7 +1194,9 @@
* ``__is_sealed`` (Microsoft):
Synonym for ``__is_final``.
* ``__is_signed`` (C++, Embarcadero):
- Returns false for enumeration types, and returns true for floating-point types. Note, before Clang 10, returned true for enumeration types if the underlying type was signed, and returned false for floating-point types.
+ Returns false for enumeration types, and returns true for floating-point
+ types. Note, before Clang 10, returned true for enumeration types if the
+ underlying type was signed, and returned false for floating-point types.
* ``__is_standard_layout`` (C++, GNU, Microsoft, Embarcadero)
* ``__is_trivial`` (C++, GNU, Microsoft, Embarcadero)
* ``__is_trivially_assignable`` (C++, GNU, Microsoft)
@@ -1203,9 +1205,8 @@
* ``__is_trivially_destructible`` (C++, MSVC 2013)
* ``__is_union`` (C++, GNU, Microsoft, Embarcadero)
* ``__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.
+ Returns false for enumeration types. Note, before Clang 13, returned true for
+ enumeration types if the underlying type was unsigned.
* ``__is_void`` (C++, Embarcadero)
* ``__is_volatile`` (C++, Embarcadero)
* ``__reference_binds_to_temporary(T, U)`` (Clang): Determines whether a
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits