Commit 051607fe authored by Tom Niget's avatar Tom Niget

Insert co_return if coroutine has no return statement

parent e98b341f
......@@ -4,7 +4,7 @@ from dataclasses import dataclass
from typing import Iterable, Optional
from transpiler.phases.typing.scope import Scope
from transpiler.phases.typing.types import BaseType, TY_INT, TY_BOOL, TypeVariable
from transpiler.phases.typing.types import BaseType, TY_INT, TY_BOOL, TypeVariable, Promise
from transpiler.utils import compare_ast
from transpiler.phases.emit_cpp import NodeVisitor, CoroutineMode, flatmap
from transpiler.phases.emit_cpp.expr import ExpressionVisitor
......@@ -103,6 +103,21 @@ class BlockVisitor(NodeVisitor):
yield "{"
class ReturnVisitor(SearchVisitor):
def visit_Return(self, node: ast.Return) -> bool:
yield True
def visit_Yield(self, node: ast.Yield) -> bool:
yield True
def visit_FunctionDef(self, node: ast.FunctionDef):
yield from ()
def visit_ClassDef(self, node: ast.ClassDef):
yield from ()
has_return = ReturnVisitor().match(node.body)
for child in node.body:
from transpiler.phases.emit_cpp.function import FunctionVisitor
child_visitor = FunctionVisitor(inner_scope, CoroutineMode.ASYNC)
......@@ -113,6 +128,9 @@ class BlockVisitor(NodeVisitor):
yield f" {name};"
yield from child_visitor.visit(child)
if not has_return and isinstance(node.type.return_type, Promise):
yield "co_return;"
yield "}"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment