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