diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index 5999c9531de3f78f1da05896090f1a1285a30773..277f31b25821feef6edc494b01e7b543dcf77fbb 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -208,8 +208,8 @@ bool ResolveExpression::visit(PostfixExpressionAST *ast)
 {
     accept(ast->base_expression);
 
-    for (PostfixAST *fx = ast->postfix_expressions; fx; fx = fx->next) {
-        accept(fx);
+    for (PostfixListAST *it = ast->postfix_expressions; it; it = it->next) {
+        accept(it->value);
     }
 
     return false;
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 5925a50f5188351afff47ba9b40012a3479c5d00..ec036230935878c6741048cfaa18d82bb41718f9 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -318,10 +318,11 @@ protected:
     virtual bool visit(PostfixExpressionAST *ast)
     {
         accept(ast->base_expression);
-        for (PostfixAST *it = ast->postfix_expressions; it; it = it->next) {
-            if (it->asMemberAccess() != 0)
+        for (PostfixListAST *it = ast->postfix_expressions; it; it = it->next) {
+            PostfixAST *fx = it->value;
+            if (fx->asMemberAccess() != 0)
                 continue; // skip members
-            accept(it);
+            accept(fx);
         }
         return false;
     }
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 987c6a1664b125f051d4c06948b7f62682472200..035f5dae37a811e07cb964ff4de7138e3eddeb2d 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -1331,10 +1331,8 @@ unsigned PostfixExpressionAST::firstToken() const
 
 unsigned PostfixExpressionAST::lastToken() const
 {
-    for (PostfixAST *it = postfix_expressions; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    if (postfix_expressions)
+        return postfix_expressions->lastToken();
     return base_expression->lastToken();
 }
 
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 310b3d39e2be8fe27ac57c02b52dcb3d5a204d8b..bd5b91f4ad38a74fa1776b85ef80baa7d7284224 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -66,6 +66,10 @@ public:
         : value(_Tp()), next(0)
     { }
 
+    List(const _Tp &value)
+        : value(value), next(0)
+    { }
+
     unsigned firstToken() const
     {
         if (value)
@@ -1459,12 +1463,8 @@ protected:
 
 class CPLUSPLUS_EXPORT PostfixAST: public AST
 {
-public:
-    PostfixAST *next;
-
 public:
     virtual PostfixAST *asPostfix() { return this; }
-
 };
 
 class CPLUSPLUS_EXPORT CallAST: public PostfixAST
@@ -1592,7 +1592,7 @@ class CPLUSPLUS_EXPORT PostfixExpressionAST: public ExpressionAST
 {
 public:
     ExpressionAST *base_expression;
-    PostfixAST *postfix_expressions;
+    PostfixListAST *postfix_expressions;
 
 public:
     virtual PostfixExpressionAST *asPostfixExpression() { return this; }
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index c9e86fb07fb1e528a94cfd91664c88f5f93382db..5345471140354520e45e5b08adb7118b71556514 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -662,8 +662,7 @@ void PostfixExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
         accept(base_expression, visitor);
-        for (PostfixAST *it = postfix_expressions; it; it = it->next)
-            accept(it, visitor);
+        accept(postfix_expressions, visitor);
     }
     visitor->endVisit(this);
 }
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index 1eae7c3fff62be4531f555e6cb1875fee3a58943..9bbf9681f0f3f5743e002699370112e61c720548 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -199,6 +199,7 @@ typedef List<BaseSpecifierAST *> BaseSpecifierListAST;
 typedef List<EnumeratorAST *> EnumeratorListAST;
 typedef List<MemInitializerAST *> MemInitializerListAST;
 typedef List<NewArrayDeclaratorAST *> NewArrayDeclaratorListAST;
+typedef List<PostfixAST *> PostfixListAST;
 
 typedef List<NameAST *> ObjCIdentifierListAST;
 typedef List<ObjCMessageArgumentAST *> ObjCMessageArgumentListAST;
diff --git a/src/shared/cplusplus/CheckExpression.cpp b/src/shared/cplusplus/CheckExpression.cpp
index 763258dfda79b617a66b79f682cb0072492876d9..25de7e62c6dab21a7ab4da691675d141eca4fc1c 100644
--- a/src/shared/cplusplus/CheckExpression.cpp
+++ b/src/shared/cplusplus/CheckExpression.cpp
@@ -251,8 +251,8 @@ bool CheckExpression::visit(TypeConstructorCallAST *ast)
 bool CheckExpression::visit(PostfixExpressionAST *ast)
 {
     FullySpecifiedType exprTy = semantic()->check(ast->base_expression, _scope);
-    for (PostfixAST *fx = ast->postfix_expressions; fx; fx = fx->next) {
-        accept(fx); // ### not exactly.
+    for (PostfixListAST *it = ast->postfix_expressions; it; it = it->next) {
+        accept(it->value); // ### not exactly.
     }
     return false;
 }
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 9179f21db1386dce1424ddffa5f6fd940a603fe3..f9519736163961dda79e9aba2d661e934beee0d3 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -3599,7 +3599,7 @@ bool Parser::parsePostfixExpression(ExpressionAST *&node)
 {
     DEBUG_THIS_RULE();
     if (parseCorePostfixExpression(node)) {
-        PostfixAST *postfix_expressions = 0,
+        PostfixListAST *postfix_expressions = 0,
             **postfix_ptr = &postfix_expressions;
         while (LA()) {
             if (LA() == T_LPAREN) {
@@ -3607,19 +3607,19 @@ bool Parser::parsePostfixExpression(ExpressionAST *&node)
                 ast->lparen_token = consumeToken();
                 parseExpressionList(ast->expression_list);
                 match(T_RPAREN, &ast->rparen_token);
-                *postfix_ptr = ast;
+                *postfix_ptr = new (_pool) PostfixListAST(ast);
                 postfix_ptr = &(*postfix_ptr)->next;
             } else if (LA() == T_LBRACKET) {
                 ArrayAccessAST *ast = new (_pool) ArrayAccessAST;
                 ast->lbracket_token = consumeToken();
                 parseExpression(ast->expression);
                 match(T_RBRACKET, &ast->rbracket_token);
-                *postfix_ptr = ast;
+                *postfix_ptr = new (_pool) PostfixListAST(ast);
                 postfix_ptr = &(*postfix_ptr)->next;
             } else if (LA() == T_PLUS_PLUS || LA() == T_MINUS_MINUS) {
                 PostIncrDecrAST *ast = new (_pool) PostIncrDecrAST;
                 ast->incr_decr_token = consumeToken();
-                *postfix_ptr = ast;
+                *postfix_ptr = new (_pool) PostfixListAST(ast);
                 postfix_ptr = &(*postfix_ptr)->next;
             } else if (LA() == T_DOT || LA() == T_ARROW) {
                 MemberAccessAST *ast = new (_pool) MemberAccessAST;
@@ -3629,7 +3629,7 @@ bool Parser::parsePostfixExpression(ExpressionAST *&node)
                 if (! parseNameId(ast->member_name))
                     _translationUnit->error(cursor(), "expected unqualified-id before token `%s'",
                                             tok().spell());
-                *postfix_ptr = ast;
+                *postfix_ptr = new (_pool) PostfixListAST(ast);
                 postfix_ptr = &(*postfix_ptr)->next;
             } else break;
         } // while
diff --git a/tests/auto/cplusplus/ast/tst_ast.cpp b/tests/auto/cplusplus/ast/tst_ast.cpp
index df015049a88dbfd5829d223aaa5a2ad9c1c3b46a..c653b7fdcf6164835cfae76022bc2232c703ed50 100644
--- a/tests/auto/cplusplus/ast/tst_ast.cpp
+++ b/tests/auto/cplusplus/ast/tst_ast.cpp
@@ -574,7 +574,7 @@ void tst_AST::normal_array_access()
 
     {
         QVERIFY(postfixExpr->postfix_expressions && !postfixExpr->postfix_expressions->next);
-        ArrayAccessAST *rhs = postfixExpr->postfix_expressions->asArrayAccess();
+        ArrayAccessAST *rhs = postfixExpr->postfix_expressions->value->asArrayAccess();
         QVERIFY(rhs && rhs->expression);
         SimpleNameAST *b = rhs->expression->asSimpleName();
         QVERIFY(b);
@@ -620,7 +620,7 @@ void tst_AST::array_access_with_nested_expression()
 
     {
         QVERIFY(postfixExpr->postfix_expressions && !postfixExpr->postfix_expressions->next);
-        ArrayAccessAST *rhs = postfixExpr->postfix_expressions->asArrayAccess();
+        ArrayAccessAST *rhs = postfixExpr->postfix_expressions->value->asArrayAccess();
         QVERIFY(rhs && rhs->expression);
         SimpleNameAST *b = rhs->expression->asSimpleName();
         QVERIFY(b);