From 8b625a867c24a9dd62a3c6c866622284eafd24c7 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Tue, 23 Mar 2010 13:43:18 +0100
Subject: [PATCH] Parse C++0x mem-initializer-list.

---
 src/shared/cplusplus/AST.cpp    |  4 +++-
 src/shared/cplusplus/AST.h      |  2 ++
 src/shared/cplusplus/Parser.cpp | 14 +++++++++++++-
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 15a5901efc7..9238e8d41b1 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -694,7 +694,9 @@ unsigned CtorInitializerAST::firstToken() const
 
 unsigned CtorInitializerAST::lastToken() const
 {
-    if (member_initializer_list)
+    if (dot_dot_dot_token)
+        return dot_dot_dot_token + 1;
+    else if (member_initializer_list)
         return member_initializer_list->lastToken();
     return colon_token + 1;
 }
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index b3c5858ffb5..c022d6287bc 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -1314,11 +1314,13 @@ class CPLUSPLUS_EXPORT CtorInitializerAST: public AST
 public:
     unsigned colon_token;
     MemInitializerListAST *member_initializer_list;
+    unsigned dot_dot_dot_token;
 
 public:
     CtorInitializerAST()
         : colon_token(0)
         , member_initializer_list(0)
+        , dot_dot_dot_token(0)
     {}
 
     virtual CtorInitializerAST *asCtorInitializer() { return this; }
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 32b18dbec95..5e86a4cc023 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -2087,6 +2087,10 @@ bool Parser::parseCtorInitializer(CtorInitializerAST *&node)
         ast->colon_token = colon_token;
 
         parseMemInitializerList(ast->member_initializer_list);
+
+        if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT)
+            ast->dot_dot_dot_token = consumeToken();
+
         node = ast;
         return true;
     }
@@ -2243,6 +2247,9 @@ bool Parser::parseMemInitializerList(MemInitializerListAST *&node)
             if (LA() == T_LBRACE)
                 break;
 
+            else if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT && LA(2) == T_LBRACE)
+                break;
+
             else if (LA() == T_COMMA || (LA() == T_IDENTIFIER && (LA(2) == T_LPAREN || LA(2) == T_COLON_COLON))) {
                 if (LA() != T_COMMA)
                     _translationUnit->error(cursor(), "expected `,'");
@@ -2257,8 +2264,13 @@ bool Parser::parseMemInitializerList(MemInitializerListAST *&node)
             } else break;
         }
 
-        if (LA() != T_LBRACE)
+        if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT) {
+            if (LA(2) != T_LBRACE)
+                _translationUnit->error(cursor(), "expected `{'");
+
+        } else if (LA() != T_LBRACE) {
             _translationUnit->error(cursor(), "expected `{'");
+        }
 
         return true;
     }
-- 
GitLab