From 3ca4f5fadafd81f8c268112b70b11a98c1d04aff Mon Sep 17 00:00:00 2001 From: joe-conigliaro Date: Wed, 22 Apr 2020 18:41:57 +1000 Subject: [PATCH] checker/parser: anon fn call & return type fix --- vlib/v/checker/checker.v | 1 + vlib/v/parser/parser.v | 2 +- vlib/v/tests/fn_test.v | 21 +++++++++++---------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 50868862a6..cf1069f394 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1361,6 +1361,7 @@ pub fn (c mut Checker) expr(node ast.Expr) table.Type { return table.string_type } ast.AnonFn { + c.fn_return_type = it.decl.return_type c.stmts(it.decl.stmts) return it.typ } diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 6e4bfe4904..3c2aac986b 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -622,7 +622,7 @@ pub fn (mut p Parser) name_expr() ast.Expr { name_w_mod := p.prepend_mod(name) // type cast. TODO: finish // if name in table.builtin_type_names { - if (name in p.table.type_idxs || name_w_mod in p.table.type_idxs) && !(name in ['C.stat', + if !known_var && (name in p.table.type_idxs || name_w_mod in p.table.type_idxs) && !(name in ['C.stat', 'C.sigaction' ]) { // TODO handle C.stat() diff --git a/vlib/v/tests/fn_test.v b/vlib/v/tests/fn_test.v index ece36ed611..b6d8dbd620 100644 --- a/vlib/v/tests/fn_test.v +++ b/vlib/v/tests/fn_test.v @@ -104,7 +104,8 @@ fn test_mut_ptr() { } fn high_fn(f fn(int) int) { - + x := f(111) + println('x == $x') } fn high_fn_no_ret(f fn(int)) { @@ -132,19 +133,19 @@ fn test_anon_fn() { f1 := fn(a int){ println('hello from f1') } - f1(1) - f2 := fn(a int){ + + f2 := fn(a int) int { println('hello from f2') + return 10 } + f2res := f2(1) + println('f2res == $f2res') + // assert f2res == 10 - f2(1) - - // TODO: fix return - // high_fn(fn (x int) int { - // println('hello') - // return x + 1 - // }) + high_fn(fn (x int) int { + return x + 1 + }) high_fn_no_ret(fn (x int) { println('hello $x')