From 275e207d261f270efa8df809a7dc34e90f60e6e4 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen <erik.verbruggen@nokia.com> Date: Wed, 28 Mar 2012 13:34:31 +0200 Subject: [PATCH] Fix invalid decltype error recovery which resulted in crashes. Task-number: QTCREATORBUG-7174 Change-Id: I653db71adc45586cd8518ffd96118425fd3763be Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com> --- src/libs/3rdparty/cplusplus/Parser.cpp | 6 ++---- tests/auto/cplusplus/ast/tst_ast.cpp | 8 ++++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index 77d7a5e2006..95fd7147983 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -3638,11 +3638,9 @@ bool Parser::parseBuiltinTypeSpecifier(SpecifierListAST *&node) DecltypeSpecifierAST *ast = new (_pool) DecltypeSpecifierAST; ast->decltype_token = consumeToken(); match(T_LPAREN, &ast->lparen_token); - if (parseExpression(ast->expression)) { + if (parseExpression(ast->expression)) match(T_RPAREN, &ast->rparen_token); - node = new (_pool) SpecifierListAST(ast); - return true; - } + node = new (_pool) SpecifierListAST(ast); skipUntilDeclaration(); return true; } else if (lookAtBuiltinTypeSpecifier()) { diff --git a/tests/auto/cplusplus/ast/tst_ast.cpp b/tests/auto/cplusplus/ast/tst_ast.cpp index 13f90d2a292..6f5e349f706 100644 --- a/tests/auto/cplusplus/ast/tst_ast.cpp +++ b/tests/auto/cplusplus/ast/tst_ast.cpp @@ -101,6 +101,7 @@ private slots: void gcc_attributes_1(); void gcc_attributes_2(); void gcc_attributes_3(); + void crash_test_1(); // expressions void simple_name_1(); @@ -212,6 +213,13 @@ void tst_AST::gcc_attributes_3() QCOMPARE(unit->tokenKind(link->rbrace_token), (int) T_RBRACE); } +void tst_AST::crash_test_1() +{ + QSharedPointer<TranslationUnit> unit(parseStatement("decltype auto\n")); + AST *ast = unit->ast(); + QVERIFY(ast); +} + void tst_AST::simple_declaration_1() { QSharedPointer<TranslationUnit> unit(parseStatement("\n" -- GitLab