summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/AST.cpp12
-rw-r--r--src/shared/cplusplus/AST.h1
-rw-r--r--src/shared/cplusplus/Parser.cpp5
3 files changed, 17 insertions, 1 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 0425bf5a9b..12a520a4fc 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 3c995613b0..2baf4bb3b4 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 ec9280f434..a1c6f74f39 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) {