Skip to content

Commit 96955cc

Browse files
authored
Tokenizer: detect unknown macro 'if (x) MACRO }' (#5209)
1 parent 59a8944 commit 96955cc

2 files changed

Lines changed: 14 additions & 0 deletions

File tree

lib/tokenize.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8054,6 +8054,17 @@ void Tokenizer::reportUnknownMacros() const
80548054
}
80558055
}
80568056

8057+
// Report unknown macros before } "{ .. if (x) MACRO }"
8058+
for (const Token *tok = tokens(); tok; tok = tok->next()) {
8059+
if (Token::Match(tok, ")|; %name% }")) {
8060+
const Token* prev = tok->linkAt(2);
8061+
while (Token::simpleMatch(prev, "{"))
8062+
prev = prev->previous();
8063+
if (Token::Match(prev, ";|)"))
8064+
unknownMacroError(tok->next());
8065+
}
8066+
}
8067+
80578068
// Report unknown macros that contain several statements "MACRO(a;b;c)"
80588069
for (const Token *tok = tokens(); tok; tok = tok->next()) {
80598070
if (!Token::Match(tok, "%name% ("))

test/testtokenize.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6843,6 +6843,9 @@ class TestTokenizer : public TestFixture {
68436843
ASSERT_NO_THROW(tokenizeAndStringify(code11));
68446844

68456845
ASSERT_NO_THROW(tokenizeAndStringify("alignas(8) alignas(16) int x;")); // alignas is not unknown macro
6846+
6847+
ASSERT_THROW(tokenizeAndStringify("void foo() { if(x) SYSTEM_ERROR }"), InternalError);
6848+
ASSERT_THROW(tokenizeAndStringify("void foo() { dostuff(); SYSTEM_ERROR }"), InternalError);
68466849
}
68476850

68486851
void findGarbageCode() { // Test Tokenizer::findGarbageCode()

0 commit comments

Comments
 (0)