aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Basic/DiagnosticSemaKinds.td4
-rw-r--r--lib/Sema/SemaExpr.cpp7
-rw-r--r--test/SemaCXX/null_in_arithmetic_ops.cpp14
3 files changed, 15 insertions, 10 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td
index 81fb8b651e..bccf4c35be 100644
--- a/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/include/clang/Basic/DiagnosticSemaKinds.td
@@ -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">;
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index d78c4962a4..efc05de90e 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -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();
}
}
}
diff --git a/test/SemaCXX/null_in_arithmetic_ops.cpp b/test/SemaCXX/null_in_arithmetic_ops.cpp
index fab6f10ab7..24590ce633 100644
--- a/test/SemaCXX/null_in_arithmetic_ops.cpp
+++ b/test/SemaCXX/null_in_arithmetic_ops.cpp
@@ -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;