Fixed #8184 (Syntax error: case outside switch)
This commit is contained in:
parent
4bd251a6d9
commit
2e6d78bd08
|
@ -8207,6 +8207,16 @@ const Token * Tokenizer::findGarbageCode() const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// case keyword must be inside switch
|
||||||
|
for (const Token *tok = tokens(); tok; tok = tok->next()) {
|
||||||
|
if (Token::simpleMatch(tok, "switch (") && Token::simpleMatch(tok->linkAt(1), ") {"))
|
||||||
|
tok = tok->linkAt(1)->linkAt(1);
|
||||||
|
else if (tok->str() == "(")
|
||||||
|
tok = tok->link();
|
||||||
|
else if (tok->str() == "case")
|
||||||
|
return tok;
|
||||||
|
}
|
||||||
|
|
||||||
for (const Token *tok = tokens(); tok ; tok = tok->next()) {
|
for (const Token *tok = tokens(); tok ; tok = tok->next()) {
|
||||||
if (!Token::simpleMatch(tok, "for (")) // find for loops
|
if (!Token::simpleMatch(tok, "for (")) // find for loops
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -224,6 +224,7 @@ private:
|
||||||
TEST_CASE(templateSimplifierCrashes);
|
TEST_CASE(templateSimplifierCrashes);
|
||||||
TEST_CASE(syntaxErrorFirstToken); // Make sure syntax errors are detected and reported
|
TEST_CASE(syntaxErrorFirstToken); // Make sure syntax errors are detected and reported
|
||||||
TEST_CASE(syntaxErrorLastToken); // Make sure syntax errors are detected and reported
|
TEST_CASE(syntaxErrorLastToken); // Make sure syntax errors are detected and reported
|
||||||
|
TEST_CASE(syntaxErrorCase);
|
||||||
TEST_CASE(enumTrailingComma);
|
TEST_CASE(enumTrailingComma);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1482,6 +1483,11 @@ private:
|
||||||
// ASSERT_THROW( , InternalError)
|
// ASSERT_THROW( , InternalError)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void syntaxErrorCase() {
|
||||||
|
// case must be inside switch block
|
||||||
|
ASSERT_THROW(checkCode("void f() { switch (a) {}; case 1: }"), InternalError);
|
||||||
|
}
|
||||||
|
|
||||||
void enumTrailingComma() {
|
void enumTrailingComma() {
|
||||||
ASSERT_THROW(checkCode("enum ssl_shutdown_t {ssl_shutdown_none = 0,ssl_shutdown_close_notify = , } ;"), InternalError); // #8079
|
ASSERT_THROW(checkCode("enum ssl_shutdown_t {ssl_shutdown_none = 0,ssl_shutdown_close_notify = , } ;"), InternalError); // #8079
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue