diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index 77d7a5e20068ab751482b7ee7944abc725c474a1..95fd7147983f1cd463d561df19f9ec6bec0a3afe 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 13f90d2a292f79f1e8dad7772139f08150df8799..6f5e349f70621f636aa47709ff46a9d5c39392a1 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"