diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/ASTContext.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/AST/Expr.cpp | 9 | ||||
| -rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 31 | ||||
| -rw-r--r-- | clang/lib/AST/Type.cpp | 11 | ||||
| -rw-r--r-- | clang/lib/Checker/CFRefCount.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaCXXCast.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 6 | 
14 files changed, 52 insertions, 36 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index bb27ab9747d..fbf26ccca5e 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -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()) diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 68fcb35c79d..db2473bb558 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -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; diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index d97d6256167..bec37920004 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -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(); diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index 1d91e76c8f9..92fffd18812 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -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(); diff --git a/clang/lib/Checker/CFRefCount.cpp b/clang/lib/Checker/CFRefCount.cpp index 42e6f67f017..c2c47333c4d 100644 --- a/clang/lib/Checker/CFRefCount.cpp +++ b/clang/lib/Checker/CFRefCount.cpp @@ -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)) diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index ad024bd85c3..a4f192bc90f 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -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) diff --git a/clang/lib/Sema/SemaCXXCast.cpp b/clang/lib/Sema/SemaCXXCast.cpp index 16f0af14d27..98270866a25 100644 --- a/clang/lib/Sema/SemaCXXCast.cpp +++ b/clang/lib/Sema/SemaCXXCast.cpp @@ -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. diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index e3d20bd5e48..39fbc6a684d 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -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; diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index c6dcc3b97b2..89848afe3e1 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -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()) diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index bb5fa71e52b..347b597f288 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -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(); diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 4c93fba3844..e478d9a28f5 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -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()); diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 89eb90bc13d..3de8e730c60 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -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, diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 0c510fb1dd0..cd71239164d 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -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 diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 234665c4aa7..a2d4de5b1f7 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -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();  | 

