]> granicus.if.org Git - clang/commitdiff
The current warning in -Wnull-arithmetic for comparisons between NULL and non-pointer...
authorRichard Trieu <rtrieu@google.com>
Thu, 11 Aug 2011 22:38:21 +0000 (22:38 +0000)
committerRichard Trieu <rtrieu@google.com>
Thu, 11 Aug 2011 22:38:21 +0000 (22:38 +0000)
Old warning:

warning: use of NULL in arithmetic operation [-Wnull-arithmetic]
  return 10 <= NULL;
            ^  ~~~~

New warning:

warning: comparison between NULL and non-pointer ('int' and NULL) [-Wnull-arithmetic]
  return 10 <= NULL;
         ~~ ^  ~~~~

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
test/SemaCXX/null_in_arithmetic_ops.cpp

index 81fb8b651e2cc1948ae28c5864fe3d811c22c3e1..bccf4c35beeef0dbedc4e269a4154f9d875080c4 100644 (file)
@@ -3163,6 +3163,10 @@ def warn_comparison_of_mixed_enum_types : Warning<
 def warn_null_in_arithmetic_operation : Warning<
   "use of NULL in arithmetic operation">,
   InGroup<DiagGroup<"null-arithmetic">>;
+def warn_null_in_comparison_operation : Warning<
+  "comparison between NULL and non-pointer "
+  "%select{(%1 and NULL)|(NULL and %1)}0">,
+  InGroup<DiagGroup<"null-arithmetic">>;
 
 def err_invalid_this_use : Error<
   "invalid use of 'this' outside of a nonstatic member function">;
index d78c4962a48248d8275500815e23e6b36b65fe2e..efc05de90ecf68dcdb8db49dcb8cdec1b692e4d2 100644 (file)
@@ -7626,9 +7626,10 @@ ExprResult Sema::CreateBuiltinBinOp(SourceLocation OpLoc,
             !LeftType->canDecayToPointerType() &&
             !RightType->isAnyPointerType() &&
             !RightType->canDecayToPointerType()) {
-          Diag(OpLoc, diag::warn_null_in_arithmetic_operation)
-            << (LeftNull ? lhs.get()->getSourceRange()
-                         : rhs.get()->getSourceRange());
+          Diag(OpLoc, diag::warn_null_in_comparison_operation)
+            << LeftNull /* LHS is NULL */
+            << (LeftNull ? rhs.get()->getType() : lhs.get()->getType())
+            << lhs.get()->getSourceRange() << rhs.get()->getSourceRange();
         }
       }
     }
index fab6f10ab7852278c4ba507a3e01ece36cbb397d..24590ce633f28b9267e2f500cb086dfae3c90104 100644 (file)
@@ -64,12 +64,12 @@ void f() {
   a |= NULL; // expected-warning{{use of NULL in arithmetic operation}}
   a ^= NULL; // expected-warning{{use of NULL in arithmetic operation}}
 
-  b = a < NULL || NULL < a; // expected-warning 2{{use of NULL in arithmetic operation}}
-  b = a > NULL || NULL > a; // expected-warning 2{{use of NULL in arithmetic operation}}
-  b = a <= NULL || NULL <= a; // expected-warning 2{{use of NULL in arithmetic operation}}
-  b = a >= NULL || NULL >= a; // expected-warning 2{{use of NULL in arithmetic operation}}
-  b = a == NULL || NULL == a; // expected-warning 2{{use of NULL in arithmetic operation}}
-  b = a != NULL || NULL != a; // expected-warning 2{{use of NULL in arithmetic operation}}
+  b = a < NULL || a > NULL; // expected-warning 2{{comparison between NULL and non-pointer ('int' and NULL)}}
+  b = NULL < a || NULL > a; // expected-warning 2{{comparison between NULL and non-pointer (NULL and 'int')}}
+  b = a <= NULL || a >= NULL; // expected-warning 2{{comparison between NULL and non-pointer ('int' and NULL)}}
+  b = NULL <= a || NULL >= a; // expected-warning 2{{comparison between NULL and non-pointer (NULL and 'int')}}
+  b = a == NULL || a != NULL; // expected-warning 2{{comparison between NULL and non-pointer ('int' and NULL)}}
+  b = NULL == a || NULL != a; // expected-warning 2{{comparison between NULL and non-pointer (NULL and 'int')}}
 
   b = &a < NULL || NULL < &a || &a > NULL || NULL > &a;
   b = &a <= NULL || NULL <= &a || &a >= NULL || NULL >= &a;
@@ -82,7 +82,7 @@ void f() {
   b = NULL <= NULL || NULL >= NULL;
   b = NULL == NULL || NULL != NULL;
 
-  b = ((NULL)) != a;  // expected-warning{{use of NULL in arithmetic operation}}
+  b = ((NULL)) != a;  // expected-warning{{comparison between NULL and non-pointer (NULL and 'int')}}
 
   // Check that even non-standard pointers don't warn.
   b = c == NULL || NULL == c || c != NULL || NULL != c;