cgen: fix infix ops, for cross assignments of types with overloaded operators (#12192)
							parent
							
								
									814b4ebb4c
								
							
						
					
					
						commit
						27cd21e459
					
				|  | @ -3269,9 +3269,22 @@ fn (mut g Gen) gen_cross_tmp_variable(left []ast.Expr, val ast.Expr) { | |||
| 			} | ||||
| 		} | ||||
| 		ast.InfixExpr { | ||||
| 			g.gen_cross_tmp_variable(left, val.left) | ||||
| 			g.write(val.op.str()) | ||||
| 			g.gen_cross_tmp_variable(left, val.right) | ||||
| 			sym := g.table.get_type_symbol(val.left_type) | ||||
| 			if _ := g.table.type_find_method(sym, val.op.str()) { | ||||
| 				left_styp := g.typ(val.left_type.set_nr_muls(0)) | ||||
| 				g.write(left_styp) | ||||
| 				g.write('_') | ||||
| 				g.write(util.replace_op(val.op.str())) | ||||
| 				g.write('(') | ||||
| 				g.gen_cross_tmp_variable(left, val.left) | ||||
| 				g.write(', ') | ||||
| 				g.gen_cross_tmp_variable(left, val.right) | ||||
| 				g.write(')') | ||||
| 			} else { | ||||
| 				g.gen_cross_tmp_variable(left, val.left) | ||||
| 				g.write(val.op.str()) | ||||
| 				g.gen_cross_tmp_variable(left, val.right) | ||||
| 			} | ||||
| 		} | ||||
| 		ast.PrefixExpr { | ||||
| 			g.write(val.op.str()) | ||||
|  |  | |||
|  | @ -1,3 +1,5 @@ | |||
| import math.big | ||||
| 
 | ||||
| // Test cross assign of array elements
 | ||||
| fn test_cross_assign_of_array() { | ||||
| 	mut a := [0, 1] | ||||
|  | @ -157,3 +159,12 @@ fn test_cross_assign_of_complex_types() { | |||
| 	assert x.a == 2 | ||||
| 	assert x.b == -1 | ||||
| } | ||||
| 
 | ||||
| fn test_cross_assign_of_big_int() { | ||||
| 	mut a := big.zero_int | ||||
| 	mut b := big.one_int | ||||
| 
 | ||||
| 	a, b = a + b, a | ||||
| 	println(a) | ||||
| 	assert a == big.one_int | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue