diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index aca971162..cbb97ff99 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -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()) { if (!Token::simpleMatch(tok, "for (")) // find for loops continue; diff --git a/test/testgarbage.cpp b/test/testgarbage.cpp index 1d187b111..f110bb8b9 100644 --- a/test/testgarbage.cpp +++ b/test/testgarbage.cpp @@ -224,6 +224,7 @@ private: TEST_CASE(templateSimplifierCrashes); TEST_CASE(syntaxErrorFirstToken); // 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); } @@ -1482,6 +1483,11 @@ private: // ASSERT_THROW( , InternalError) } + void syntaxErrorCase() { + // case must be inside switch block + ASSERT_THROW(checkCode("void f() { switch (a) {}; case 1: }"), InternalError); + } + void enumTrailingComma() { ASSERT_THROW(checkCode("enum ssl_shutdown_t {ssl_shutdown_none = 0,ssl_shutdown_close_notify = , } ;"), InternalError); // #8079 }