cgen: properly handle more multi-return edge cases (#5933)
							parent
							
								
									76c8e28e86
								
							
						
					
					
						commit
						0f98445f7f
					
				|  | @ -2796,14 +2796,6 @@ fn (mut g Gen) return_statement(node ast.Return) { | |||
| 			g.write('return ') | ||||
| 			styp = g.typ(g.fn_decl.return_type) | ||||
| 		} | ||||
| 		// Edge case handling for 2 multi returns of the same type
 | ||||
| 		if node.exprs.len == 1 && g.expr_is_multi_return_call(node.exprs[0]) { | ||||
| 			g.go_before_stmt(0) | ||||
| 			g.write('return ') | ||||
| 			g.expr(node.exprs[0]) | ||||
| 			g.writeln(';') | ||||
| 			return | ||||
| 		} | ||||
| 		// Use this to keep the tmp assignments in order
 | ||||
| 		mut multi_unpack := '' | ||||
| 		g.write('($styp){') | ||||
|  | @ -2814,14 +2806,30 @@ fn (mut g Gen) return_statement(node ast.Return) { | |||
| 				c := expr as ast.CallExpr | ||||
| 				expr_sym := g.table.get_type_symbol(c.return_type) | ||||
| 				// Create a tmp for this call
 | ||||
| 				tmp := g.new_tmp_var() | ||||
| 				s := g.go_before_stmt(0) | ||||
| 				expr_styp := g.typ(c.return_type) | ||||
| 				g.write('$expr_styp $tmp=') | ||||
| 				g.expr(expr) | ||||
| 				g.writeln(';') | ||||
| 				multi_unpack += g.go_before_stmt(0) | ||||
| 				g.write(s) | ||||
| 				mut tmp := g.new_tmp_var() | ||||
| 				if !c.return_type.has_flag(.optional) { | ||||
| 					s := g.go_before_stmt(0) | ||||
| 					expr_styp := g.typ(c.return_type) | ||||
| 					g.write('$expr_styp $tmp=') | ||||
| 					g.expr(expr) | ||||
| 					g.writeln(';') | ||||
| 					multi_unpack += g.go_before_stmt(0) | ||||
| 					g.write(s) | ||||
| 				} else { | ||||
| 					s := g.go_before_stmt(0) | ||||
| 					// TODO
 | ||||
| 					// I (emily) am sorry for doing this
 | ||||
| 					// I cant find another way to do this so right now
 | ||||
| 					// this will have to do.
 | ||||
| 					g.tmp_count-- | ||||
| 					g.expr(expr) | ||||
| 					multi_unpack += g.go_before_stmt(0) | ||||
| 					g.write(s) | ||||
| 					// modify tmp so that it is the opt deref
 | ||||
| 					// TODO copy-paste from cgen.v:2397
 | ||||
| 					expr_styp := g.base_type(c.return_type) | ||||
| 					tmp = ('/*opt*/(*($expr_styp*)${tmp}.data)') | ||||
| 				} | ||||
| 				expr_types := expr_sym.mr_info().types | ||||
| 				for j, _ in expr_types { | ||||
| 					g.write('.arg$arg_idx=${tmp}.arg$j') | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue