diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 5963dae91bed84802ce7b98f8bbf495d59f66591..0425bf5a9bdc6af4f61476d28f65eca6f8162a79 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 82cae89361a39f129f8550b4e519ae7ea2dff8b3..3c995613b0355212a032d4d6e76895ec0dc192c1 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 bd143b45fc7c50893ecfdac6f99715258c0a5a1e..42b4ed6600b1d4c4bffe9b215454f741801a498d 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 d08bfffc0e9d17a937f630e01cb30aaf01f0a0a4..e6c447823b654596ac854b95dc3cbb5c5a1cb1af 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 3758c0d8520f0cb3cb2303d737f8b0805c0797d2..ec9280f4342013544083de7caaf12c27dae8daf8 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;