diff --git a/vlib/v/parser/fn.v b/vlib/v/parser/fn.v index 2998cc3395..0299a0df30 100644 --- a/vlib/v/parser/fn.v +++ b/vlib/v/parser/fn.v @@ -648,7 +648,8 @@ fn (mut p Parser) anon_fn() ast.AnonFn { mut return_type_pos := p.tok.position() // lpar: multiple return types if same_line { - if p.tok.kind.is_start_of_type() { + if (p.tok.kind.is_start_of_type() && (same_line || p.tok.kind != .lsbr)) + || (same_line && p.tok.kind == .key_fn) { return_type = p.parse_type() return_type_pos = return_type_pos.extend(p.tok.position()) } else if p.tok.kind != .lcbr { diff --git a/vlib/v/tests/fn_return_fn_test.v b/vlib/v/tests/fn_return_fn_test.v new file mode 100644 index 0000000000..e2a41b158e --- /dev/null +++ b/vlib/v/tests/fn_return_fn_test.v @@ -0,0 +1,20 @@ +fn make_squarer() fn (int) int { + return fn (n int) int { + return n * n + } +} + +fn test_fn_return_fn() { + squarer := make_squarer() + assert squarer(10) == 100 +} + +fn test_anon_fn_return_fn() { + make_doubler := fn () fn (int) int { + return fn (n int) int { + return n + n + } + } + doubler := make_doubler() + assert doubler(10) == 20 +}