Accepts trailing return types.

This commit is contained in:
Roberto Raggi
2010-03-24 14:56:30 +01:00
parent fe1c4926de
commit cf125618af
6 changed files with 20 additions and 1 deletions

View File

@@ -1014,7 +1014,10 @@ unsigned FunctionDeclaratorAST::firstToken() const
unsigned FunctionDeclaratorAST::lastToken() const
{
if (exception_specification)
if (trailing_return_type)
return trailing_return_type->lastToken();
else if (exception_specification)
return exception_specification->lastToken();
else if (cv_qualifier_list)

View File

@@ -1421,6 +1421,7 @@ public:
unsigned rparen_token;
SpecifierListAST *cv_qualifier_list;
ExceptionSpecificationAST *exception_specification;
TrailingReturnTypeAST *trailing_return_type;
ExpressionAST *as_cpp_initializer;
public: // annotations
@@ -1433,6 +1434,7 @@ public:
, rparen_token(0)
, cv_qualifier_list(0)
, exception_specification(0)
, trailing_return_type(0)
, as_cpp_initializer(0)
, symbol(0)
{}

View File

@@ -474,6 +474,8 @@ FunctionDeclaratorAST *FunctionDeclaratorAST::clone(MemoryPool *pool) const
*ast_iter = new (pool) SpecifierListAST((iter->value) ? iter->value->clone(pool) : 0);
if (exception_specification)
ast->exception_specification = exception_specification->clone(pool);
if (trailing_return_type)
ast->trailing_return_type = trailing_return_type->clone(pool);
if (as_cpp_initializer)
ast->as_cpp_initializer = as_cpp_initializer->clone(pool);
return ast;

View File

@@ -780,6 +780,11 @@ bool ASTMatcher::match(FunctionDeclaratorAST *node, FunctionDeclaratorAST *patte
else if (! AST::match(node->exception_specification, pattern->exception_specification, this))
return false;
if (! pattern->trailing_return_type)
pattern->trailing_return_type = node->trailing_return_type;
else if (! AST::match(node->trailing_return_type, pattern->trailing_return_type, this))
return false;
if (! pattern->as_cpp_initializer)
pattern->as_cpp_initializer = node->as_cpp_initializer;
else if (! AST::match(node->as_cpp_initializer, pattern->as_cpp_initializer, this))

View File

@@ -350,6 +350,7 @@ void FunctionDeclaratorAST::accept0(ASTVisitor *visitor)
accept(parameters, visitor);
accept(cv_qualifier_list, visitor);
accept(exception_specification, visitor);
accept(trailing_return_type, visitor);
accept(as_cpp_initializer, visitor);
}
visitor->endVisit(this);

View File

@@ -1315,8 +1315,14 @@ bool Parser::parseDeclarator(DeclaratorAST *&node, bool stopAtCppInitializer)
}
ast->rparen_token = consumeToken();
// ### parse attributes
parseCvQualifiers(ast->cv_qualifier_list);
// ### parse ref-qualifiers
parseExceptionSpecification(ast->exception_specification);
if (_cxx0xEnabled && ! node->ptr_operator_list && LA() == T_ARROW)
parseTrailingReturnType(ast->trailing_return_type);
*postfix_ptr = new (_pool) PostfixDeclaratorListAST(ast);
postfix_ptr = &(*postfix_ptr)->next;
} else if (LA() == T_LBRACKET) {