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>
This commit is contained in:
Noel Grandin
2019-07-01 10:23:53 +02:00
parent 0f55c0afbd
commit 9fbedb7929
2 changed files with 41 additions and 0 deletions
+25
View File
@@ -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);
}
+16
View File
@@ -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;