summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2019-06-28 11:07:54 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2019-07-01 10:23:53 +0200
commit9fbedb7929936a45967ae49bc15b985f95e2ebd3 (patch)
treebf7fdd4e32e20b87479f083907633a8e63aab29f /compilerplugins
parent0f55c0afbdc1ed60bfa6f4af8f3ccfc0c90db2e4 (diff)
improve loplugin:blockblock
look for nested blocks where the inner block also contains a break statement. Change-Id: I1e5b6ca4c42b995c9479a68b34a1e2f1eb015f57 Reviewed-on: https://gerrit.libreoffice.org/74946 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'compilerplugins')
-rw-r--r--compilerplugins/clang/blockblock.cxx25
-rw-r--r--compilerplugins/clang/test/blockblock.cxx16
2 files changed, 41 insertions, 0 deletions
diff --git a/compilerplugins/clang/blockblock.cxx b/compilerplugins/clang/blockblock.cxx
index 8405609af3df..f1d9ec7a9d61 100644
--- a/compilerplugins/clang/blockblock.cxx
+++ b/compilerplugins/clang/blockblock.cxx
@@ -43,6 +43,7 @@ public:
}
bool VisitCompoundStmt(CompoundStmt const * );
+ bool VisitCaseStmt(CaseStmt const * );
};
bool BlockBlock::VisitCompoundStmt(CompoundStmt const * compound)
@@ -74,6 +75,30 @@ bool BlockBlock::VisitCompoundStmt(CompoundStmt const * compound)
return true;
}
+bool BlockBlock::VisitCaseStmt(CaseStmt const * caseStmt)
+{
+ if (ignoreLocation(caseStmt))
+ return true;
+ auto compoundStmt = dyn_cast<CompoundStmt>(caseStmt->getSubStmt());
+ if (!compoundStmt)
+ return true;
+ if (compoundStmt->size() != 2)
+ return true;
+ auto it = compoundStmt->body_begin();
+ auto inner1 = *it;
+ if (!isa<CompoundStmt>(inner1))
+ return true;
+ ++it;
+ if (!isa<BreakStmt>(*it))
+ return true;
+ report(
+ DiagnosticsEngine::Warning,
+ "block directly inside block",
+ compat::getBeginLoc(compoundStmt))
+ << compoundStmt->getSourceRange();
+ return true;
+}
+
loplugin::Plugin::Registration< BlockBlock > blockblock("blockblock", true);
}
diff --git a/compilerplugins/clang/test/blockblock.cxx b/compilerplugins/clang/test/blockblock.cxx
index bd48ed7d38fa..422430f9c1cd 100644
--- a/compilerplugins/clang/test/blockblock.cxx
+++ b/compilerplugins/clang/test/blockblock.cxx
@@ -21,6 +21,22 @@ int f(bool b1, bool b2) {
return 1;
}
+void foo(int x)
+{
+ switch (x)
+ {
+ case 1: break;
+ case 2: {} break;
+ case 3:
+ { // expected-error {{block directly inside block [loplugin:blockblock]}}
+ {
+ }
+ break;
+ }
+ }
+}
+
+
int main() { // expected-error {{block directly inside block [loplugin:blockblock]}}
{ // expected-note {{inner block here [loplugin:blockblock]}}
int x = 1;