summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2017-11-13 16:13:16 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2017-11-14 06:43:21 +0100
commit4de9091c6235bdb080cee9c79592c3f0f5ef0fcc (patch)
treec8a20332954c8c8545b8d1f9bd30cd9ef65a4f6b /compilerplugins
parent9050854c35c389466923f0224a36572d36cd471a (diff)
loplugin:flatten loosen condition
the description in the comment was right, but the code was not Change-Id: I7c038e7453f4387d33ec6423c0c55446d6d0df47 Reviewed-on: https://gerrit.libreoffice.org/44680 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'compilerplugins')
-rw-r--r--compilerplugins/clang/flatten.cxx17
-rw-r--r--compilerplugins/clang/test/flatten.cxx18
2 files changed, 26 insertions, 9 deletions
diff --git a/compilerplugins/clang/flatten.cxx b/compilerplugins/clang/flatten.cxx
index 7dc2bf019738..fc0e63438368 100644
--- a/compilerplugins/clang/flatten.cxx
+++ b/compilerplugins/clang/flatten.cxx
@@ -45,7 +45,7 @@ private:
std::string invertCondition(Expr const * condExpr, SourceRange conditionRange);
bool checkOverlap(SourceRange);
- std::stack<bool> mLastStmtInParentStack;
+ Stmt const * lastStmtInCompoundStmt = nullptr;
std::vector<std::pair<char const *, char const *>> mvModifiedRanges;
Stmt const * mElseBranch = nullptr;
};
@@ -107,9 +107,16 @@ bool Flatten::TraverseCompoundStmt(CompoundStmt * compoundStmt)
// var decls in its then block, we cannot de-indent the then block without
// extending the lifetime of some variables, which may be problematic
// ignore if we are part of an if/then/else/if chain
- mLastStmtInParentStack.push(compoundStmt->size() > 0 && isa<IfStmt>(*compoundStmt->body_back()));
+ auto copy = lastStmtInCompoundStmt;
+ if (compoundStmt->size() > 0)
+ lastStmtInCompoundStmt = compoundStmt->body_back();
+ else
+ lastStmtInCompoundStmt = nullptr;
+
bool rv = RecursiveASTVisitor<Flatten>::TraverseCompoundStmt(compoundStmt);
- mLastStmtInParentStack.pop();
+
+ lastStmtInCompoundStmt = copy;
+ return rv;
return rv;
}
@@ -142,7 +149,7 @@ bool Flatten::VisitIfStmt(IfStmt const * ifStmt)
// if the "if" statement is not the last statement in its block, and it contains
// var decls in its then block, we cannot de-indent the then block without
// extending the lifetime of some variables, which may be problematic
- if (!mLastStmtInParentStack.top() || containsVarDecl(ifStmt->getThen()))
+ if (ifStmt != lastStmtInCompoundStmt && containsVarDecl(ifStmt->getThen()))
return true;
if (!rewrite1(ifStmt))
@@ -164,7 +171,7 @@ bool Flatten::VisitIfStmt(IfStmt const * ifStmt)
// if the "if" statement is not the last statement in it's block, and it contains
// var decls in it's else block, we cannot de-indent the else block without
// extending the lifetime of some variables, which may be problematic
- if (!mLastStmtInParentStack.top() || containsVarDecl(ifStmt->getElse()))
+ if (ifStmt != lastStmtInCompoundStmt && containsVarDecl(ifStmt->getElse()))
return true;
if (!rewrite2(ifStmt))
diff --git a/compilerplugins/clang/test/flatten.cxx b/compilerplugins/clang/test/flatten.cxx
index e7b53519de97..30f5c8f41bd9 100644
--- a/compilerplugins/clang/test/flatten.cxx
+++ b/compilerplugins/clang/test/flatten.cxx
@@ -19,12 +19,17 @@ void top1() {
} else {
throw std::exception(); // expected-error {{unconditional throw in else branch, rather invert the condition, throw early, and flatten the normal case [loplugin:flatten]}}
}
- // no warning expected
if (foo() == 1) {
Class aClass;
(void)aClass;
} else {
- throw std::exception();
+ throw std::exception(); // no warning expected
+ }
+ if (foo() == 1) { // expected-note {{if condition here [loplugin:flatten]}}
+ Class aClass;
+ (void)aClass;
+ } else {
+ throw std::exception(); // expected-error {{unconditional throw in else branch, rather invert the condition, throw early, and flatten the normal case [loplugin:flatten]}}
}
}
@@ -34,9 +39,14 @@ void top2() {
} else {
foo();
}
- // no warning expected
if (foo() == 2) {
- throw std::exception();
+ throw std::exception(); // no warning expected
+ } else {
+ Class aClass;
+ (void)aClass;
+ }
+ if (foo() == 2) {
+ throw std::exception(); // expected-error {{unconditional throw in then branch, just flatten the else [loplugin:flatten]}}
} else {
Class aClass;
(void)aClass;