summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/shared/cplusplus/AST.cpp12
-rw-r--r--src/shared/cplusplus/AST.h4
-rw-r--r--src/shared/cplusplus/ASTClone.cpp1
-rw-r--r--src/shared/cplusplus/ASTMatcher.cpp2
-rw-r--r--src/shared/cplusplus/Parser.cpp11
5 files changed, 26 insertions, 4 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 5963dae91b..0425bf5a9b 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 82cae89361..3c995613b0 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 bd143b45fc..42b4ed6600 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 d08bfffc0e..e6c447823b 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 3758c0d852..ec9280f434 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;