diff --git a/fine/src/parser.rs b/fine/src/parser.rs index 723dbe92..b2f5e460 100644 --- a/fine/src/parser.rs +++ b/fine/src/parser.rs @@ -675,6 +675,13 @@ fn return_type(p: &mut CParser) { p.expect_start(TokenKind::Arrow); type_expr(p); + if !p.at(TokenKind::LeftBrace) { + p.error("expected a block after a return type"); + while !p.at_any(STATEMENT_RECOVERY) && !p.eof() { + p.advance(); + } + } + p.end(m, TreeKind::ReturnType); } diff --git a/fine/src/semantics.rs b/fine/src/semantics.rs index a9aa72cc..c447ec57 100644 --- a/fine/src/semantics.rs +++ b/fine/src/semantics.rs @@ -1907,7 +1907,7 @@ fn check_return_statement(s: &Semantics, tree: &Tree) { let function_type = s.type_of(enclosing_function); match function_type { - Type::Function(_, expected_type) => { + Type::Function(_, expected_type) | Type::Method(_, _, expected_type) => { let actual_type = if let Some(expr) = tree.nth_tree(1) { s.type_of(expr) } else { diff --git a/fine/tests/expression/alternates.fine b/fine/tests/expression/alternates.fine index bcee2edb..45dcb868 100644 --- a/fine/tests/expression/alternates.fine +++ b/fine/tests/expression/alternates.fine @@ -127,5 +127,5 @@ fun test() -> f64 { // like the above. } -/// @ignore WIP +// @ignore WIP // @no-errors \ No newline at end of file