Commit da6eb844 authored by Roberto Raggi's avatar Roberto Raggi
Browse files

Fixes: Parsing of simple id expressions (e.g. a;).

AutoTest: included
parent 78f1fca9
......@@ -1760,7 +1760,7 @@ bool Parser::parseReturnStatement(StatementAST *&node)
return false;
}
bool Parser::maybeFunctionCall(SimpleDeclarationAST *simpleDecl)
bool Parser::maybeFunctionCall(SimpleDeclarationAST *simpleDecl) const
{
if (! simpleDecl)
return false;
......@@ -1798,6 +1798,17 @@ bool Parser::maybeFunctionCall(SimpleDeclarationAST *simpleDecl)
return true;
}
bool Parser::maybeSimpleExpression(SimpleDeclarationAST *simpleDecl) const
{
if (! simpleDecl->declarators) {
SpecifierAST *spec = simpleDecl->decl_specifier_seq;
if (spec && ! spec->next && spec->asNamedTypeSpecifier()) {
return true;
}
}
return false;
}
bool Parser::parseExpressionOrDeclarationStatement(StatementAST *&node)
{
if (LA() == T_SEMICOLON)
......@@ -1810,7 +1821,9 @@ bool Parser::parseExpressionOrDeclarationStatement(StatementAST *&node)
SimpleDeclarationAST *simpleDecl = 0;
if (stmt->declaration)
simpleDecl = stmt->declaration->asSimpleDeclaration();
if (simpleDecl && simpleDecl->decl_specifier_seq && ! maybeFunctionCall(simpleDecl)) {
if (simpleDecl && simpleDecl->decl_specifier_seq &&
! maybeFunctionCall(simpleDecl) && ! maybeSimpleExpression(simpleDecl)) {
unsigned end_of_declaration_statement = cursor();
rewind(start);
StatementAST *expression = 0;
......@@ -1827,6 +1840,7 @@ bool Parser::parseExpressionOrDeclarationStatement(StatementAST *&node)
return true;
}
}
blockErrors(blocked);
rewind(start);
return parseExpressionStatement(node);
......
......@@ -220,7 +220,8 @@ public:
void match(int kind, unsigned *token);
bool maybeFunctionCall(SimpleDeclarationAST *simpleDecl);
bool maybeFunctionCall(SimpleDeclarationAST *simpleDecl) const;
bool maybeSimpleExpression(SimpleDeclarationAST *simpleDecl) const;
private:
bool switchTemplateArguments(bool templateArguments);
......
......@@ -31,6 +31,7 @@ public:
private slots:
void if_statement();
void if_else_statement();
void cpp_initializer();
};
void tst_AST::if_statement()
......@@ -49,6 +50,16 @@ void tst_AST::if_statement()
QVERIFY(stmt->statement != 0);
QCOMPARE(stmt->else_token, 0U);
QVERIFY(stmt->else_statement == 0);
// check the `then' statement
ExpressionStatementAST *then_stmt = stmt->statement->asExpressionStatement();
QVERIFY(then_stmt != 0);
QVERIFY(then_stmt->expression != 0);
QCOMPARE(then_stmt->semicolon_token, 6U);
SimpleNameAST *id_expr = then_stmt->expression->asSimpleName();
QVERIFY(id_expr != 0);
QCOMPARE(id_expr->identifier_token, 5U);
}
void tst_AST::if_else_statement()
......@@ -69,5 +80,13 @@ void tst_AST::if_else_statement()
QVERIFY(stmt->else_statement != 0);
}
void tst_AST::cpp_initializer()
{
QSharedPointer<TranslationUnit> unit(parseStatement("QFileInfo fileInfo(foo);"));
AST *ast = unit->ast();
QVERIFY(ast != 0);
}
QTEST_APPLESS_MAIN(tst_AST)
#include "tst_ast.moc"
DEFINES += HAVE_QT CPLUSPLUS_WITH_NAMESPACE
INCLUDEPATH += $$PWD/../../../../shared/cplusplus
DEPENDPATH += $$INCLUDEPATH .
LIBS += -L$$PWD -lCPlusPlusTestSupport
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment