Commit dfa7f148 authored by Tom Niget's avatar Tom Niget

Insert co_return if coroutine has no return statement

parent f1bb683f
...@@ -4,7 +4,7 @@ from dataclasses import dataclass ...@@ -4,7 +4,7 @@ from dataclasses import dataclass
from typing import Iterable, Optional from typing import Iterable, Optional
from transpiler.phases.typing.scope import Scope 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.utils import compare_ast
from transpiler.phases.emit_cpp import NodeVisitor, CoroutineMode, flatmap from transpiler.phases.emit_cpp import NodeVisitor, CoroutineMode, flatmap
from transpiler.phases.emit_cpp.expr import ExpressionVisitor from transpiler.phases.emit_cpp.expr import ExpressionVisitor
...@@ -103,6 +103,21 @@ class BlockVisitor(NodeVisitor): ...@@ -103,6 +103,21 @@ class BlockVisitor(NodeVisitor):
yield "{" 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: for child in node.body:
from transpiler.phases.emit_cpp.function import FunctionVisitor from transpiler.phases.emit_cpp.function import FunctionVisitor
child_visitor = FunctionVisitor(inner_scope, CoroutineMode.ASYNC) child_visitor = FunctionVisitor(inner_scope, CoroutineMode.ASYNC)
...@@ -113,6 +128,9 @@ class BlockVisitor(NodeVisitor): ...@@ -113,6 +128,9 @@ class BlockVisitor(NodeVisitor):
yield f" {name};" yield f" {name};"
yield from child_visitor.visit(child) yield from child_visitor.visit(child)
if not has_return and isinstance(node.type.return_type, Promise):
yield "co_return;"
yield "}" 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