summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2020-08-06 13:32:43 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2020-08-14 18:03:06 +0200
commite67657d5211f6e95ddf8bd621108608573b00d5d (patch)
tree66724101dbd95721714bd40fcb4861663432774c /compilerplugins
parent186def8f48e273c3a3b4d23b3ab2efd0d8664731 (diff)
loplugin:simplifybool more
look for expressions like !(a && !b) which can be expanded out Change-Id: I72515a9638762b050f9a258c08da39ebfa2ef8e7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100579 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'compilerplugins')
-rw-r--r--compilerplugins/clang/simplifybool.cxx12
1 files changed, 8 insertions, 4 deletions
diff --git a/compilerplugins/clang/simplifybool.cxx b/compilerplugins/clang/simplifybool.cxx
index 89c262f54c98..d2e53d63aae9 100644
--- a/compilerplugins/clang/simplifybool.cxx
+++ b/compilerplugins/clang/simplifybool.cxx
@@ -293,11 +293,17 @@ bool SimplifyBool::VisitUnaryOperator(UnaryOperator const * expr) {
}
else if (binaryOp->isLogicalOp())
{
- auto containsNegationOrComparison = [](Expr const * expr) {
+ // if we find a negation condition inside, it is definitely better
+ // to expand it out
+ bool foundLNot = false;
+ auto containsNegationOrComparison = [&](Expr const * expr) {
expr = ignoreParenImpCastAndComma(expr);
if (auto unaryOp = dyn_cast<UnaryOperator>(expr))
if (unaryOp->getOpcode() == UO_LNot)
+ {
+ foundLNot = true;
return expr;
+ }
if (auto binaryOp = dyn_cast<BinaryOperator>(expr))
if (binaryOp->isComparisonOp())
return expr;
@@ -308,9 +314,7 @@ bool SimplifyBool::VisitUnaryOperator(UnaryOperator const * expr) {
};
auto lhs = containsNegationOrComparison(binaryOp->getLHS());
auto rhs = containsNegationOrComparison(binaryOp->getRHS());
- if (!lhs || !rhs)
- return true;
- if (lhs || rhs)
+ if (foundLNot || (lhs && rhs))
report(
DiagnosticsEngine::Warning,
("logical negation of logical op containing negation, can be simplified"),