diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index 0425bf5a9bdc6af4f61476d28f65eca6f8162a79..12a520a4fc924748d2eb51ec5d511341d27323ce 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 3c995613b0355212a032d4d6e76895ec0dc192c1..2baf4bb3b45ee76850b4946eb7b283ee5ad644bd 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 ec9280f4342013544083de7caaf12c27dae8daf8..a1c6f74f39d921755186578069202a8a38bd3333 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) {