зеркало из https://github.com/microsoft/clang-1.git
Introduce Type::isIntegralOrEnumerationType(), to cover those places
in C++ that involve both integral and enumeration types. Convert all of the callers to Type::isIntegralType() that are meant to work with both integral and enumeration types over to Type::isIntegralOrEnumerationType(), to prepare to eliminate enumeration types as integral types. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106071 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
ff2d05f653
Коммит
2ade35e2cf
|
@ -247,6 +247,7 @@ public:
|
|||
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isCharType)
|
||||
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isWideCharType)
|
||||
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isIntegralType)
|
||||
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isIntegralOrEnumerationType)
|
||||
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isRealFloatingType)
|
||||
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isComplexType)
|
||||
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isAnyComplexType)
|
||||
|
|
|
@ -851,6 +851,9 @@ public:
|
|||
bool isAnyCharacterType() const;
|
||||
bool isIntegralType() const;
|
||||
|
||||
/// \brief Determine whether this type is an integral or enumeration type.
|
||||
bool isIntegralOrEnumerationType() const;
|
||||
|
||||
/// Floating point categories.
|
||||
bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double)
|
||||
/// isComplexType() does *not* include complex integers (a GCC extension).
|
||||
|
|
|
@ -3201,7 +3201,7 @@ CharUnits ASTContext::getObjCEncodingTypeSize(QualType type) {
|
|||
CharUnits sz = getTypeSizeInChars(type);
|
||||
|
||||
// Make all integer and enum types at least as large as an int
|
||||
if (sz.isPositive() && type->isIntegralType())
|
||||
if (sz.isPositive() && type->isIntegralOrEnumerationType())
|
||||
sz = std::max(sz, getTypeSizeInChars(IntTy));
|
||||
// Treat arrays as pointers, since that's how they're passed in.
|
||||
else if (type->isArrayType())
|
||||
|
|
|
@ -37,7 +37,7 @@ bool Expr::isKnownToHaveBooleanValue() const {
|
|||
// If this value has _Bool type, it is obvious 0/1.
|
||||
if (getType()->isBooleanType()) return true;
|
||||
// If this is a non-scalar-integer type, we don't care enough to try.
|
||||
if (!getType()->isIntegralType()) return false;
|
||||
if (!getType()->isIntegralOrEnumerationType()) return false;
|
||||
|
||||
if (const ParenExpr *PE = dyn_cast<ParenExpr>(this))
|
||||
return PE->getSubExpr()->isKnownToHaveBooleanValue();
|
||||
|
@ -160,7 +160,7 @@ void DeclRefExpr::computeDependence() {
|
|||
// (VD) - a constant with integral or enumeration type and is
|
||||
// initialized with an expression that is value-dependent.
|
||||
else if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
|
||||
if (Var->getType()->isIntegralType() &&
|
||||
if (Var->getType()->isIntegralOrEnumerationType() &&
|
||||
Var->getType().getCVRQualifiers() == Qualifiers::Const) {
|
||||
if (const Expr *Init = Var->getAnyInitializer())
|
||||
if (Init->isValueDependent())
|
||||
|
@ -1598,7 +1598,7 @@ Expr *Expr::IgnoreParenNoopCasts(ASTContext &Ctx) {
|
|||
|
||||
if (CastExpr *P = dyn_cast<CastExpr>(E)) {
|
||||
// We ignore integer <-> casts that are of the same width, ptr<->ptr and
|
||||
// ptr<->int casts of the same width. We also ignore all identify casts.
|
||||
// ptr<->int casts of the same width. We also ignore all identity casts.
|
||||
Expr *SE = P->getSubExpr();
|
||||
|
||||
if (Ctx.hasSameUnqualifiedType(E->getType(), SE->getType())) {
|
||||
|
@ -1797,7 +1797,8 @@ bool Expr::isNullPointerConstant(ASTContext &Ctx,
|
|||
// If the unthinkable happens, fall through to the safest alternative.
|
||||
|
||||
case NPC_ValueDependentIsNull:
|
||||
return isTypeDependent() || getType()->isIntegralType();
|
||||
return isTypeDependent() ||
|
||||
(getType()->isIntegralType() && !getType()->isEnumeralType());
|
||||
|
||||
case NPC_ValueDependentIsNotNull:
|
||||
return false;
|
||||
|
|
|
@ -157,7 +157,7 @@ static bool EvalPointerValueAsBool(LValue& Value, bool& Result) {
|
|||
|
||||
static bool HandleConversionToBool(const Expr* E, bool& Result,
|
||||
EvalInfo &Info) {
|
||||
if (E->getType()->isIntegralType()) {
|
||||
if (E->getType()->isIntegralOrEnumerationType()) {
|
||||
APSInt IntResult;
|
||||
if (!EvaluateInteger(E, IntResult, Info))
|
||||
return false;
|
||||
|
@ -542,7 +542,7 @@ bool PointerExprEvaluator::VisitCastExpr(CastExpr* E) {
|
|||
SubExpr->getType()->isBlockPointerType())
|
||||
return Visit(SubExpr);
|
||||
|
||||
if (SubExpr->getType()->isIntegralType()) {
|
||||
if (SubExpr->getType()->isIntegralOrEnumerationType()) {
|
||||
APValue Value;
|
||||
if (!EvaluateIntegerOrLValue(SubExpr, Value, Info))
|
||||
break;
|
||||
|
@ -839,7 +839,8 @@ public:
|
|||
: Info(info), Result(result) {}
|
||||
|
||||
bool Success(const llvm::APSInt &SI, const Expr *E) {
|
||||
assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
|
||||
assert(E->getType()->isIntegralOrEnumerationType() &&
|
||||
"Invalid evaluation result.");
|
||||
assert(SI.isSigned() == E->getType()->isSignedIntegerType() &&
|
||||
"Invalid evaluation result.");
|
||||
assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
|
||||
|
@ -849,7 +850,8 @@ public:
|
|||
}
|
||||
|
||||
bool Success(const llvm::APInt &I, const Expr *E) {
|
||||
assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
|
||||
assert(E->getType()->isIntegralOrEnumerationType() &&
|
||||
"Invalid evaluation result.");
|
||||
assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
|
||||
"Invalid evaluation result.");
|
||||
Result = APValue(APSInt(I));
|
||||
|
@ -858,7 +860,8 @@ public:
|
|||
}
|
||||
|
||||
bool Success(uint64_t Value, const Expr *E) {
|
||||
assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
|
||||
assert(E->getType()->isIntegralOrEnumerationType() &&
|
||||
"Invalid evaluation result.");
|
||||
Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType()));
|
||||
return true;
|
||||
}
|
||||
|
@ -964,12 +967,12 @@ private:
|
|||
} // end anonymous namespace
|
||||
|
||||
static bool EvaluateIntegerOrLValue(const Expr* E, APValue &Result, EvalInfo &Info) {
|
||||
assert(E->getType()->isIntegralType());
|
||||
assert(E->getType()->isIntegralOrEnumerationType());
|
||||
return IntExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E));
|
||||
}
|
||||
|
||||
static bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) {
|
||||
assert(E->getType()->isIntegralType());
|
||||
assert(E->getType()->isIntegralOrEnumerationType());
|
||||
|
||||
APValue Val;
|
||||
if (!EvaluateIntegerOrLValue(E, Val, Info) || !Val.isInt())
|
||||
|
@ -1335,8 +1338,8 @@ bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
|
|||
return Success(Result, E);
|
||||
}
|
||||
}
|
||||
if (!LHSTy->isIntegralType() ||
|
||||
!RHSTy->isIntegralType()) {
|
||||
if (!LHSTy->isIntegralOrEnumerationType() ||
|
||||
!RHSTy->isIntegralOrEnumerationType()) {
|
||||
// We can't continue from here for non-integral types, and they
|
||||
// could potentially confuse the following operations.
|
||||
return false;
|
||||
|
@ -1591,7 +1594,7 @@ bool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
|
|||
}
|
||||
|
||||
// Only handle integral operations...
|
||||
if (!E->getSubExpr()->getType()->isIntegralType())
|
||||
if (!E->getSubExpr()->getType()->isIntegralOrEnumerationType())
|
||||
return false;
|
||||
|
||||
// Get the operand value into 'Result'.
|
||||
|
@ -1634,7 +1637,7 @@ bool IntExprEvaluator::VisitCastExpr(CastExpr *E) {
|
|||
}
|
||||
|
||||
// Handle simple integer->integer casts.
|
||||
if (SrcType->isIntegralType()) {
|
||||
if (SrcType->isIntegralOrEnumerationType()) {
|
||||
if (!Visit(SubExpr))
|
||||
return false;
|
||||
|
||||
|
@ -1929,7 +1932,7 @@ bool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) {
|
|||
bool FloatExprEvaluator::VisitCastExpr(CastExpr *E) {
|
||||
Expr* SubExpr = E->getSubExpr();
|
||||
|
||||
if (SubExpr->getType()->isIntegralType()) {
|
||||
if (SubExpr->getType()->isIntegralOrEnumerationType()) {
|
||||
APSInt IntResult;
|
||||
if (!EvaluateInteger(SubExpr, IntResult, Info))
|
||||
return false;
|
||||
|
@ -2337,7 +2340,7 @@ static ICEDiag CheckEvalInICE(const Expr* E, ASTContext &Ctx) {
|
|||
|
||||
static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) {
|
||||
assert(!E->isValueDependent() && "Should not see value dependent exprs!");
|
||||
if (!E->getType()->isIntegralType()) {
|
||||
if (!E->getType()->isIntegralOrEnumerationType()) {
|
||||
return ICEDiag(2, E->getLocStart());
|
||||
}
|
||||
|
||||
|
@ -2600,7 +2603,7 @@ static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) {
|
|||
case Expr::CXXReinterpretCastExprClass:
|
||||
case Expr::CXXConstCastExprClass: {
|
||||
const Expr *SubExpr = cast<CastExpr>(E)->getSubExpr();
|
||||
if (SubExpr->getType()->isIntegralType())
|
||||
if (SubExpr->getType()->isIntegralOrEnumerationType())
|
||||
return CheckICE(SubExpr, Ctx);
|
||||
if (isa<FloatingLiteral>(SubExpr->IgnoreParens()))
|
||||
return NoDiag();
|
||||
|
|
|
@ -450,6 +450,17 @@ bool Type::isIntegralType() const {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool Type::isIntegralOrEnumerationType() const {
|
||||
if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
|
||||
return BT->getKind() >= BuiltinType::Bool &&
|
||||
BT->getKind() <= BuiltinType::Int128;
|
||||
|
||||
if (isa<EnumType>(CanonicalType))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Type::isEnumeralType() const {
|
||||
if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
|
||||
return TT->getDecl()->isEnum();
|
||||
|
|
|
@ -2659,7 +2659,7 @@ void CFRefCount::EvalSummary(ExplodedNodeSet& Dst,
|
|||
// approriately delegated to the respective StoreManagers while
|
||||
// still allowing us to do checker-specific logic (e.g.,
|
||||
// invalidating reference counts), probably via callbacks.
|
||||
if (ER->getElementType()->isIntegralType()) {
|
||||
if (ER->getElementType()->isIntegralOrEnumerationType()) {
|
||||
const MemRegion *superReg = ER->getSuperRegion();
|
||||
if (isa<VarRegion>(superReg) || isa<FieldRegion>(superReg) ||
|
||||
isa<ObjCIvarRegion>(superReg))
|
||||
|
|
|
@ -894,7 +894,7 @@ void X86_64ABIInfo::classify(QualType Ty,
|
|||
QualType ET = Context.getCanonicalType(CT->getElementType());
|
||||
|
||||
uint64_t Size = Context.getTypeSize(Ty);
|
||||
if (ET->isIntegralType()) {
|
||||
if (ET->isIntegralOrEnumerationType()) {
|
||||
if (Size <= 64)
|
||||
Current = Integer;
|
||||
else if (Size <= 128)
|
||||
|
|
|
@ -1163,7 +1163,7 @@ static TryCastResult TryReinterpretCast(Sema &Self, Expr *SrcExpr,
|
|||
return TC_Success;
|
||||
}
|
||||
|
||||
if (SrcType->isIntegralType() || SrcType->isEnumeralType()) {
|
||||
if (SrcType->isIntegralOrEnumerationType()) {
|
||||
assert(destIsPtr && "One type must be a pointer");
|
||||
// C++ 5.2.10p5: A value of integral or enumeration type can be explicitly
|
||||
// converted to a pointer.
|
||||
|
|
|
@ -3949,7 +3949,7 @@ void Sema::AddInitializerToDecl(DeclPtrTy dcl, ExprArg init, bool DirectInit) {
|
|||
QualType T = VDecl->getType();
|
||||
if (!T->isDependentType() &&
|
||||
(!Context.getCanonicalType(T).isConstQualified() ||
|
||||
!T->isIntegralType())) {
|
||||
!T->isIntegralOrEnumerationType())) {
|
||||
Diag(VDecl->getLocation(), diag::err_member_initialization)
|
||||
<< VDecl->getDeclName() << Init->getSourceRange();
|
||||
VDecl->setInvalidDecl();
|
||||
|
@ -3960,7 +3960,7 @@ void Sema::AddInitializerToDecl(DeclPtrTy dcl, ExprArg init, bool DirectInit) {
|
|||
// can specify a constant-initializer which shall be an
|
||||
// integral constant expression (5.19).
|
||||
if (!Init->isTypeDependent() &&
|
||||
!Init->getType()->isIntegralType()) {
|
||||
!Init->getType()->isIntegralOrEnumerationType()) {
|
||||
// We have a non-dependent, non-integral or enumeration type.
|
||||
Diag(Init->getSourceRange().getBegin(),
|
||||
diag::err_in_class_initializer_non_integral_type)
|
||||
|
@ -5573,7 +5573,7 @@ bool Sema::VerifyBitField(SourceLocation FieldLoc, IdentifierInfo *FieldName,
|
|||
|
||||
// C99 6.7.2.1p4 - verify the field type.
|
||||
// C++ 9.6p3: A bit-field shall have integral or enumeration type.
|
||||
if (!FieldTy->isDependentType() && !FieldTy->isIntegralType()) {
|
||||
if (!FieldTy->isDependentType() && !FieldTy->isIntegralOrEnumerationType()) {
|
||||
// Handle incomplete types with specific error.
|
||||
if (RequireCompleteType(FieldLoc, FieldTy, diag::err_field_incomplete))
|
||||
return true;
|
||||
|
|
|
@ -1525,7 +1525,7 @@ static void HandleModeAttr(Decl *D, const AttributeList &Attr, Sema &S) {
|
|||
if (!OldTy->getAs<BuiltinType>() && !OldTy->isComplexType())
|
||||
S.Diag(Attr.getLoc(), diag::err_mode_not_primitive);
|
||||
else if (IntegerMode) {
|
||||
if (!OldTy->isIntegralType())
|
||||
if (!OldTy->isIntegralOrEnumerationType())
|
||||
S.Diag(Attr.getLoc(), diag::err_mode_wrong_type);
|
||||
} else if (ComplexMode) {
|
||||
if (!OldTy->isComplexType())
|
||||
|
|
|
@ -3913,7 +3913,8 @@ bool Sema::CheckCastTypes(SourceRange TyR, QualType castType, Expr *&castExpr,
|
|||
|
||||
if (!castType->isArithmeticType()) {
|
||||
QualType castExprType = castExpr->getType();
|
||||
if (!castExprType->isIntegralType() && castExprType->isArithmeticType())
|
||||
if (!castExprType->isIntegralType() &&
|
||||
castExprType->isArithmeticType())
|
||||
return Diag(castExpr->getLocStart(),
|
||||
diag::err_cast_pointer_from_non_pointer_int)
|
||||
<< castExprType << castExpr->getSourceRange();
|
||||
|
|
|
@ -720,7 +720,7 @@ Sema::BuildCXXNew(SourceLocation StartLoc, bool UseGlobal,
|
|||
Expr *ArraySize = (Expr *)ArraySizeE.get();
|
||||
if (ArraySize && !ArraySize->isTypeDependent()) {
|
||||
QualType SizeType = ArraySize->getType();
|
||||
if (!SizeType->isIntegralType() && !SizeType->isEnumeralType())
|
||||
if (!SizeType->isIntegralOrEnumerationType())
|
||||
return ExprError(Diag(ArraySize->getSourceRange().getBegin(),
|
||||
diag::err_array_size_not_integral)
|
||||
<< SizeType << ArraySize->getSourceRange());
|
||||
|
|
|
@ -962,7 +962,7 @@ Sema::IsStandardConversion(Expr* From, QualType ToType,
|
|||
// Complex promotion (Clang extension)
|
||||
SCS.Second = ICK_Complex_Promotion;
|
||||
FromType = ToType.getUnqualifiedType();
|
||||
} else if ((FromType->isIntegralType() || FromType->isEnumeralType()) &&
|
||||
} else if (FromType->isIntegralOrEnumerationType() &&
|
||||
(ToType->isIntegralType() && !ToType->isEnumeralType())) {
|
||||
// Integral conversions (C++ 4.7).
|
||||
SCS.Second = ICK_Integral_Conversion;
|
||||
|
@ -983,7 +983,7 @@ Sema::IsStandardConversion(Expr* From, QualType ToType,
|
|||
} else if ((FromType->isFloatingType() &&
|
||||
ToType->isIntegralType() && (!ToType->isBooleanType() &&
|
||||
!ToType->isEnumeralType())) ||
|
||||
((FromType->isIntegralType() || FromType->isEnumeralType()) &&
|
||||
(FromType->isIntegralOrEnumerationType() &&
|
||||
ToType->isFloatingType())) {
|
||||
// Floating-integral conversions (C++ 4.9).
|
||||
SCS.Second = ICK_Floating_Integral;
|
||||
|
@ -1273,7 +1273,7 @@ static bool isNullPointerConstantForConversion(Expr *Expr,
|
|||
// Handle value-dependent integral null pointer constants correctly.
|
||||
// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#903
|
||||
if (Expr->isValueDependent() && !Expr->isTypeDependent() &&
|
||||
Expr->getType()->isIntegralType())
|
||||
Expr->getType()->isIntegerType() && !Expr->getType()->isEnumeralType())
|
||||
return !InOverloadResolution;
|
||||
|
||||
return Expr->isNullPointerConstant(Context,
|
||||
|
|
|
@ -403,7 +403,7 @@ static QualType GetTypeBeforeIntegralPromotion(const Expr* expr) {
|
|||
if (const CastExpr *ImplicitCast = dyn_cast<ImplicitCastExpr>(expr)) {
|
||||
const Expr *ExprBeforePromotion = ImplicitCast->getSubExpr();
|
||||
QualType TypeBeforePromotion = ExprBeforePromotion->getType();
|
||||
if (TypeBeforePromotion->isIntegralType()) {
|
||||
if (TypeBeforePromotion->isIntegralOrEnumerationType()) {
|
||||
return TypeBeforePromotion;
|
||||
}
|
||||
}
|
||||
|
@ -445,7 +445,7 @@ static bool CheckCXXSwitchCondition(Sema &S, SourceLocation SwitchLoc,
|
|||
if (CXXConversionDecl *Conversion
|
||||
= dyn_cast<CXXConversionDecl>((*I)->getUnderlyingDecl()))
|
||||
if (Conversion->getConversionType().getNonReferenceType()
|
||||
->isIntegralType()) {
|
||||
->isIntegralOrEnumerationType()) {
|
||||
if (Conversion->isExplicit())
|
||||
ExplicitConversions.addDecl(I.getDecl(), I.getAccess());
|
||||
else
|
||||
|
|
|
@ -549,7 +549,7 @@ Sema::CheckNonTypeTemplateParameterType(QualType T, SourceLocation Loc) {
|
|||
// (optionally cv-qualified) types:
|
||||
//
|
||||
// -- integral or enumeration type,
|
||||
if (T->isIntegralType() || T->isEnumeralType() ||
|
||||
if (T->isIntegralOrEnumerationType() ||
|
||||
// -- pointer to object or pointer to function,
|
||||
(T->isPointerType() &&
|
||||
(T->getAs<PointerType>()->getPointeeType()->isObjectType() ||
|
||||
|
@ -2777,7 +2777,7 @@ bool Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
|
|||
// conversions (4.7) are applied.
|
||||
QualType ParamType = InstantiatedParamType;
|
||||
QualType ArgType = Arg->getType();
|
||||
if (ParamType->isIntegralType() || ParamType->isEnumeralType()) {
|
||||
if (ParamType->isIntegralOrEnumerationType()) {
|
||||
// C++ [temp.arg.nontype]p1:
|
||||
// A template-argument for a non-type, non-template
|
||||
// template-parameter shall be one of:
|
||||
|
@ -2787,7 +2787,7 @@ bool Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
|
|||
// -- the name of a non-type template-parameter; or
|
||||
SourceLocation NonConstantLoc;
|
||||
llvm::APSInt Value;
|
||||
if (!ArgType->isIntegralType() && !ArgType->isEnumeralType()) {
|
||||
if (!ArgType->isIntegralOrEnumerationType()) {
|
||||
Diag(Arg->getSourceRange().getBegin(),
|
||||
diag::err_template_arg_not_integral_or_enumeral)
|
||||
<< ArgType << Arg->getSourceRange();
|
||||
|
|
Загрузка…
Ссылка в новой задаче