diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2020-04-28 10:16:56 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2020-04-28 13:39:01 +0200 |
commit | 3d6214624128626c056b0a15ff6d654f57f149d9 (patch) | |
tree | caf2802d09fd62a609902d0b8b3aa0723bc395a1 /compilerplugins | |
parent | 1705fbe9daac56ee9bea8d8fd7c7f57e2bec49b5 (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.cxx | 14 | ||||
-rw-r--r-- | compilerplugins/clang/test/cppunitassertequals.cxx | 11 | ||||
-rw-r--r-- | compilerplugins/clang/test/cppunitassertequals.hxx | 5 |
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 |