Skip to content

Commit 3e6540c

Browse files
committed
Fixed #10523 (FP: missingReturn with nested switch statements)
1 parent bd63882 commit 3e6540c

2 files changed

Lines changed: 22 additions & 4 deletions

File tree

lib/checkfunctions.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -303,9 +303,13 @@ static const Token *checkMissingReturnScope(const Token *tok, const Library &lib
303303
// find reachable break / !default
304304
bool hasDefault = false;
305305
bool reachable = false;
306-
for (const Token *switchToken = tok->link(); switchToken != tok; switchToken = switchToken->next()) {
307-
if (reachable && Token::simpleMatch(switchToken, "break ;"))
308-
return switchToken;
306+
for (const Token *switchToken = tok->link()->next(); switchToken != tok; switchToken = switchToken->next()) {
307+
if (reachable && Token::simpleMatch(switchToken, "break ;")) {
308+
if (Token::simpleMatch(switchToken->previous(), "}") && !checkMissingReturnScope(switchToken->previous(), library))
309+
reachable = false;
310+
else
311+
return switchToken;
312+
}
309313
if (switchToken->isKeyword() && Token::Match(switchToken, "return|throw"))
310314
reachable = false;
311315
if (Token::Match(switchToken, "%name% (") && library.isnoreturn(switchToken))
@@ -314,7 +318,7 @@ static const Token *checkMissingReturnScope(const Token *tok, const Library &lib
314318
reachable = true;
315319
if (Token::simpleMatch(switchToken, "default :"))
316320
hasDefault = true;
317-
else if (switchToken->str() == "{" && switchToken->scope()->isLoopScope())
321+
else if (switchToken->str() == "{" && (switchToken->scope()->isLoopScope() || switchToken->scope()->type == Scope::ScopeType::eSwitch))
318322
switchToken = switchToken->link();
319323
}
320324
if (!hasDefault)

test/testfunctions.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1441,6 +1441,20 @@ class TestFunctions : public TestFixture {
14411441
"}");
14421442
ASSERT_EQUALS("", errout.str());
14431443

1444+
check("bool test(unsigned char v1, int v2) {\n"
1445+
" switch (v1) {\n"
1446+
" case 0:\n"
1447+
" switch (v2) {\n"
1448+
" case 48000:\n"
1449+
" break;\n"
1450+
" }\n"
1451+
" return false;\n"
1452+
" default:\n"
1453+
" return true;\n"
1454+
" }\n"
1455+
"}");
1456+
ASSERT_EQUALS("", errout.str());
1457+
14441458
// if/else
14451459
check("int f(int x) {\n"
14461460
" if (x) {\n"

0 commit comments

Comments
 (0)