@VisitorCore.visit.dispatch
def visit(self, node: astx.FunctionReturn) -> None:
"""
title: Visit FunctionReturn nodes.
parameters:
node:
type: astx.FunctionReturn
"""
if self._current_generator_frame_ptr is not None:
cast(Any, self)._emit_generator_stop(node)
return
return_resolution = self._semantic_return_resolution(node)
if return_resolution.returns_void:
self._emit_active_cleanups()
self._llvm.ir_builder.ret_void()
return
if node.value is not None:
self.visit_child(node.value)
retval = require_lowered_value(
safe_pop(self.result_stack),
node=node.value,
context="return expression",
)
else:
retval = None
if retval is None:
raise_lowering_internal_error(
"return expression did not lower to a value",
node=node,
)
retval = self._cast_ast_value(
retval,
source_type=self._resolved_ast_type(node.value),
target_type=return_resolution.expected_type,
)
fn_return_type = (
self._llvm.ir_builder.function.function_type.return_type
)
if is_int_type(fn_return_type) and fn_return_type.width == 1:
if is_int_type(retval.type) and retval.type.width != 1:
retval = self._llvm.ir_builder.trunc(retval, ir.IntType(1))
self._emit_active_cleanups()
self._llvm.ir_builder.ret(retval)