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;