From 2e6d78bd08c0d3521b69331a4bc356afcd8dc375 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 15 Sep 2017 22:37:31 +0200 Subject: [PATCH] Fixed #8184 (Syntax error: case outside switch) --- lib/tokenize.cpp | 10 ++++++++++ test/testgarbage.cpp | 6 ++++++ 2 files changed, 16 insertions(+) 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 }