[clang] [clang] Rework `hasBooleanRepresentation`. (PR #136038)
Michele Scandale via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 17 12:36:14 PDT 2025
================
@@ -8623,6 +8624,13 @@ inline bool Type::isIntegralOrEnumerationType() const {
inline bool Type::isBooleanType() const {
if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
return BT->getKind() == BuiltinType::Bool;
+ if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) {
+ // Incomplete enum types are not treated as integer types.
+ // FIXME: In C++, enum types are never integer types.
+ return IsEnumDeclComplete(ET->getDecl()) &&
+ !IsEnumDeclScoped(ET->getDecl()) &&
----------------
michele-scandale wrote:
> C specifies that "enumerated types" are integer types, and C++ does not, and `isIntegerType` is trying to honor that as best it can. It's one of those situations where we need to ask what callers actually want, because in most cases it's probably not this language-specific formal property. If `hasIntegerRepresentation` is really a question about the representation of the type, it should be ignoring scoped-ness of enums. But it seems to be used in Sema in ways that should definitely exclude scoped enums, like the semantic analysis of `__builtin_shuffle_vector` and vector math.
The check on scoped enum comes from:
```
commit 21673c4e7ec08457b53798b9879b7cc9a5909eb8
Author: Douglas Gregor <dgregor at apple.com>
Date: Thu May 5 16:13:52 2011 +0000
Scoped enumerations should not be treated as integer types (in the C
sense). Fixes <rdar://problem/9366066> by eliminating an inconsistency
between C++ overloading (which handled scoped enumerations correctly)
and C binary operator type-checking (which didn't).
llvm-svn: 130924
```
> `isBooleanType` should probably continue to check only for `bool`.
Ok.
> It seems reasonable for `hasBooleanRepresentation` to look through enums, though, and it should probably ignore the scoped-ness of the enum.
I can do that, but I'm not super happy about the inconsistency.
https://github.com/llvm/llvm-project/pull/136038
More information about the cfe-commits
mailing list