Revert "Allow only one return"

This reverts commit 18602d00a1.
This commit is contained in:
2025-03-02 10:45:54 +01:00
parent 75561fd18a
commit 09f204bd16
10 changed files with 231 additions and 79 deletions

View File

@ -294,7 +294,6 @@ namespace gcc
if (definition->body != nullptr)
{
definition->body->accept(this);
visit_return(definition->returning);
tree mapping = leave_scope();
BLOCK_SUPERCONTEXT(BIND_EXPR_BLOCK(mapping)) = fndecl;
@ -335,7 +334,7 @@ namespace gcc
{
BLOCK_SUPERCONTEXT(it) = new_block;
}
tree bind_expr = build3(BIND_EXPR, void_type_node, variables, f_binding_level->statement_list, new_block);
tree bind_expr = build3(BIND_EXPR, void_type_node, variables, chain_defer(), new_block);
this->symbol_map = this->symbol_map->scope();
f_binding_level = f_binding_level->level_chain;
@ -1085,8 +1084,10 @@ namespace gcc
}
}
void generic_visitor::visit_return(boot::expression *const return_expression)
void generic_visitor::visit(boot::return_statement *statement)
{
boot::expression *return_expression = statement->return_expression();
if (return_expression == nullptr)
{
return;
@ -1206,5 +1207,11 @@ namespace gcc
this->current_expression = build_pointer_type_for_mode(procedure_type_node, VOIDmode, true);
}
void generic_visitor::visit(boot::defer_statement *statement)
{
enter_scope();
visit_statements(statement->statements);
defer(leave_scope());
}
}
}

View File

@ -91,7 +91,40 @@ namespace gcc
void append_statement(tree statement_tree)
{
append_to_statement_list(statement_tree, &f_binding_level->statement_list);
if (!vec_safe_is_empty(f_binding_level->defers))
{
append_to_statement_list(statement_tree, &f_binding_level->defers->begin()->try_statements);
}
else
{
append_to_statement_list(statement_tree, &f_binding_level->statement_list);
}
}
void defer(tree statement_tree)
{
defer_scope new_defer{ statement_tree, alloc_stmt_list() };
vec_safe_insert(f_binding_level->defers, 0, new_defer);
}
tree chain_defer()
{
if (vec_safe_is_empty(f_binding_level->defers))
{
return f_binding_level->statement_list;
}
defer_scope *defer_iterator = f_binding_level->defers->begin();
tree defer_tree = build2(TRY_FINALLY_EXPR, void_type_node,
defer_iterator->try_statements, defer_iterator->defer_block);
int i;
FOR_EACH_VEC_ELT_FROM(*f_binding_level->defers, i, defer_iterator, 1)
{
append_to_statement_list(defer_tree, &defer_iterator->try_statements);
defer_tree = build2(TRY_FINALLY_EXPR, void_type_node,
defer_iterator->try_statements, defer_iterator->defer_block);
}
return build2(COMPOUND_EXPR, TREE_TYPE(defer_tree), f_binding_level->statement_list, defer_tree);
}
tree build_field(location_t location, tree record_type, const std::string name, tree type)