diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 4cefd9a012998859b51aaae71743ecf0ce0bddb3..fe28c1d27d8220883ddf3daf7ba60ec4aa3bdd94 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -1959,25 +1959,6 @@ unsigned ObjCMessageExpressionAST::lastToken() const
     return lbracket_token + 1;
 }
 
-unsigned ObjCMessageArgumentListAST::firstToken() const
-{
-    if (arg)
-        return arg->firstToken();
-    // ### assert?
-    return 0;
-}
-
-unsigned ObjCMessageArgumentListAST::lastToken() const
-{
-    for (const ObjCMessageArgumentListAST *it = this; it; it = it->next) {
-        if (! it->next && it->arg) {
-            return it->arg->lastToken();
-        }
-    }
-    // ### assert?
-    return 0;
-}
-
 unsigned ObjCMessageArgumentAST::firstToken() const
 {
     return parameter_value_expression->firstToken();
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 084913fc91f713290aa4274935522e79f4dc8c10..129c132f94cb4b05cf69a00905a41165e8a3f940 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -2211,22 +2211,6 @@ protected:
     virtual void accept0(ASTVisitor *visitor);
 };
 
-class CPLUSPLUS_EXPORT ObjCMessageArgumentListAST: public AST
-{
-public:
-    ObjCMessageArgumentAST *arg;
-    ObjCMessageArgumentListAST *next;
-
-public:
-    virtual ObjCMessageArgumentListAST *asObjCMessageArgumentList() { return this; }
-
-    virtual unsigned firstToken() const;
-    virtual unsigned lastToken() const;
-
-protected:
-    virtual void accept0(ASTVisitor *visitor);
-};
-
 class CPLUSPLUS_EXPORT ObjCMessageExpressionAST: public ExpressionAST
 {
 public:
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index 8095946f0a2a024b407153c46a2dad8deb69853d..2f60cdf461661f73731b7c8f557d7818026453e2 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -958,14 +958,6 @@ void ObjCMessageArgumentAST::accept0(ASTVisitor *visitor)
     visitor->endVisit(this);
 }
 
-void ObjCMessageArgumentListAST::accept0(ASTVisitor *visitor)
-{
-    if (visitor->visit(this)) {
-        accept(arg, visitor);
-    }
-    visitor->endVisit(this);
-}
-
 void ObjCMessageExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h
index fff0c9f7d52c9208f2df6982b10eb8e032253bb2..ddb4886e78e30542844b03bd1d2b0c61088d9b0c 100644
--- a/src/shared/cplusplus/ASTVisitor.h
+++ b/src/shared/cplusplus/ASTVisitor.h
@@ -91,6 +91,13 @@ public:
 
     void accept(AST *ast);
 
+    template <typename _Tp>
+    void accept(List<_Tp> *it)
+    {
+        for (; it; it = it->next)
+            accept(it->value);
+    }
+
     virtual bool preVisit(AST *) { return true; }
     virtual void postVisit(AST *) {}
 
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index c562384bf9a3d28c8ba381dbb02dc61a3ff5b7b3..119758e63b5e459867f6a66cdd0b6384894bb561 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -132,7 +132,6 @@ class ObjCInstanceVariablesDeclarationAST;
 class ObjCMessageArgumentAST;
 class ObjCMessageArgumentDeclarationAST;
 class ObjCMessageArgumentDeclarationListAST;
-class ObjCMessageArgumentListAST;
 class ObjCMessageExpressionAST;
 class ObjCMethodDeclarationAST;
 class ObjCMethodPrototypeAST;
@@ -201,6 +200,7 @@ typedef List<DeclarationAST *> DeclarationListAST;
 typedef List<StatementAST *> StatementListAST;
 typedef List<DeclaratorAST *> DeclaratorListAST;
 typedef List<NameAST *> ObjCIdentifierListAST;
+typedef List<ObjCMessageArgumentAST *> ObjCMessageArgumentListAST;
 
 typedef ExpressionListAST TemplateArgumentListAST;
 
diff --git a/src/shared/cplusplus/CheckExpression.cpp b/src/shared/cplusplus/CheckExpression.cpp
index 3703577ed0e8884215aff2d66b631692adf138e8..14ced9509a68d222c245ff55ddc10092853f00bf 100644
--- a/src/shared/cplusplus/CheckExpression.cpp
+++ b/src/shared/cplusplus/CheckExpression.cpp
@@ -369,7 +369,7 @@ bool CheckExpression::visit(ObjCMessageExpressionAST *ast)
     semantic()->check(ast->receiver_expression, _scope);
     (void) semantic()->check(ast->selector, _scope);
 
-    accept(ast->argument_list);
+    accept(ast->argument_list); // ### not necessary.
     return false;
 }
 
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 8cfa100c6ee9683a7efe69cdd9616c0d7c8c83ce..06a938763a685e950f6af7ad33636d33aa3ee5f4 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -3257,7 +3257,7 @@ bool Parser::parseObjCMessageArguments(ObjCSelectorAST *&selNode, ObjCMessageArg
         ObjCSelectorArgumentListAST *lastSelector = selAst;
 
         ObjCMessageArgumentListAST *argAst = new (_pool) ObjCMessageArgumentListAST;
-        argAst->arg = messageArgument;
+        argAst->value = messageArgument;
         ObjCMessageArgumentListAST *lastArgument = argAst;
 
         while (parseObjCSelectorArg(selectorArgument, messageArgument)) {
@@ -3268,11 +3268,11 @@ bool Parser::parseObjCMessageArguments(ObjCSelectorAST *&selNode, ObjCMessageArg
 
             lastArgument->next = new (_pool) ObjCMessageArgumentListAST;
             lastArgument = lastArgument->next;
-            lastArgument->arg = messageArgument;
+            lastArgument->value = messageArgument;
         }
 
         if (LA() == T_COMMA) {
-            ExpressionAST **lastExpression = &(lastArgument->arg->parameter_value_expression);
+            ExpressionAST **lastExpression = &(lastArgument->value->parameter_value_expression);
 
             while (LA() == T_COMMA) {
                 BinaryExpressionAST *binaryExpression = new (_pool) BinaryExpressionAST;