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 ')
 | 
								g.write('return ')
 | 
				
			||||||
			styp = g.typ(g.fn_decl.return_type)
 | 
								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
 | 
							// Use this to keep the tmp assignments in order
 | 
				
			||||||
		mut multi_unpack := ''
 | 
							mut multi_unpack := ''
 | 
				
			||||||
		g.write('($styp){')
 | 
							g.write('($styp){')
 | 
				
			||||||
| 
						 | 
					@ -2814,14 +2806,30 @@ fn (mut g Gen) return_statement(node ast.Return) {
 | 
				
			||||||
				c := expr as ast.CallExpr
 | 
									c := expr as ast.CallExpr
 | 
				
			||||||
				expr_sym := g.table.get_type_symbol(c.return_type)
 | 
									expr_sym := g.table.get_type_symbol(c.return_type)
 | 
				
			||||||
				// Create a tmp for this call
 | 
									// Create a tmp for this call
 | 
				
			||||||
				tmp := g.new_tmp_var()
 | 
									mut tmp := g.new_tmp_var()
 | 
				
			||||||
				s := g.go_before_stmt(0)
 | 
									if !c.return_type.has_flag(.optional) {
 | 
				
			||||||
				expr_styp := g.typ(c.return_type)
 | 
										s := g.go_before_stmt(0)
 | 
				
			||||||
				g.write('$expr_styp $tmp=')
 | 
										expr_styp := g.typ(c.return_type)
 | 
				
			||||||
				g.expr(expr)
 | 
										g.write('$expr_styp $tmp=')
 | 
				
			||||||
				g.writeln(';')
 | 
										g.expr(expr)
 | 
				
			||||||
				multi_unpack += g.go_before_stmt(0)
 | 
										g.writeln(';')
 | 
				
			||||||
				g.write(s)
 | 
										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
 | 
									expr_types := expr_sym.mr_info().types
 | 
				
			||||||
				for j, _ in expr_types {
 | 
									for j, _ in expr_types {
 | 
				
			||||||
					g.write('.arg$arg_idx=${tmp}.arg$j')
 | 
										g.write('.arg$arg_idx=${tmp}.arg$j')
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue