From ae715143606c1c432aa6f934578c10c3eee69f76 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Tue, 23 Mar 2010 13:52:24 +0100
Subject: [PATCH] Parse C++0x base-specifier-list.

---
 src/shared/cplusplus/AST.cpp        | 3 +++
 src/shared/cplusplus/AST.h          | 2 ++
 src/shared/cplusplus/ASTClone.cpp   | 2 ++
 src/shared/cplusplus/ASTMatcher.cpp | 4 ++++
 src/shared/cplusplus/Parser.cpp     | 5 +++++
 5 files changed, 16 insertions(+)

diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 9238e8d41b1..c419ef84389 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -559,6 +559,9 @@ unsigned ClassSpecifierAST::lastToken() const
     else if (lbrace_token)
         return lbrace_token + 1;
 
+    else if (dot_dot_dot_token)
+        return dot_dot_dot_token + 1;
+
     else if (base_clause_list)
         return base_clause_list->lastToken();
 
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index c022d6287bc..2bcb33add14 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -1131,6 +1131,7 @@ public:
     NameAST *name;
     unsigned colon_token;
     BaseSpecifierListAST *base_clause_list;
+    unsigned dot_dot_dot_token;
     unsigned lbrace_token;
     DeclarationListAST *member_specifier_list;
     unsigned rbrace_token;
@@ -1145,6 +1146,7 @@ public:
         , name(0)
         , colon_token(0)
         , base_clause_list(0)
+        , dot_dot_dot_token(0)
         , lbrace_token(0)
         , member_specifier_list(0)
         , rbrace_token(0)
diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp
index 738d02684de..f33524e3643 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -353,6 +353,7 @@ ClassSpecifierAST *ClassSpecifierAST::clone(MemoryPool *pool) const
     for (BaseSpecifierListAST *iter = base_clause_list, **ast_iter = &ast->base_clause_list;
          iter; iter = iter->next, ast_iter = &(*ast_iter)->next)
         *ast_iter = new (pool) BaseSpecifierListAST((iter->value) ? iter->value->clone(pool) : 0);
+    ast->dot_dot_dot_token = dot_dot_dot_token;
     ast->lbrace_token = lbrace_token;
     for (DeclarationListAST *iter = member_specifier_list, **ast_iter = &ast->member_specifier_list;
          iter; iter = iter->next, ast_iter = &(*ast_iter)->next)
@@ -431,6 +432,7 @@ CtorInitializerAST *CtorInitializerAST::clone(MemoryPool *pool) const
     for (MemInitializerListAST *iter = member_initializer_list, **ast_iter = &ast->member_initializer_list;
          iter; iter = iter->next, ast_iter = &(*ast_iter)->next)
         *ast_iter = new (pool) MemInitializerListAST((iter->value) ? iter->value->clone(pool) : 0);
+    ast->dot_dot_dot_token = dot_dot_dot_token;
     return ast;
 }
 
diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp
index 31024bd05f9..84623bb610e 100644
--- a/src/shared/cplusplus/ASTMatcher.cpp
+++ b/src/shared/cplusplus/ASTMatcher.cpp
@@ -570,6 +570,8 @@ bool ASTMatcher::match(ClassSpecifierAST *node, ClassSpecifierAST *pattern)
     else if (! AST::match(node->base_clause_list, pattern->base_clause_list, this))
         return false;
 
+    pattern->dot_dot_dot_token = node->dot_dot_dot_token;
+
     pattern->lbrace_token = node->lbrace_token;
 
     if (! pattern->member_specifier_list)
@@ -706,6 +708,8 @@ bool ASTMatcher::match(CtorInitializerAST *node, CtorInitializerAST *pattern)
     else if (! AST::match(node->member_initializer_list, pattern->member_initializer_list, this))
         return false;
 
+    pattern->dot_dot_dot_token = node->dot_dot_dot_token;
+
     return true;
 }
 
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 5e86a4cc023..e08fce04163 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -1667,6 +1667,7 @@ bool Parser::parseClassSpecifier(SpecifierListAST *&node)
     _inFunctionBody = false;
 
     unsigned colon_token = 0;
+    unsigned dot_dot_dot_token = 0;
 
     if (LA() == T_COLON || LA() == T_LBRACE) {
         BaseSpecifierListAST *base_clause_list = 0;
@@ -1676,6 +1677,9 @@ bool Parser::parseClassSpecifier(SpecifierListAST *&node)
 
             parseBaseClause(base_clause_list);
 
+            if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT)
+                dot_dot_dot_token = consumeToken();
+
             if (LA() != T_LBRACE) {
                 _translationUnit->error(cursor(), "expected `{' before `%s'", tok().spell());
 
@@ -1697,6 +1701,7 @@ bool Parser::parseClassSpecifier(SpecifierListAST *&node)
         ast->name = name;
         ast->colon_token = colon_token;
         ast->base_clause_list = base_clause_list;
+        ast->dot_dot_dot_token = dot_dot_dot_token;
 
         if (LA() == T_LBRACE)
             ast->lbrace_token = consumeToken();
-- 
GitLab