Tokenizer::findGarbageCode: detect wrong struct declaration
This commit is contained in:
parent
a197e94573
commit
895a96f9dd
|
@ -10224,6 +10224,22 @@ void Tokenizer::findGarbageCode() const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// invalid struct declaration
|
||||||
|
for (const Token *tok = tokens(); tok; tok = tok->next()) {
|
||||||
|
if (Token::Match(tok, "struct|class|enum %name%| {") && (!tok->previous() || Token::Match(tok->previous(), "[;{}]"))) {
|
||||||
|
const Token *tok2 = tok->linkAt(tok->next()->isName() ? 2 : 1);
|
||||||
|
if (Token::Match(tok2, "} %op%")) {
|
||||||
|
tok2 = tok2->next();
|
||||||
|
if (!Token::Match(tok2, "*|&|&&"))
|
||||||
|
syntaxError(tok2, "Unexpected token '" + tok2->str() + "'");
|
||||||
|
while (Token::Match(tok2, "*|&|&&"))
|
||||||
|
tok2 = tok2->next();
|
||||||
|
if (!Token::Match(tok2, "%name%"))
|
||||||
|
syntaxError(tok2, "Unexpected token '" + tok2->str() + "'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Keywords in global scope
|
// Keywords in global scope
|
||||||
static const std::unordered_set<std::string> nonGlobalKeywords{"break",
|
static const std::unordered_set<std::string> nonGlobalKeywords{"break",
|
||||||
"continue",
|
"continue",
|
||||||
|
|
|
@ -47,6 +47,7 @@ private:
|
||||||
TEST_CASE(wrong_syntax4); // #3618
|
TEST_CASE(wrong_syntax4); // #3618
|
||||||
TEST_CASE(wrong_syntax_if_macro); // #2518 - if MACRO()
|
TEST_CASE(wrong_syntax_if_macro); // #2518 - if MACRO()
|
||||||
TEST_CASE(wrong_syntax_class_x_y); // #3585 - class x y { };
|
TEST_CASE(wrong_syntax_class_x_y); // #3585 - class x y { };
|
||||||
|
TEST_CASE(wrong_syntax_anonymous_struct);
|
||||||
TEST_CASE(syntax_case_default);
|
TEST_CASE(syntax_case_default);
|
||||||
TEST_CASE(garbageCode1);
|
TEST_CASE(garbageCode1);
|
||||||
TEST_CASE(garbageCode2); // #4300
|
TEST_CASE(garbageCode2); // #4300
|
||||||
|
@ -403,6 +404,11 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wrong_syntax_anonymous_struct() {
|
||||||
|
ASSERT_THROW(checkCode("struct { int x; } = {0};"), InternalError);
|
||||||
|
ASSERT_THROW(checkCode("struct { int x; } * = {0};"), InternalError);
|
||||||
|
}
|
||||||
|
|
||||||
void syntax_case_default() {
|
void syntax_case_default() {
|
||||||
ASSERT_THROW(checkCode("void f() {switch (n) { case: z(); break;}}"), InternalError);
|
ASSERT_THROW(checkCode("void f() {switch (n) { case: z(); break;}}"), InternalError);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue