From f7acfd588d0e9002b918690d1f163437daeaa1bf Mon Sep 17 00:00:00 2001 From: John Doty Date: Thu, 1 Feb 2024 06:35:43 -0800 Subject: [PATCH] [fine] Even more resilience, I can stop now Also fix a bug, could not return from a method OOPS --- fine/src/parser.rs | 7 +++++++ fine/src/semantics.rs | 2 +- fine/tests/expression/alternates.fine | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) 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