diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index ab2578c49ffae77c821bd34782f49471565babc6..a20f74372bbaed46686be888b93b0476a7c2560d 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -527,10 +527,8 @@ unsigned CtorInitializerAST::firstToken() const
 
 unsigned CtorInitializerAST::lastToken() const
 {
-    for (MemInitializerAST *it = member_initializers; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    if (member_initializers)
+        return member_initializers->lastToken();
     return colon_token + 1;
 }
 
@@ -697,10 +695,8 @@ unsigned EnumSpecifierAST::lastToken() const
     if (rbrace_token)
         return rbrace_token + 1;
 
-    for (EnumeratorAST *it = enumerators; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    if (enumerators)
+        return enumerators->lastToken();
 
     if (lbrace_token)
         return lbrace_token + 1;
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index fdaaf8100cfdb17da074ca67f50a52c7ab3fead4..3dd95c5e531b2cb9e3d2df950a146ed00e63a258 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -686,7 +686,7 @@ class CPLUSPLUS_EXPORT CtorInitializerAST: public AST
 {
 public:
     unsigned colon_token;
-    MemInitializerAST *member_initializers;
+    MemInitializerListAST *member_initializers;
 
 public:
     virtual CtorInitializerAST *asCtorInitializer() { return this; }
@@ -862,7 +862,7 @@ public:
     unsigned enum_token;
     NameAST *name;
     unsigned lbrace_token;
-    EnumeratorAST *enumerators;
+    EnumeratorListAST *enumerators;
     unsigned rbrace_token;
 
 public:
@@ -881,7 +881,6 @@ public:
     unsigned identifier_token;
     unsigned equal_token;
     ExpressionAST *expression;
-    EnumeratorAST *next;
 
 public:
     virtual EnumeratorAST *asEnumerator() { return this; }
@@ -1134,7 +1133,6 @@ public:
     unsigned lparen_token;
     ExpressionAST *expression;
     unsigned rparen_token;
-    MemInitializerAST *next;
 
 public:
     virtual MemInitializerAST *asMemInitializer() { return this; }
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index 9b48f3db6d960c4441bf757438938c2a8652ae4e..1188eb0991c430f8f864d7b201a21eefe6ff67f4 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -220,8 +220,7 @@ void CppCastExpressionAST::accept0(ASTVisitor *visitor)
 void CtorInitializerAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (MemInitializerAST *it = member_initializers; it; it = it->next)
-            accept(it, visitor);
+        accept(member_initializers, visitor);
     }
     visitor->endVisit(this);
 }
@@ -307,8 +306,7 @@ void EnumSpecifierAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
         accept(name, visitor);
-        for (EnumeratorAST *it = enumerators; it; it = it->next)
-            accept(it, visitor);
+        accept(enumerators, visitor);
     }
     visitor->endVisit(this);
 }
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index 94f36c7b01e20f4ba6691606330db8feb13465b0..fbf3743faccb7c04606b736d01fb8e3abd7969de 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -196,6 +196,8 @@ typedef List<DeclarationAST *> DeclarationListAST;
 typedef List<StatementAST *> StatementListAST;
 typedef List<DeclaratorAST *> DeclaratorListAST;
 typedef List<BaseSpecifierAST *> BaseSpecifierListAST;
+typedef List<EnumeratorAST *> EnumeratorListAST;
+typedef List<MemInitializerAST *> MemInitializerListAST;
 
 typedef List<NameAST *> ObjCIdentifierListAST;
 typedef List<ObjCMessageArgumentAST *> ObjCMessageArgumentListAST;
diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp
index 65909536fd066b02ae69744543303720ee294eb4..0becef32017d017de9f18da6ac311fcafda10345 100644
--- a/src/shared/cplusplus/CheckSpecifier.cpp
+++ b/src/shared/cplusplus/CheckSpecifier.cpp
@@ -387,8 +387,8 @@ bool CheckSpecifier::visit(EnumSpecifierAST *ast)
     e->setVisibility(semantic()->currentVisibility());
     _scope->enterSymbol(e);
     _fullySpecifiedType.setType(e);
