From: Richard Trieu Date: Thu, 11 Aug 2011 22:38:21 +0000 (+0000) Subject: The current warning in -Wnull-arithmetic for comparisons between NULL and non-pointer... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=79e610a99b43b9e6df8f9b6b59dbaf5d38a682d3;p=clang The current warning in -Wnull-arithmetic for comparisons between NULL and non-pointers is not very helpful. This patch will update the wording to be more helpful to users. 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 --- 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>; +def warn_null_in_comparison_operation : Warning< + "comparison between NULL and non-pointer " + "%select{(%1 and NULL)|(NULL and %1)}0">, + InGroup>; 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;