diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index a5d882e12..754d5671c 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -5037,6 +5037,10 @@ void Tokenizer::removeMacrosInGlobalScope() if (tok2 && tok2->str() == "(") tok2 = tok2->link()->next(); + // Several unknown macros... + while (Token::Match(tok2, "%type% (") && tok2->isUpperCaseName()) + tok2 = tok2->linkAt(1)->next(); + if (Token::Match(tok, "%name% (") && Token::Match(tok2, "%name% *|&|::|<| %name%") && !Token::Match(tok2, "namespace|class|struct|union")) unknownMacroError(tok); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 0556e0e1a..77f6c64e6 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -6419,6 +6419,13 @@ private: "};"), InternalError); ASSERT_THROW(tokenizeAndStringify("MACRO(test) void test() { }"), InternalError); // #7931 + + ASSERT_THROW(tokenizeAndStringify("BEGIN_MESSAGE_MAP(CSetProgsAdvDlg, CResizableStandAloneDialog)\n" + " ON_BN_CLICKED(IDC_ADDTOOL, OnBnClickedAddtool)\n" + "END_MESSAGE_MAP()\n" + "\n" + "BOOL CSetProgsAdvDlg::OnInitDialog() {}"), + InternalError); } void removeMacroInVarDecl() { // #4304