diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index d4755fc1260..68144c156dc 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -8978,8 +8978,12 @@ void Tokenizer::findGarbageCode() const syntaxError(tok->next()); if (Token::Match(tok, "%name% %op% %name%") && !tok->isKeyword() && tok->next()->isIncDecOp()) syntaxError(tok->next()); - if (!tok->isKeyword() && Token::Match(tok, "%name% .|-> %name% %name%") && !tok->tokAt(2)->isKeyword()) - syntaxError(tok); + if (!tok->isKeyword() && Token::Match(tok, "%name% .|-> %name% %name%") && !tok->tokAt(2)->isKeyword()) { + if (tok->tokAt(3)->isUpperCaseName()) + unknownMacroError(tok->tokAt(3)); + else + syntaxError(tok); + } if (Token::Match(tok, "[!|+-/%^~] )|]")) syntaxError(tok); if (Token::Match(tok, "==|!=|<=|>= %comp%") && tok->strAt(-1) != "operator") diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index aafbeafc58f..276ccef466f 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -7668,6 +7668,11 @@ class TestTokenizer : public TestFixture { "}"), SYNTAX); + ASSERT_THROW_INTERNAL(tokenizeAndStringify("void f(T* p) {\n" + " g(p->x TSRMLS_CC);" + "}"), + UNKNOWN_MACRO); + ASSERT_NO_THROW(tokenizeAndStringify("S* g = ::new(ptr) S();")); // #12552 ASSERT_NO_THROW(tokenizeAndStringify("void f(int* p) { return ::delete p; }"));