From 3245377683487ce41a011136252704f266bec594 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Sun, 21 Jul 2019 00:49:34 +0200 Subject: [PATCH] fix defer before returns --- compiler/parser.v | 12 ++++++++++-- compiler/tests/defer_test.v | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 compiler/tests/defer_test.v diff --git a/compiler/parser.v b/compiler/parser.v index 75c3c20aa9..ccc99c28b1 100644 --- a/compiler/parser.v +++ b/compiler/parser.v @@ -3206,7 +3206,6 @@ else { } fn (p mut Parser) return_st() { - p.cgen.insert_before(p.cur_fn.defer_text) p.check(.key_return) p.fgen(' ') fn_returns := p.cur_fn.typ != 'void' @@ -3223,11 +3222,20 @@ fn (p mut Parser) return_st() { ret := p.cgen.cur_line.right(ph) p.cgen.resetln('$expr_type $tmp = ($expr_type)($ret);') + p.cgen(p.cur_fn.defer_text) p.gen('return opt_ok(&$tmp, sizeof($expr_type))') } else { ret := p.cgen.cur_line.right(ph) - p.cgen.resetln('return $ret') + p.cgen(p.cur_fn.defer_text) + if expr_type == 'void*' { + p.cgen.resetln('return $ret') + } else { + tmp := p.get_tmp() + p.cgen.resetln('$expr_type $tmp = $ret;') + p.genln(p.cur_fn.defer_text) + p.genln('return $tmp;') + } } p.check_types(expr_type, p.cur_fn.typ) } diff --git a/compiler/tests/defer_test.v b/compiler/tests/defer_test.v new file mode 100644 index 0000000000..749fd3595b --- /dev/null +++ b/compiler/tests/defer_test.v @@ -0,0 +1,15 @@ +fn foo() string { + println('foo()') + return 'foo' +} + +fn foo2() string { + println('start') + defer { println('defer') } + println('end') + return foo() +} + +fn test_defer() { + assert foo2() == 'foo' +}