diff options
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 29 | 
1 files changed, 16 insertions, 13 deletions
| diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 960c99af1f2..0e62e26e8b5 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2145,9 +2145,12 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,            Diag(Loc, diag::warn_selfcomparison);          } +  // The result of comparisons is 'bool' in C++, 'int' in C. +  QualType ResultTy = getLangOptions().CPlusPlus? Context.BoolTy : Context.IntTy; +    if (isRelational) {      if (lType->isRealType() && rType->isRealType()) -      return Context.IntTy; +      return ResultTy;    } else {      // Check for comparisons of floating point operands using != and ==.      if (lType->isFloatingType()) { @@ -2156,7 +2159,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,      }      if (lType->isArithmeticType() && rType->isArithmeticType()) -      return Context.IntTy; +      return ResultTy;    }    bool LHSIsNull = lex->isNullPointerConstant(Context); @@ -2181,7 +2184,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,          << lex->getSourceRange() << rex->getSourceRange();      }      ImpCastExprToType(rex, lType); // promote the pointer to pointer -    return Context.IntTy; +    return ResultTy;    }    // Handle block pointer types.    if (lType->isBlockPointerType() && rType->isBlockPointerType()) { @@ -2195,7 +2198,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,          << lex->getSourceRange() << rex->getSourceRange();      }      ImpCastExprToType(rex, lType); // promote the pointer to pointer -    return Context.IntTy; +    return ResultTy;    }    // Allow block pointers to be compared with null pointer constants.    if ((lType->isBlockPointerType() && rType->isPointerType()) || @@ -2206,7 +2209,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,          << lex->getSourceRange() << rex->getSourceRange();      }      ImpCastExprToType(rex, lType); // promote the pointer to pointer -    return Context.IntTy; +    return ResultTy;    }    if ((lType->isObjCQualifiedIdType() || rType->isObjCQualifiedIdType())) { @@ -2224,21 +2227,21 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,            << lType.getAsString() << rType.getAsString()            << lex->getSourceRange() << rex->getSourceRange();          ImpCastExprToType(rex, lType); -        return Context.IntTy; +        return ResultTy;        }        ImpCastExprToType(rex, lType); -      return Context.IntTy; +      return ResultTy;      }      if (ObjCQualifiedIdTypesAreCompatible(lType, rType, true)) {        ImpCastExprToType(rex, lType); -      return Context.IntTy; +      return ResultTy;      } else {        if ((lType->isObjCQualifiedIdType() && rType->isObjCQualifiedIdType())) {          Diag(Loc, diag::warn_incompatible_qualified_id_operands)            << lType.getAsString() << rType.getAsString()            << lex->getSourceRange() << rex->getSourceRange();          ImpCastExprToType(rex, lType); -        return Context.IntTy; +        return ResultTy;        }      }    } @@ -2249,7 +2252,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,          << lType.getAsString() << rType.getAsString()          << lex->getSourceRange() << rex->getSourceRange();      ImpCastExprToType(rex, lType); // promote the integer to pointer -    return Context.IntTy; +    return ResultTy;    }    if (lType->isIntegerType() &&         (rType->isPointerType() || rType->isObjCQualifiedIdType())) { @@ -2258,7 +2261,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,          << lType.getAsString() << rType.getAsString()          << lex->getSourceRange() << rex->getSourceRange();      ImpCastExprToType(lex, rType); // promote the integer to pointer -    return Context.IntTy; +    return ResultTy;    }    // Handle block pointers.    if (lType->isBlockPointerType() && rType->isIntegerType()) { @@ -2267,7 +2270,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,          << lType.getAsString() << rType.getAsString()          << lex->getSourceRange() << rex->getSourceRange();      ImpCastExprToType(rex, lType); // promote the integer to pointer -    return Context.IntTy; +    return ResultTy;    }    if (lType->isIntegerType() && rType->isBlockPointerType()) {      if (!LHSIsNull) @@ -2275,7 +2278,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,          << lType.getAsString() << rType.getAsString()          << lex->getSourceRange() << rex->getSourceRange();      ImpCastExprToType(lex, rType); // promote the integer to pointer -    return Context.IntTy; +    return ResultTy;    }    return InvalidOperands(Loc, lex, rex);  } | 

