diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index 15a5901efc74466b8a04eaa5b7d5d204e09d9a39..9238e8d41b1bf7f7adeea5c6e6fe08eee9c1bfbe 100644 --- a/src/shared/cplusplus/AST.cpp +++ b/src/shared/cplusplus/AST.cpp @@ -694,7 +694,9 @@ unsigned CtorInitializerAST::firstToken() const unsigned CtorInitializerAST::lastToken() const { - if (member_initializer_list) + if (dot_dot_dot_token) + return dot_dot_dot_token + 1; + else if (member_initializer_list) return member_initializer_list->lastToken(); return colon_token + 1; } diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index b3c5858ffb5bbcf9a264a27d5d4083962ebd3656..c022d6287bc02d1c6004419c50838edd9d3a4b6f 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -1314,11 +1314,13 @@ class CPLUSPLUS_EXPORT CtorInitializerAST: public AST public: unsigned colon_token; MemInitializerListAST *member_initializer_list; + unsigned dot_dot_dot_token; public: CtorInitializerAST() : colon_token(0) , member_initializer_list(0) + , dot_dot_dot_token(0) {} virtual CtorInitializerAST *asCtorInitializer() { return this; } diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 32b18dbec956eb766bf46db8cd55cbe2a68744ca..5e86a4cc02371be12297cb95c9eeb4fc1bc45e3e 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -2087,6 +2087,10 @@ bool Parser::parseCtorInitializer(CtorInitializerAST *&node) ast->colon_token = colon_token; parseMemInitializerList(ast->member_initializer_list); + + if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT) + ast->dot_dot_dot_token = consumeToken(); + node = ast; return true; } @@ -2243,6 +2247,9 @@ bool Parser::parseMemInitializerList(MemInitializerListAST *&node) if (LA() == T_LBRACE) break; + else if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT && LA(2) == T_LBRACE) + break; + else if (LA() == T_COMMA || (LA() == T_IDENTIFIER && (LA(2) == T_LPAREN || LA(2) == T_COLON_COLON))) { if (LA() != T_COMMA) _translationUnit->error(cursor(), "expected `,'"); @@ -2257,8 +2264,13 @@ bool Parser::parseMemInitializerList(MemInitializerListAST *&node) } else break; } - if (LA() != T_LBRACE) + if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT) { + if (LA(2) != T_LBRACE) + _translationUnit->error(cursor(), "expected `{'"); + + } else if (LA() != T_LBRACE) { _translationUnit->error(cursor(), "expected `{'"); + } return true; }