Parse C++0x base-specifier-list.

This commit is contained in:
Roberto Raggi
2010-03-23 13:52:24 +01:00
parent 8b625a867c
commit ae71514360
5 changed files with 16 additions and 0 deletions

View File

@@ -559,6 +559,9 @@ unsigned ClassSpecifierAST::lastToken() const
else if (lbrace_token) else if (lbrace_token)
return lbrace_token + 1; return lbrace_token + 1;
else if (dot_dot_dot_token)
return dot_dot_dot_token + 1;
else if (base_clause_list) else if (base_clause_list)
return base_clause_list->lastToken(); return base_clause_list->lastToken();

View File

@@ -1131,6 +1131,7 @@ public:
NameAST *name; NameAST *name;
unsigned colon_token; unsigned colon_token;
BaseSpecifierListAST *base_clause_list; BaseSpecifierListAST *base_clause_list;
unsigned dot_dot_dot_token;
unsigned lbrace_token; unsigned lbrace_token;
DeclarationListAST *member_specifier_list; DeclarationListAST *member_specifier_list;
unsigned rbrace_token; unsigned rbrace_token;
@@ -1145,6 +1146,7 @@ public:
, name(0) , name(0)
, colon_token(0) , colon_token(0)
, base_clause_list(0) , base_clause_list(0)
, dot_dot_dot_token(0)
, lbrace_token(0) , lbrace_token(0)
, member_specifier_list(0) , member_specifier_list(0)
, rbrace_token(0) , rbrace_token(0)

View File

@@ -353,6 +353,7 @@ ClassSpecifierAST *ClassSpecifierAST::clone(MemoryPool *pool) const
for (BaseSpecifierListAST *iter = base_clause_list, **ast_iter = &ast->base_clause_list; for (BaseSpecifierListAST *iter = base_clause_list, **ast_iter = &ast->base_clause_list;
iter; iter = iter->next, ast_iter = &(*ast_iter)->next) iter; iter = iter->next, ast_iter = &(*ast_iter)->next)
*ast_iter = new (pool) BaseSpecifierListAST((iter->value) ? iter->value->clone(pool) : 0); *ast_iter = new (pool) BaseSpecifierListAST((iter->value) ? iter->value->clone(pool) : 0);
ast->dot_dot_dot_token = dot_dot_dot_token;
ast->lbrace_token = lbrace_token; ast->lbrace_token = lbrace_token;
for (DeclarationListAST *iter = member_specifier_list, **ast_iter = &ast->member_specifier_list; for (DeclarationListAST *iter = member_specifier_list, **ast_iter = &ast->member_specifier_list;
iter; iter = iter->next, ast_iter = &(*ast_iter)->next) iter; iter = iter->next, ast_iter = &(*ast_iter)->next)
@@ -431,6 +432,7 @@ CtorInitializerAST *CtorInitializerAST::clone(MemoryPool *pool) const
for (MemInitializerListAST *iter = member_initializer_list, **ast_iter = &ast->member_initializer_list; for (MemInitializerListAST *iter = member_initializer_list, **ast_iter = &ast->member_initializer_list;
iter; iter = iter->next, ast_iter = &(*ast_iter)->next) iter; iter = iter->next, ast_iter = &(*ast_iter)->next)
*ast_iter = new (pool) MemInitializerListAST((iter->value) ? iter->value->clone(pool) : 0); *ast_iter = new (pool) MemInitializerListAST((iter->value) ? iter->value->clone(pool) : 0);
ast->dot_dot_dot_token = dot_dot_dot_token;
return ast; return ast;
} }

View File

@@ -570,6 +570,8 @@ bool ASTMatcher::match(ClassSpecifierAST *node, ClassSpecifierAST *pattern)
else if (! AST::match(node->base_clause_list, pattern->base_clause_list, this)) else if (! AST::match(node->base_clause_list, pattern->base_clause_list, this))
return false; return false;
pattern->dot_dot_dot_token = node->dot_dot_dot_token;
pattern->lbrace_token = node->lbrace_token; pattern->lbrace_token = node->lbrace_token;
if (! pattern->member_specifier_list) if (! pattern->member_specifier_list)
@@ -706,6 +708,8 @@ bool ASTMatcher::match(CtorInitializerAST *node, CtorInitializerAST *pattern)
else if (! AST::match(node->member_initializer_list, pattern->member_initializer_list, this)) else if (! AST::match(node->member_initializer_list, pattern->member_initializer_list, this))
return false; return false;
pattern->dot_dot_dot_token = node->dot_dot_dot_token;
return true; return true;
} }

View File

@@ -1667,6 +1667,7 @@ bool Parser::parseClassSpecifier(SpecifierListAST *&node)
_inFunctionBody = false; _inFunctionBody = false;
unsigned colon_token = 0; unsigned colon_token = 0;
unsigned dot_dot_dot_token = 0;
if (LA() == T_COLON || LA() == T_LBRACE) { if (LA() == T_COLON || LA() == T_LBRACE) {
BaseSpecifierListAST *base_clause_list = 0; BaseSpecifierListAST *base_clause_list = 0;
@@ -1676,6 +1677,9 @@ bool Parser::parseClassSpecifier(SpecifierListAST *&node)
parseBaseClause(base_clause_list); parseBaseClause(base_clause_list);
if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT)
dot_dot_dot_token = consumeToken();
if (LA() != T_LBRACE) { if (LA() != T_LBRACE) {
_translationUnit->error(cursor(), "expected `{' before `%s'", tok().spell()); _translationUnit->error(cursor(), "expected `{' before `%s'", tok().spell());
@@ -1697,6 +1701,7 @@ bool Parser::parseClassSpecifier(SpecifierListAST *&node)
ast->name = name; ast->name = name;
ast->colon_token = colon_token; ast->colon_token = colon_token;
ast->base_clause_list = base_clause_list; ast->base_clause_list = base_clause_list;
ast->dot_dot_dot_token = dot_dot_dot_token;
if (LA() == T_LBRACE) if (LA() == T_LBRACE)
ast->lbrace_token = consumeToken(); ast->lbrace_token = consumeToken();