diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index 279a4f3c8..2d09550b6 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -895,6 +895,8 @@ static Token * createAstAtToken(Token *tok, bool cpp) continue; if (tok->next() == endToken) break; + if (Token::simpleMatch(tok, "( { .")) + break; const Token * const endToken2 = tok->linkAt(1); for (; tok && tok != endToken && tok != endToken2; tok = tok ? tok->next() : NULL) tok = createAstAtToken(tok, cpp); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index e18dee297..e266792c8 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -10755,6 +10755,9 @@ private: ASSERT_EQUALS("QT_WA{{,( QT_WA{{,( x1=", testAst("QT_WA({},{x=0;});" // don't hang "QT_WA({x=1;},{x=2;});")); + ASSERT_EQUALS("xMACROtypeT=value1=,{({=", + testAst("x = { MACRO( { .type=T, .value=1 } ) }")); // dont hang: MACRO({..}) + // function pointer TODO_ASSERT_EQUALS("todo", "va_argapvoid((,(*0=", testAst("*va_arg(ap, void(**) ()) = 0;"));