diff options
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r-- | src/shared/cplusplus/AST.cpp | 12 | ||||
-rw-r--r-- | src/shared/cplusplus/AST.h | 1 | ||||
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 5 |
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) { |