AST: Try to handle C++17 syntax 'if (init;expr)'

This commit is contained in:
Daniel Marjamäki 2019-04-12 17:35:06 +02:00
parent 2105247934
commit 1393c1c3a0
2 changed files with 33 additions and 0 deletions

View File

@ -1159,6 +1159,36 @@ static Token * createAstAtToken(Token *tok, bool cpp)
return endPar; return endPar;
} }
if (cpp && Token::Match(tok, "if|switch (")) {
Token *semicolon = nullptr;
Token *tok2;
for (tok2 = tok->tokAt(2); tok2 && tok2->str() != ")"; tok2 = tok2->next()) {
if (tok2->str() == ";") {
if (semicolon)
break;
semicolon = tok2;
}
if (tok2->str() == "(")
tok2 = tok2->link();
}
if (semicolon && tok2 == tok->linkAt(1)) {
tok2 = skipDecl(tok->tokAt(2));
Token *init1 = tok2;
AST_state state1(cpp);
compileExpression(tok2, state1);
tok2 = semicolon->next();
Token *expr1 = tok2;
AST_state state2(cpp);
compileExpression(tok2, state2);
semicolon->astOperand1(findAstTop(init1, semicolon->previous()));
semicolon->astOperand2(findAstTop(expr1, tok2));
tok->next()->astOperand1(tok);
tok->next()->astOperand2(semicolon);
}
}
if (Token::simpleMatch(tok, "( {")) if (Token::simpleMatch(tok, "( {"))
return tok; return tok;

View File

@ -7088,6 +7088,9 @@ private:
ASSERT_EQUALS("a1[\"\"=", testAst("char a[1]=\"\";")); ASSERT_EQUALS("a1[\"\"=", testAst("char a[1]=\"\";"));
ASSERT_EQUALS("charp*(3[char5[3[new=", testAst("char (*p)[3] = new char[5][3];")); ASSERT_EQUALS("charp*(3[char5[3[new=", testAst("char (*p)[3] = new char[5][3];"));
ASSERT_EQUALS("varp=", testAst("const int *var = p;")); ASSERT_EQUALS("varp=", testAst("const int *var = p;"));
// C++17: if (expr1; expr2)
ASSERT_EQUALS("ifx3=y;(", testAst("if (int x=3; y)"));
} }
void astexpr2() { // limit for large expressions void astexpr2() { // limit for large expressions