]> granicus.if.org Git - clang/commitdiff
Change checkArithmeticNull() to use a NonNullType, instead of checking both the
authorRichard Trieu <rtrieu@google.com>
Thu, 15 Sep 2011 23:51:29 +0000 (23:51 +0000)
committerRichard Trieu <rtrieu@google.com>
Thu, 15 Sep 2011 23:51:29 +0000 (23:51 +0000)
LHSType and RHSType for everything.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@139878 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp

index 16b55f1aee4d40c66f5c2ffb7570e944e9690c99..73c8283dbd0c050b7e747e549e054e3b7f0e5801 100644 (file)
@@ -7691,20 +7691,14 @@ static void checkArithmeticNull(Sema &S, ExprResult &LHS, ExprResult &RHS,
   bool LHSNull = isa<GNUNullExpr>(LHS.get()->IgnoreParenImpCasts());
   bool RHSNull = isa<GNUNullExpr>(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