From 3c8d12562e4baaf99968f5bf1959574ecfe557fb Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Thu, 25 Mar 2010 10:43:16 +0100
Subject: [PATCH] Recognize C++0x sizeof... expressions.

---
 src/shared/cplusplus/AST.cpp    | 12 +++++++++++-
 src/shared/cplusplus/AST.h      |  1 +
 src/shared/cplusplus/Parser.cpp |  5 +++++
 3 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 0425bf5a9bd..12a520a4fc9 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -1632,8 +1632,18 @@ unsigned SizeofExpressionAST::firstToken() const
 
 unsigned SizeofExpressionAST::lastToken() const
 {
-    if (expression)
+    if (rparen_token)
+        return rparen_token + 1;
+
+    else if (expression)
         return expression->lastToken();
+
+    else if (lparen_token)
+        return lparen_token + 1;
+
+    else if (dot_dot_dot_token)
+        return dot_dot_dot_token + 1;
+
     return sizeof_token + 1;
 }
 
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 3c995613b03..2baf4bb3b45 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -2887,6 +2887,7 @@ class CPLUSPLUS_EXPORT SizeofExpressionAST: public ExpressionAST
 {
 public:
     unsigned sizeof_token;
+    unsigned dot_dot_dot_token;
     unsigned lparen_token;
     ExpressionAST *expression;
     unsigned rparen_token;
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index ec9280f4342..a1c6f74f39d 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -4268,6 +4268,11 @@ bool Parser::parseUnaryExpression(ExpressionAST *&node)
         SizeofExpressionAST *ast = new (_pool) SizeofExpressionAST;
         ast->sizeof_token = consumeToken();
 
+        // sizeof...(Args)
+        if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT && (LA(2) == T_IDENTIFIER || (LA(2) == T_LPAREN && LA(3) == T_IDENTIFIER
+                                                                                 && LA(4) == T_RPAREN)))
+            ast->dot_dot_dot_token = consumeToken();
+
         if (LA() == T_LPAREN) {
             unsigned lparen_token = consumeToken();
             if (parseTypeId(ast->expression) && LA() == T_RPAREN) {
-- 
GitLab