From ddcc40d0fcec541e772e59eb78214fb58819c42a Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Thu, 25 Mar 2010 10:26:33 +0100
Subject: [PATCH] Accepts `...' when parsing declarator-ids in C++0x.

---
 src/shared/cplusplus/AST.cpp        | 12 +++++++++++-
 src/shared/cplusplus/AST.h          |  4 +++-
 src/shared/cplusplus/ASTClone.cpp   |  1 +
 src/shared/cplusplus/ASTMatcher.cpp |  2 ++
 src/shared/cplusplus/Parser.cpp     | 11 +++++++++--
 5 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 5963dae91be..0425bf5a9bd 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -760,12 +760,22 @@ unsigned DeclarationStatementAST::lastToken() const
 
 unsigned DeclaratorIdAST::firstToken() const
 {
+    if (dot_dot_dot_token)
+        return dot_dot_dot_token;
+
     return name->firstToken();
 }
 
 unsigned DeclaratorIdAST::lastToken() const
 {
-    return name->lastToken();
+    if (name)
+        return name->lastToken();
+
+    else if (dot_dot_dot_token)
+        return dot_dot_dot_token + 1;
+
+    // assert?
+    return 0;
 }
 
 unsigned DeleteExpressionAST::firstToken() const
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 82cae89361a..3c995613b03 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -1368,11 +1368,13 @@ protected:
 class CPLUSPLUS_EXPORT DeclaratorIdAST: public CoreDeclaratorAST
 {
 public:
+    unsigned dot_dot_dot_token;
     NameAST *name;
 
 public:
     DeclaratorIdAST()
-        : name(0)
+        : dot_dot_dot_token(0)
+        , name(0)
     {}
 
     virtual DeclaratorIdAST *asDeclaratorId() { return this; }
diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp
index bd143b45fc7..42b4ed6600b 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -447,6 +447,7 @@ DeclarationStatementAST *DeclarationStatementAST::clone(MemoryPool *pool) const
 DeclaratorIdAST *DeclaratorIdAST::clone(MemoryPool *pool) const
 {
     DeclaratorIdAST *ast = new (pool) DeclaratorIdAST;
+    ast->dot_dot_dot_token = dot_dot_dot_token;
     if (name)
         ast->name = name->clone(pool);
     return ast;
diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp
index d08bfffc0e9..e6c447823b6 100644
--- a/src/shared/cplusplus/ASTMatcher.cpp
+++ b/src/shared/cplusplus/ASTMatcher.cpp
@@ -731,6 +731,8 @@ bool ASTMatcher::match(DeclaratorIdAST *node, DeclaratorIdAST *pattern)
     (void) node;
     (void) pattern;
 
+    pattern->dot_dot_dot_token = node->dot_dot_dot_token;
+
     if (! pattern->name)
         pattern->name = node->name;
     else if (! AST::match(node->name, pattern->name, this))
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 3758c0d8520..ec9280f4342 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -1218,11 +1218,18 @@ bool Parser::parseCoreDeclarator(DeclaratorAST *&node)
     while (parsePtrOperator(*ptr_operators_tail))
         ptr_operators_tail = &(*ptr_operators_tail)->next;
 
-    if (LA() == T_COLON_COLON || LA() == T_IDENTIFIER || LA() == T_TILDE
-            || LA() == T_OPERATOR) {
+    if (LA() == T_COLON_COLON || LA() == T_IDENTIFIER || LA() == T_TILDE || LA() == T_OPERATOR
+        || (_cxx0xEnabled && LA() == T_DOT_DOT_DOT && (LA(2) == T_COLON_COLON || LA(2) == T_IDENTIFIER))) {
+
+        unsigned dot_dot_dot_token = 0;
+
+        if (LA() == T_DOT_DOT_DOT)
+            dot_dot_dot_token = consumeToken();
+
         NameAST *name = 0;
         if (parseName(name)) {
             DeclaratorIdAST *declarator_id = new (_pool) DeclaratorIdAST;
+            declarator_id->dot_dot_dot_token = dot_dot_dot_token;
             declarator_id->name = name;
             DeclaratorAST *ast = new (_pool) DeclaratorAST;
             ast->attribute_list = attributes;
-- 
GitLab