summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2020-04-28 10:16:56 +0200
committerStephan Bergmann <sbergman@redhat.com>2020-04-28 13:39:01 +0200
commit3d6214624128626c056b0a15ff6d654f57f149d9 (patch)
treecaf2802d09fd62a609902d0b8b3aa0723bc395a1 /compilerplugins
parent1705fbe9daac56ee9bea8d8fd7c7f57e2bec49b5 (diff)
Silence loplugin:cppunitassertequals when comparing pointer against nullptr
I need that for another upcoming commit. Change-Id: If7e567c731e454070bf8ad9efb5c2f28ff9049e6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93031 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'compilerplugins')
-rw-r--r--compilerplugins/clang/cppunitassertequals.cxx14
-rw-r--r--compilerplugins/clang/test/cppunitassertequals.cxx11
-rw-r--r--compilerplugins/clang/test/cppunitassertequals.hxx5
3 files changed, 24 insertions, 6 deletions
diff --git a/compilerplugins/clang/cppunitassertequals.cxx b/compilerplugins/clang/cppunitassertequals.cxx
index 930ecdd74e13..3647540baf8a 100644
--- a/compilerplugins/clang/cppunitassertequals.cxx
+++ b/compilerplugins/clang/cppunitassertequals.cxx
@@ -46,7 +46,8 @@ private:
void checkExpr(
SourceRange range, StringRef name, Expr const * expr, bool negated);
- void reportEquals(SourceRange range, StringRef name, bool negative);
+ void reportEquals(
+ SourceRange range, StringRef name, bool negative, Expr const * lhs, Expr const * rhs);
bool isCompileTimeConstant(Expr const * expr);
};
@@ -187,7 +188,7 @@ void CppunitAssertEquals::checkExpr(
if (auto const e = dyn_cast<BinaryOperator>(expr)) {
auto const op = e->getOpcode();
if ((!negated && op == BO_EQ) || (negated && op == BO_NE)) {
- reportEquals(range, name, op == BO_NE);
+ reportEquals(range, name, op == BO_NE, e->getLHS(), e->getRHS());
return;
}
#if 0 // TODO: enable later
@@ -206,7 +207,7 @@ void CppunitAssertEquals::checkExpr(
if ((!negated && op == OO_EqualEqual)
|| (negated && op == OO_ExclaimEqual))
{
- reportEquals(range, name, op == OO_ExclaimEqual);
+ reportEquals(range, name, op == OO_ExclaimEqual, e->getArg(0), e->getArg(1));
return;
}
return;
@@ -214,8 +215,13 @@ void CppunitAssertEquals::checkExpr(
}
void CppunitAssertEquals::reportEquals(
- SourceRange range, StringRef name, bool negative)
+ SourceRange range, StringRef name, bool negative, Expr const * lhs, Expr const * rhs)
{
+ if (lhs->IgnoreImpCasts()->getType()->isNullPtrType()
+ != rhs->IgnoreImpCasts()->getType()->isNullPtrType())
+ {
+ return;
+ }
report(
DiagnosticsEngine::Warning,
("rather call"
diff --git a/compilerplugins/clang/test/cppunitassertequals.cxx b/compilerplugins/clang/test/cppunitassertequals.cxx
index 9448ddc02950..d0825000be07 100644
--- a/compilerplugins/clang/test/cppunitassertequals.cxx
+++ b/compilerplugins/clang/test/cppunitassertequals.cxx
@@ -19,7 +19,9 @@
#define TEST1 CPPUNIT_ASSERT(b1 == b2)
#define TEST2(x) x
-void test(bool b1, bool b2, OUString const & s1, OUString const & s2, T t) {
+void test(
+ bool b1, bool b2, OUString const & s1, OUString const & s2, T t, void * p, std::nullptr_t n)
+{
CppUnit::Asserter::failIf(b1,"");
#if 0 // TODO: enable later
CPPUNIT_ASSERT(b1 && b2); // expected-error {{rather split into two CPPUNIT_ASSERT [loplugin:cppunitassertequals]}}
@@ -50,6 +52,13 @@ void test(bool b1, bool b2, OUString const & s1, OUString const & s2, T t) {
CPPUNIT_ASSERT(operator ==(s1, s1));
CPPUNIT_ASSERT(t.operator ==(t));
+ // `P == nullptr` for P of pointer type is awkward to write with CPPUNIT_ASSERT_EQUAL, and the
+ // actual pointer values that would be printed if CPPUNIT_ASSERT_EQUAL failed would likey not be
+ // very meaningful, so let it use CPPUNIT_ASSERT (but stick to CPPUNIT_ASSERT_EQUAL for
+ // consistency in the unlikely case that P is of type std::nullptr_t):
+ CPPUNIT_ASSERT(p == nullptr);
+ CPPUNIT_ASSERT(n == nullptr); // expected-error {{rather call CPPUNIT_ASSERT_EQUAL (or rewrite as an explicit operator == call when the operator itself is the topic) [loplugin:cppunitassertequals]}}
+
// There might even be good reasons(?) not to warn inside explicit casts:
CPPUNIT_ASSERT(bool(b1 && b2));
CPPUNIT_ASSERT(bool(b1 == b2));
diff --git a/compilerplugins/clang/test/cppunitassertequals.hxx b/compilerplugins/clang/test/cppunitassertequals.hxx
index b844c8387e67..7a14886ad9eb 100644
--- a/compilerplugins/clang/test/cppunitassertequals.hxx
+++ b/compilerplugins/clang/test/cppunitassertequals.hxx
@@ -12,11 +12,14 @@
#include "sal/config.h"
+#include <cstddef>
+
#include "rtl/ustring.hxx"
struct T { bool operator ==(T); };
-void test(bool b1, bool b2, OUString const & s1, OUString const & s2, T t);
+void test(
+ bool b1, bool b2, OUString const & s1, OUString const & s2, T t, void * p, std::nullptr_t n);
#endif