From: Richard Trieu Date: Thu, 15 Sep 2011 23:51:29 +0000 (+0000) Subject: Change checkArithmeticNull() to use a NonNullType, instead of checking both the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5e3a23585f6e2f397be6ead14fee6b9c1b110fb1;p=clang Change checkArithmeticNull() to use a NonNullType, instead of checking both the LHSType and RHSType for everything. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@139878 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 16b55f1aee..73c8283dbd 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -7691,20 +7691,14 @@ static void checkArithmeticNull(Sema &S, ExprResult &LHS, ExprResult &RHS, bool LHSNull = isa(LHS.get()->IgnoreParenImpCasts()); bool RHSNull = isa(RHS.get()->IgnoreParenImpCasts()); - // Detect when a NULL constant is used improperly in an expression. These - // are mainly cases where the null pointer is used as an integer instead - // of a pointer. - if (!LHSNull && !RHSNull) - return; - QualType LHSType = LHS.get()->getType(); QualType RHSType = RHS.get()->getType(); + QualType NonNullType = LHSNull ? RHSType : LHSType; // Avoid analyzing cases where the result will either be invalid (and // diagnosed as such) or entirely valid and not something to warn about. - if (LHSType->isBlockPointerType() || LHSType->isMemberPointerType() || - LHSType->isFunctionType() || RHSType->isBlockPointerType() || - RHSType->isMemberPointerType() || RHSType->isFunctionType()) + if ((!LHSNull && !RHSNull) || NonNullType->isBlockPointerType() || + NonNullType->isMemberPointerType() || NonNullType->isFunctionType()) return; // Comparison operations would not make sense with a null pointer no matter @@ -7718,14 +7712,12 @@ static void checkArithmeticNull(Sema &S, ExprResult &LHS, ExprResult &RHS, // The rest of the operations only make sense with a null pointer // if the other expression is a pointer. - if (LHSNull == RHSNull || LHSType->isAnyPointerType() || - LHSType->canDecayToPointerType() || RHSType->isAnyPointerType() || - RHSType->canDecayToPointerType()) + if (LHSNull == RHSNull || NonNullType->isAnyPointerType() || + NonNullType->canDecayToPointerType()) return; S.Diag(Loc, diag::warn_null_in_comparison_operation) - << LHSNull /* LHS is NULL */ - << (LHSNull ? RHS.get()->getType() : LHS.get()->getType()) + << LHSNull /* LHS is NULL */ << NonNullType << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); } /// CreateBuiltinBinOp - Creates a new built-in binary operation with