Skip to content

Commit 2e6d78b

Browse files
committed
Fixed danmar#8184 (Syntax error: case outside switch)
1 parent 4bd251a commit 2e6d78b

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

lib/tokenize.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8207,6 +8207,16 @@ const Token * Tokenizer::findGarbageCode() const
82078207
}
82088208
}
82098209

8210+
// case keyword must be inside switch
8211+
for (const Token *tok = tokens(); tok; tok = tok->next()) {
8212+
if (Token::simpleMatch(tok, "switch (") && Token::simpleMatch(tok->linkAt(1), ") {"))
8213+
tok = tok->linkAt(1)->linkAt(1);
8214+
else if (tok->str() == "(")
8215+
tok = tok->link();
8216+
else if (tok->str() == "case")
8217+
return tok;
8218+
}
8219+
82108220
for (const Token *tok = tokens(); tok ; tok = tok->next()) {
82118221
if (!Token::simpleMatch(tok, "for (")) // find for loops
82128222
continue;

test/testgarbage.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ class TestGarbage : public TestFixture {
224224
TEST_CASE(templateSimplifierCrashes);
225225
TEST_CASE(syntaxErrorFirstToken); // Make sure syntax errors are detected and reported
226226
TEST_CASE(syntaxErrorLastToken); // Make sure syntax errors are detected and reported
227+
TEST_CASE(syntaxErrorCase);
227228
TEST_CASE(enumTrailingComma);
228229
}
229230

@@ -1482,6 +1483,11 @@ class TestGarbage : public TestFixture {
14821483
// ASSERT_THROW( , InternalError)
14831484
}
14841485

1486+
void syntaxErrorCase() {
1487+
// case must be inside switch block
1488+
ASSERT_THROW(checkCode("void f() { switch (a) {}; case 1: }"), InternalError);
1489+
}
1490+
14851491
void enumTrailingComma() {
14861492
ASSERT_THROW(checkCode("enum ssl_shutdown_t {ssl_shutdown_none = 0,ssl_shutdown_close_notify = , } ;"), InternalError); // #8079
14871493
}

0 commit comments

Comments
 (0)