Unreachable code; better handling of throw in C code
This commit is contained in:
parent
a21c81365d
commit
cf8a423636
|
@ -784,7 +784,7 @@ void CheckOther::checkUnreachableCode()
|
||||||
tok = tok->link();
|
tok = tok->link();
|
||||||
else if (Token::Match(tok, "break|continue ;"))
|
else if (Token::Match(tok, "break|continue ;"))
|
||||||
secondBreak = tok->tokAt(2);
|
secondBreak = tok->tokAt(2);
|
||||||
else if (Token::Match(tok, "[;{}:] return|throw")) {
|
else if (Token::Match(tok, "[;{}:] return|throw") && tok->next()->isKeyword()) {
|
||||||
if (Token::simpleMatch(tok->astParent(), "?"))
|
if (Token::simpleMatch(tok->astParent(), "?"))
|
||||||
continue;
|
continue;
|
||||||
tok = tok->next(); // tok should point to return or throw
|
tok = tok->next(); // tok should point to return or throw
|
||||||
|
@ -809,7 +809,7 @@ void CheckOther::checkUnreachableCode()
|
||||||
const bool inconclusive = secondBreak && (secondBreak->linenr() - 1 > secondBreak->previous()->linenr());
|
const bool inconclusive = secondBreak && (secondBreak->linenr() - 1 > secondBreak->previous()->linenr());
|
||||||
|
|
||||||
if (secondBreak && (printInconclusive || !inconclusive)) {
|
if (secondBreak && (printInconclusive || !inconclusive)) {
|
||||||
if (Token::Match(secondBreak, "continue|goto|throw|return")) {
|
if (Token::Match(secondBreak, "continue|goto|throw|return") && secondBreak->isKeyword()) {
|
||||||
duplicateBreakError(secondBreak, inconclusive);
|
duplicateBreakError(secondBreak, inconclusive);
|
||||||
tok = Token::findmatch(secondBreak, "[}:]");
|
tok = Token::findmatch(secondBreak, "[}:]");
|
||||||
} else if (secondBreak->str() == "break") { // break inside switch as second break statement should not issue a warning
|
} else if (secondBreak->str() == "break") { // break inside switch as second break statement should not issue a warning
|
||||||
|
|
|
@ -3557,6 +3557,12 @@ private:
|
||||||
"}", nullptr, false, false, false);
|
"}", nullptr, false, false, false);
|
||||||
ASSERT_EQUALS("[test.cpp:3]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:3]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout.str());
|
||||||
|
|
||||||
|
check("int foo() {\n"
|
||||||
|
" throw = 0;\n"
|
||||||
|
" return 1;\n"
|
||||||
|
"}", "test.c", false, false, false);
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
check("int foo() {\n"
|
check("int foo() {\n"
|
||||||
" return 0;\n"
|
" return 0;\n"
|
||||||
" return 1;\n"
|
" return 1;\n"
|
||||||
|
|
Loading…
Reference in New Issue