diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index c419ef843898e8bc45eec550421d05e994208026..d5b605116dc235bb091cfbf8565dd4c98a40fff5 100644 --- a/src/shared/cplusplus/AST.cpp +++ b/src/shared/cplusplus/AST.cpp @@ -1727,6 +1727,9 @@ unsigned TemplateTypeParameterAST::lastToken() const else if (name) return name->lastToken(); + else if (dot_dot_dot_token) + return dot_dot_dot_token + 1; + else if (class_token) return class_token + 1; @@ -1895,6 +1898,8 @@ unsigned TypenameTypeParameterAST::lastToken() const return equal_token + 1; else if (name) return name->lastToken(); + else if (dot_dot_dot_token) + return dot_dot_dot_token + 1; return classkey_token + 1; } diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index 2bcb33add14b2f378e4de4b2a8adac856654f489..f0bbb04314bbdaa51855020451f0845a9c7c7bd1 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -3215,6 +3215,7 @@ class CPLUSPLUS_EXPORT TypenameTypeParameterAST: public DeclarationAST { public: unsigned classkey_token; + unsigned dot_dot_dot_token; NameAST *name; unsigned equal_token; ExpressionAST *type_id; @@ -3225,6 +3226,7 @@ public: // annotations public: TypenameTypeParameterAST() : classkey_token(0) + , dot_dot_dot_token(0) , name(0) , equal_token(0) , type_id(0) @@ -3251,6 +3253,7 @@ public: DeclarationListAST *template_parameter_list; unsigned greater_token; unsigned class_token; + unsigned dot_dot_dot_token; NameAST *name; unsigned equal_token; ExpressionAST *type_id; @@ -3265,6 +3268,7 @@ public: , template_parameter_list(0) , greater_token(0) , class_token(0) + , dot_dot_dot_token(0) , name(0) , equal_token(0) , type_id(0) diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp index f33524e36439b844c1ce001d9c91a9ba8bf5f081..011d6ec230f1dc48dfbf1a538a3871050d412028 100644 --- a/src/shared/cplusplus/ASTClone.cpp +++ b/src/shared/cplusplus/ASTClone.cpp @@ -1210,6 +1210,7 @@ TypenameTypeParameterAST *TypenameTypeParameterAST::clone(MemoryPool *pool) cons { TypenameTypeParameterAST *ast = new (pool) TypenameTypeParameterAST; ast->classkey_token = classkey_token; + ast->dot_dot_dot_token = dot_dot_dot_token; if (name) ast->name = name->clone(pool); ast->equal_token = equal_token; @@ -1228,6 +1229,7 @@ TemplateTypeParameterAST *TemplateTypeParameterAST::clone(MemoryPool *pool) cons *ast_iter = new (pool) DeclarationListAST((iter->value) ? iter->value->clone(pool) : 0); ast->greater_token = greater_token; ast->class_token = class_token; + ast->dot_dot_dot_token = dot_dot_dot_token; if (name) ast->name = name->clone(pool); ast->equal_token = equal_token; diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp index 84623bb610e91e4b31ae074e63dc23a862788ea9..3fe3a8d410c63a4a7da8a506769147b561315e71 100644 --- a/src/shared/cplusplus/ASTMatcher.cpp +++ b/src/shared/cplusplus/ASTMatcher.cpp @@ -2017,6 +2017,8 @@ bool ASTMatcher::match(TypenameTypeParameterAST *node, TypenameTypeParameterAST pattern->classkey_token = node->classkey_token; + 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)) @@ -2050,6 +2052,8 @@ bool ASTMatcher::match(TemplateTypeParameterAST *node, TemplateTypeParameterAST pattern->class_token = node->class_token; + 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 e08fce041636ea4382e6bd4584b987498ef6a424..e9fac60fb3881bfcf88e379d9360a0335e70b895 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -1494,6 +1494,8 @@ bool Parser::parseTypenameTypeParameter(DeclarationAST *&node) if (LA() == T_CLASS || LA() == T_TYPENAME) { TypenameTypeParameterAST *ast = new (_pool) TypenameTypeParameterAST; ast->classkey_token = consumeToken(); + if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT) + ast->dot_dot_dot_token = consumeToken(); parseName(ast->name); if (LA() == T_EQUAL) { ast->equal_token = consumeToken(); @@ -1518,6 +1520,8 @@ bool Parser::parseTemplateTypeParameter(DeclarationAST *&node) ast->greater_token = consumeToken(); if (LA() == T_CLASS) ast->class_token = consumeToken(); + if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT) + ast->dot_dot_dot_token = consumeToken(); // parse optional name parseName(ast->name);