@@ -119,8 +119,8 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) {
119119 g.expr (arg.expr)
120120 g.writeln (';' )
121121 }
122- call_ret_type := node.call_expr.return_type
123- s_ret_typ := g.styp (call_ret_type)
122+ call_ret_type := g. unwrap_generic ( node.call_expr.return_type)
123+ s_ret_typ := g.styp (g. unwrap_generic ( call_ret_type) )
124124 if g.pref.os == .windows && call_ret_type != ast.void_type {
125125 g.writeln ('${arg_tmp_var} ->ret_ptr = (void *) builtin___v_malloc(sizeof(${s_ret_typ} ));' )
126126 }
@@ -182,14 +182,17 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) {
182182 if should_register {
183183 g.type_definitions.writeln ('\n typedef struct ${wrapper_struct_name} {' )
184184 mut fn_var := ''
185+ mut wrapper_return_type := call_ret_type
185186 if node.call_expr.is_fn_var {
186187 fn_sym := g.table.sym (node.call_expr.fn_var_type)
187188 info := fn_sym.info as ast.FnType
188- fn_var = g.fn_var_signature (ast.void_type, info.func.return_type, info.func.params.map (it .typ),
189+ wrapper_return_type = info.func.return_type
190+ fn_var = g.fn_var_signature (ast.void_type, wrapper_return_type, info.func.params.map (it .typ),
189191 'fn' )
190192 } else if node.call_expr.left is ast.AnonFn {
191193 f := node.call_expr.left.decl
192- fn_var = g.fn_var_signature (ast.void_type, f.return_type, f.params.map (it .typ),
194+ wrapper_return_type = f.return_type
195+ fn_var = g.fn_var_signature (ast.void_type, wrapper_return_type, f.params.map (it .typ),
193196 'fn' )
194197 } else {
195198 if node.call_expr.is_method {
@@ -198,6 +201,7 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) {
198201 mut muttable := unsafe { & ast.Table (g.table) }
199202 return_type := muttable.convert_generic_type (f.return_type, f.generic_names,
200203 node.call_expr.concrete_types) or { f.return_type }
204+ wrapper_return_type = return_type
201205 mut arg_types := f.params.map (it .typ)
202206 arg_types = arg_types.map (muttable.convert_generic_type (it , f.generic_names,
203207 node.call_expr.concrete_types) or { it })
@@ -209,6 +213,7 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) {
209213 concrete_types := node.call_expr.concrete_types.map (g.unwrap_generic (it ))
210214 return_type := g.table.convert_generic_type (f.return_type, f.generic_names,
211215 concrete_types) or { f.return_type }
216+ wrapper_return_type = return_type
212217 mut arg_types := f.params.map (it .typ)
213218 arg_types = arg_types.map (g.table.convert_generic_type (it , f.generic_names,
214219 concrete_types) or { it })
@@ -230,14 +235,16 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) {
230235 }
231236 }
232237 }
238+ wrapper_return_type = g.unwrap_generic (wrapper_return_type)
239+ wrapper_s_ret_typ := g.styp (wrapper_return_type)
233240 if fn_var != '' {
234241 g.type_definitions.writeln ('\t ${fn_var} ;' )
235242 }
236243 if expr.is_method {
237244 styp := g.styp (expr.receiver_type)
238245 g.type_definitions.writeln ('\t ${styp} arg0;' )
239246 }
240- need_return_ptr := g.pref.os == .windows && call_ret_type != ast.void_type
247+ need_return_ptr := g.pref.os == .windows && wrapper_return_type != ast.void_type
241248 for i, arg in expr.args {
242249 arg_sym := g.table.sym (arg.typ)
243250 if arg_sym.info is ast.FnType {
@@ -256,13 +263,13 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) {
256263 thread_ret_type := if g.pref.os == .windows { 'u32' } else { 'void*' }
257264 g.waiter_fn_definitions.writeln ('${g.static_non_parallel}${thread_ret_type} ${wrapper_fn_name} (${wrapper_struct_name} *arg);' )
258265 g.gowrappers.writeln ('${thread_ret_type} ${wrapper_fn_name} (${wrapper_struct_name} *arg) {' )
259- if call_ret_type != ast.void_type {
266+ if wrapper_return_type != ast.void_type {
260267 if g.pref.os == .windows {
261- g.gowrappers.write_string ('\t *((${s_ret_typ } *)(arg->ret_ptr)) = ' )
268+ g.gowrappers.write_string ('\t *((${wrapper_s_ret_typ } *)(arg->ret_ptr)) = ' )
262269 } else {
263- g.gowrappers.writeln ('\t ${s_ret_typ } * ret_ptr = (${s_ret_typ } *) builtin___v_malloc(sizeof(${s_ret_typ } ));' )
270+ g.gowrappers.writeln ('\t ${wrapper_s_ret_typ } * ret_ptr = (${wrapper_s_ret_typ } *) builtin___v_malloc(sizeof(${wrapper_s_ret_typ } ));' )
264271 $if tinyc && arm64 {
265- g.gowrappers.write_string ('\t ${s_ret_typ } tcc_bug_tmp_var = ' )
272+ g.gowrappers.write_string ('\t ${wrapper_s_ret_typ } tcc_bug_tmp_var = ' )
266273 } $else {
267274 g.gowrappers.write_string ('\t *ret_ptr = ' )
268275 }
@@ -355,14 +362,14 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) {
355362 }
356363 g.gowrappers.writeln (');' )
357364 $if tinyc && arm64 {
358- if g.pref.os != .windows && call_ret_type != ast.void_type {
365+ if g.pref.os != .windows && wrapper_return_type != ast.void_type {
359366 g.gowrappers.writeln ('\t *ret_ptr = tcc_bug_tmp_var;' )
360367 }
361368 }
362369 if is_spawn {
363370 g.gowrappers.writeln ('\t builtin___v_free(arg);' )
364371 }
365- if g.pref.os != .windows && call_ret_type != ast.void_type {
372+ if g.pref.os != .windows && wrapper_return_type != ast.void_type {
366373 g.gowrappers.writeln ('\t return ret_ptr;' )
367374 } else {
368375 g.gowrappers.writeln ('\t return 0;' )
0 commit comments