mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
cgen: fix or {}
handling, when waiting for a single go thread, of a function returning !Type
(fix #16065) (#16073)
This commit is contained in:
parent
49c12e4d1c
commit
6e46933c55
@ -1885,12 +1885,20 @@ fn (mut g Gen) go_expr(node ast.GoExpr) {
|
|||||||
g.writeln('$arg_tmp_var->ret_ptr = malloc(sizeof($s_ret_typ));')
|
g.writeln('$arg_tmp_var->ret_ptr = malloc(sizeof($s_ret_typ));')
|
||||||
}
|
}
|
||||||
is_opt := node.call_expr.return_type.has_flag(.optional)
|
is_opt := node.call_expr.return_type.has_flag(.optional)
|
||||||
|
is_res := node.call_expr.return_type.has_flag(.result)
|
||||||
mut gohandle_name := ''
|
mut gohandle_name := ''
|
||||||
if node.call_expr.return_type == ast.void_type {
|
if node.call_expr.return_type == ast.void_type {
|
||||||
gohandle_name = if is_opt { '__v_thread_Option_void' } else { '__v_thread' }
|
if is_opt {
|
||||||
|
gohandle_name = '__v_thread_Option_void'
|
||||||
|
} else if is_res {
|
||||||
|
gohandle_name = '__v_thread_Result_void'
|
||||||
|
} else {
|
||||||
|
gohandle_name = '__v_thread'
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
opt := if is_opt { '${option_name}_' } else { '' }
|
opt := if is_opt { '${option_name}_' } else { '' }
|
||||||
gohandle_name = '__v_thread_$opt${g.table.sym(g.unwrap_generic(node.call_expr.return_type)).cname}'
|
res := if is_res { '${result_name}_' } else { '' }
|
||||||
|
gohandle_name = '__v_thread_$opt$res${g.table.sym(g.unwrap_generic(node.call_expr.return_type)).cname}'
|
||||||
}
|
}
|
||||||
if g.pref.os == .windows {
|
if g.pref.os == .windows {
|
||||||
simple_handle := if node.is_expr && node.call_expr.return_type != ast.void_type {
|
simple_handle := if node.is_expr && node.call_expr.return_type != ast.void_type {
|
||||||
|
@ -80,3 +80,29 @@ fn test_array_val_interate() {
|
|||||||
assert res[1] == 0.0
|
assert res[1] == 0.0
|
||||||
assert res[2] == 1.5
|
assert res[2] == 1.5
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For issue 16065
|
||||||
|
fn get_only_a_option_return(return_none bool) ? {
|
||||||
|
if return_none {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return error('msg')
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_only_a_result_return() ! {
|
||||||
|
return error('msg')
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_only_a_option_return() {
|
||||||
|
t1 := go get_only_a_option_return(true)
|
||||||
|
t1.wait() or { assert false }
|
||||||
|
t2 := go get_only_a_option_return(false)
|
||||||
|
t2.wait() or { assert true }
|
||||||
|
assert true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_only_a_result_return() {
|
||||||
|
t := go get_only_a_result_return()
|
||||||
|
t.wait() or { assert true }
|
||||||
|
assert true
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user