diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index 57b23e96a..4f4e85b15 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -836,6 +836,13 @@ static void compilePrecedence2(Token *&tok, AST_state& state) compileUnaryOp(tok, state, nullptr); } tok = tok->link()->next(); + } else if (iscast(tok) && Token::simpleMatch(tok->link(), ") {") && Token::simpleMatch(tok->link()->linkAt(1), "} [")) { + Token *cast = tok; + tok = tok->link()->next(); + Token *tok1 = tok; + compileUnaryOp(tok, state, compileExpression); + cast->astOperand1(tok1); + tok = tok1->link()->next(); } else if (state.cpp && tok->str() == "{" && iscpp11init(tok)) { if (Token::simpleMatch(tok, "{ }")) compileUnaryOp(tok, state, compileExpression); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 334f88bcd..7178fcc34 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -7426,8 +7426,9 @@ private: ASSERT_EQUALS("ac5[new(=", testAst("a = (b*)(new c[5]);")); // #8786 ASSERT_EQUALS("a(4+", testAst("(int)(a) + 4;")); - // TODO: This AST is incomplete however it's very weird syntax (taken from clang test suite) - ASSERT_EQUALS("a&(", testAst("(int (**)[i]){&a}[0][1][5] = 0;")); + // (cast){data}[index] + ASSERT_EQUALS("a&{(0[1[5[0=", testAst("(int (**)[i]){&a}[0][1][5] = 0;")); + ASSERT_EQUALS("ab12,{(0[,(", testAst("a(b, (int []){1,2}[0]);")); ASSERT_EQUALS("n0=", testAst("TrivialDefCtor{[2][2]}[1][1].n = 0;")); ASSERT_EQUALS("aT12,3,{1[=", testAst("a = T{1, 2, 3}[1];"));