diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 4286cc8dff9b5dff389381991dbc17906c40b75c..03531c481a5e08bb307a74c4bec697b10d5402a6 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -1616,12 +1616,10 @@ unsigned TryBlockStatementAST::firstToken() const
 
 unsigned TryBlockStatementAST::lastToken() const
 {
-    for (CatchClauseAST *it = catch_clause_seq; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    if (catch_clause_list)
+        return catch_clause_list->lastToken();
 
-    if (statement)
+    else if (statement)
         return statement->lastToken();
 
     return try_token + 1;
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 97a56da8efe326b1372dd1b29fcf9a3b44e574b6..190b5cb5600b433cae96c696ae7f51bb289600e5 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -1899,7 +1899,7 @@ class CPLUSPLUS_EXPORT TryBlockStatementAST: public StatementAST
 public:
     unsigned try_token;
     StatementAST *statement;
-    CatchClauseAST *catch_clause_seq;
+    CatchClauseListAST *catch_clause_list;
 
 public:
     virtual TryBlockStatementAST *asTryBlockStatement() { return this; }
@@ -1919,7 +1919,6 @@ public:
     ExceptionDeclarationAST *exception_declaration;
     unsigned rparen_token;
     StatementAST *statement;
-    CatchClauseAST *next;
 
 public: // annotations
     Block *symbol;
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index 63ef418ec9edc0d74d280308b1bf70b93c45abf6..7469388d4cf365598d6ab8d466ce41f4946533d1 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -804,8 +804,7 @@ void TryBlockStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
         accept(statement, visitor);
-        for (CatchClauseAST *it = catch_clause_seq; it; it = it->next)
-            accept(it, visitor);
+        accept(catch_clause_list, visitor);
     }
     visitor->endVisit(this);
 }
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index ac70f735db5676f3d804d13391be5309892c34e6..4c04800c1819157c86635fd2ae08da48d18dfdc9 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -203,6 +203,7 @@ typedef List<PostfixAST *> PostfixListAST;
 typedef List<PostfixDeclaratorAST *> PostfixDeclaratorListAST;
 typedef List<AttributeAST *> AttributeListAST;
 typedef List<NestedNameSpecifierAST *> NestedNameSpecifierListAST;
+typedef List<CatchClauseAST *> CatchClauseListAST;
 
 typedef List<NameAST *> ObjCIdentifierListAST;
 typedef List<ObjCMessageArgumentAST *> ObjCMessageArgumentListAST;
diff --git a/src/shared/cplusplus/CheckStatement.cpp b/src/shared/cplusplus/CheckStatement.cpp
index f2edeae338a90a3f0bb6b7a493f6918b642a7e58..f63aa9270b368cc8132a6b482aac026a4f4e4f13 100644
--- a/src/shared/cplusplus/CheckStatement.cpp
+++ b/src/shared/cplusplus/CheckStatement.cpp
@@ -273,8 +273,8 @@ bool CheckStatement::visit(SwitchStatementAST *ast)
 bool CheckStatement::visit(TryBlockStatementAST *ast)
 {
     semantic()->check(ast->statement, _scope);
-    for (CatchClauseAST *c = ast->catch_clause_seq; c; c = c->next) {
-        semantic()->check(c, _scope);
+    for (CatchClauseListAST *it = ast->catch_clause_list; it; it = it->next) {
+        semantic()->check(it->value, _scope);
     }
     return false;
 }
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 904a5c76f045ca6b51a776476338e1de1ed8c372..394074e594a042f19e30962124d1cd586bb7f7a9 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -2949,7 +2949,7 @@ bool Parser::parseTryBlockStatement(StatementAST *&node)
         TryBlockStatementAST *ast = new (_pool) TryBlockStatementAST;
         ast->try_token = consumeToken();
         parseCompoundStatement(ast->statement);
-        CatchClauseAST **catch_clause_ptr = &ast->catch_clause_seq;
+        CatchClauseListAST **catch_clause_ptr = &ast->catch_clause_list;
         while (parseCatchClause(*catch_clause_ptr))
             catch_clause_ptr = &(*catch_clause_ptr)->next;
         node = ast;
@@ -2958,7 +2958,7 @@ bool Parser::parseTryBlockStatement(StatementAST *&node)
     return false;
 }
 
-bool Parser::parseCatchClause(CatchClauseAST *&node)
+bool Parser::parseCatchClause(CatchClauseListAST *&node)
 {
     DEBUG_THIS_RULE();
     if (LA() == T_CATCH) {
@@ -2968,7 +2968,7 @@ bool Parser::parseCatchClause(CatchClauseAST *&node)
         parseExceptionDeclaration(ast->exception_declaration);
         match(T_RPAREN, &ast->rparen_token);
         parseCompoundStatement(ast->statement);
-        node = ast;
+        node = new (_pool) CatchClauseListAST(ast);
         return true;
     }
     return false;
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index 2ab563f09a3e48d9ea1e31656688a99fb775de0a..15f768b3cf22af42e0e2bde495d033b3146c34e9 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -181,7 +181,7 @@ public:
     bool parseTemplateParameterList(DeclarationListAST *&node);
     bool parseThrowExpression(ExpressionAST *&node);
     bool parseTryBlockStatement(StatementAST *&node);
-    bool parseCatchClause(CatchClauseAST *&node);
+    bool parseCatchClause(CatchClauseListAST *&node);
     bool parseTypeId(ExpressionAST *&node);
     bool parseTypeIdList(ExpressionListAST *&node);
     bool parseTypenameTypeParameter(DeclarationAST *&node);