Commit 20545fd4 authored by Roberto Raggi's avatar Roberto Raggi
Browse files

Fixed more template-id vs expressions ambiguites.

parent 3545c822
......@@ -2927,7 +2927,8 @@ bool Parser::parseNameId(NameAST *&name)
TemplateIdAST *template_id = name->asTemplateId();
if (LA() == T_LPAREN && template_id) {
if (TemplateArgumentListAST *template_arguments = template_id->template_arguments) {
if (! template_arguments->next && template_arguments->template_argument && template_arguments->template_argument->asBinaryExpression()) {
if (! template_arguments->next && template_arguments->template_argument &&
template_arguments->template_argument->asBinaryExpression()) {
unsigned saved = cursor();
ExpressionAST *expr = 0;
bool blocked = blockErrors(true);
......@@ -2949,13 +2950,16 @@ bool Parser::parseNameId(NameAST *&name)
}
}
if (LA() == T_IDENTIFIER ||
if (LA() == T_COMMA || LA() == T_SEMICOLON ||
LA() == T_LBRACKET || LA() == T_LPAREN)
return true;
else if (LA() == T_IDENTIFIER ||
LA() == T_STATIC_CAST ||
LA() == T_DYNAMIC_CAST ||
LA() == T_REINTERPRET_CAST ||
LA() == T_CONST_CAST ||
tok().isLiteral() ||
(tok().isOperator() && LA() != T_LPAREN && LA() != T_LBRACKET))
tok().isOperator())
{
rewind(start);
return parseName(name, false);
......
......@@ -45,6 +45,7 @@ private slots:
void new_expression_1();
void new_expression_2();
void condition_1();
void init_1();
// statements
void if_statement();
......@@ -157,6 +158,16 @@ void tst_AST::condition_1()
QVERIFY(ast != 0);
}
void tst_AST::init_1()
{
QSharedPointer<TranslationUnit> unit(parseDeclaration("\n"
"x y[] = { X<10>, y };"
));
AST *ast = unit->ast();
QVERIFY(ast != 0);
}
void tst_AST::if_statement()
{
QSharedPointer<TranslationUnit> unit(parseStatement("if (a) b;"));
......
......@@ -552,10 +552,10 @@ int main(int argc, char *argv[])
TranslationUnitAST *ast = unit.ast()->asTranslationUnit();
Q_ASSERT(ast != 0);
Scope globalScope;
Namespace *globalNamespace = control.newNamespace(0, 0);
Semantic sem(&control);
for (DeclarationListAST *decl = ast->declarations; decl; decl = decl->next) {
sem.check(decl->declaration, &globalScope);
sem.check(decl->declaration, globalNamespace->members());
}
// test the rewriter
......
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