-    for (EnumeratorAST *enumerator = ast->enumerators; enumerator;
-            enumerator = enumerator->next) {
+    for (EnumeratorListAST *it = ast->enumerators; it; it = it->next) {
+        EnumeratorAST *enumerator = it->value;
         Identifier *id = identifier(enumerator->identifier_token);
         if (! id)
             continue;
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index dc89952cafabf7d1d427c7f69d7397de0d81fd23..86f046b9c5d9ab625a8894d6d8e730c08b5ad27a 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -1308,7 +1308,7 @@ bool Parser::parseEnumSpecifier(SpecifierAST *&node)
             ast->name = name;
             ast->lbrace_token = consumeToken();
             unsigned comma_token = 0;
-            EnumeratorAST **enumerator_ptr = &ast->enumerators;
+            EnumeratorListAST **enumerator_ptr = &ast->enumerators;
             while (int tk = LA()) {
                 if (tk == T_RBRACE)
                     break;
@@ -1722,7 +1722,7 @@ bool Parser::parseExceptionSpecification(ExceptionSpecificationAST *&node)
     return false;
 }
 
-bool Parser::parseEnumerator(EnumeratorAST *&node)
+bool Parser::parseEnumerator(EnumeratorListAST *&node)
 {
     DEBUG_THIS_RULE();
     if (LA() == T_IDENTIFIER) {
@@ -1733,7 +1733,9 @@ bool Parser::parseEnumerator(EnumeratorAST *&node)
             ast->equal_token = consumeToken();
             parseConstantExpression(ast->expression);
         }
-        node = ast;
+
+        node = new (_pool) EnumeratorListAST;
+        node->value = ast;
         return true;
     }
     return false;
@@ -1820,10 +1822,10 @@ bool Parser::parseInitializer(ExpressionAST *&node, unsigned *equals_token)
     return false;
 }
 
-bool Parser::parseMemInitializerList(MemInitializerAST *&node)
+bool Parser::parseMemInitializerList(MemInitializerListAST *&node)
 {
     DEBUG_THIS_RULE();
-    MemInitializerAST **initializer = &node;
+    MemInitializerListAST **initializer = &node;
 
     if (parseMemInitializer(*initializer)) {
         initializer = &(*initializer)->next;
@@ -1838,7 +1840,7 @@ bool Parser::parseMemInitializerList(MemInitializerAST *&node)
     return false;
 }
 
-bool Parser::parseMemInitializer(MemInitializerAST *&node)
+bool Parser::parseMemInitializer(MemInitializerListAST *&node)
 {
     DEBUG_THIS_RULE();
     NameAST *name = 0;
@@ -1849,7 +1851,9 @@ bool Parser::parseMemInitializer(MemInitializerAST *&node)
         parseExpression(ast->expression);
         if (LA() == T_RPAREN)
             ast->rparen_token = consumeToken();
-        node = ast;
+
+        node = new (_pool) MemInitializerListAST;
+        node->value = ast;
         return true;
     }
     return false;
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index 2f0514d2697ff60f4ea6672facf9d7775a3c370f..40f2f7e558c38535d12f68a5f1cc3e8ebc1870a0 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -111,7 +111,7 @@ public:
     bool parseDoStatement(StatementAST *&node);
     bool parseElaboratedTypeSpecifier(SpecifierAST *&node);
     bool parseEnumSpecifier(SpecifierAST *&node);
-    bool parseEnumerator(EnumeratorAST *&node);
+    bool parseEnumerator(EnumeratorListAST *&node);
     bool parseEqualityExpression(ExpressionAST *&node);
     bool parseExceptionDeclaration(ExceptionDeclarationAST *&node);
     bool parseExceptionSpecification(ExceptionSpecificationAST *&node);
@@ -134,8 +134,8 @@ public:
     bool parseLinkageSpecification(DeclarationAST *&node);
     bool parseLogicalAndExpression(ExpressionAST *&node);
     bool parseLogicalOrExpression(ExpressionAST *&node);
-    bool parseMemInitializer(MemInitializerAST *&node);
-    bool parseMemInitializerList(MemInitializerAST *&node);
+    bool parseMemInitializer(MemInitializerListAST *&node);
+    bool parseMemInitializerList(MemInitializerListAST *&node);
     bool parseMemberSpecification(DeclarationAST *&node);
     bool parseMultiplicativeExpression(ExpressionAST *&node);
     bool parseTemplateId(NameAST *&node);