From 4b99d6af95890684307d968378eabaf94dc5a768 Mon Sep 17 00:00:00 2001 From: zakuro Date: Wed, 3 Feb 2021 18:40:21 +0900 Subject: [PATCH] cgen: fix bug with duplicate defer generation (#8503) --- vlib/v/ast/ast.v | 1 + vlib/v/checker/checker.v | 6 +++--- vlib/v/gen/c/fn.v | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index fe7f2e3c28..f77b33d4c2 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -332,6 +332,7 @@ pub: pub mut: stmts []Stmt return_type table.Type + has_return bool comments []Comment // comments *after* the header, but *before* `{`; used for InterfaceDecl next_comments []Comment // coments that are one line after the decl; used for InterfaceDecl source_file &File = 0 diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index e52fd036d1..c67fb2c683 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -5676,9 +5676,9 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) { if c.fn_mut_arg_names.len > 0 { c.fn_mut_arg_names.clear() } - returns := c.returns || has_top_return(node.stmts) - if node.language == .v && !node.no_body && node.return_type != table.void_type && !returns - && node.name !in ['panic', 'exit'] { + node.has_return = c.returns || has_top_return(node.stmts) + if node.language == .v && !node.no_body && node.return_type != table.void_type + && !node.has_return&& node.name !in ['panic', 'exit'] { if c.inside_anon_fn { c.error('missing return at the end of an anonymous function', node.pos) } else { diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 8bcafc0177..ef1e3bd2b3 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -192,7 +192,7 @@ fn (mut g Gen) gen_fn_decl(node ast.FnDecl, skip bool) { g.fn_mut_arg_names.clear() } - if node.return_type == table.void_type { + if !node.has_return { g.write_defer_stmts_when_needed() } if node.is_anon {