================ @@ -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:
>Since the existing methods are arguably misnamed, I wonder if we could >reasonably just change them. Since the difference is (AFAIK) purely to make >them vector-inclusive, perhaps we should just remove them and have a >getNonVectorType() method that clients are expected to call before using the >existing predicates. Just to make sure I'm not misunderstanding things: are you suggesting to just drop the "vector of" portion of the `has*Representation` and move that onto clients of these APIs, right? I'm not sure if that can work in general. E.g. ``` bool Type::hasIntegerRepresentation() const { if (const auto *VT = dyn_cast<VectorType>(CanonicalType)) return VT->getElementType()->isIntegerType(); if (CanonicalType->isSveVLSBuiltinType()) { const auto *VT = cast<BuiltinType>(CanonicalType); return VT->getKind() == BuiltinType::SveBool || (VT->getKind() >= BuiltinType::SveInt8 && VT->getKind() <= BuiltinType::SveUint64); } if (CanonicalType->isRVVVLSBuiltinType()) { const auto *VT = cast<BuiltinType>(CanonicalType); return (VT->getKind() >= BuiltinType::RvvInt8mf8 && VT->getKind() <= BuiltinType::RvvUint64m8); } return isIntegerType(); } ``` This is more than just types where `isIntegerType` is `true`, or vector of such types. https://github.com/llvm/llvm-project/pull/136038 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits