From 27cd21e4591e9bccc8822ddf528b2b8ab5af944d Mon Sep 17 00:00:00 2001 From: yuyi Date: Fri, 15 Oct 2021 16:32:58 +0800 Subject: [PATCH] cgen: fix infix ops, for cross assignments of types with overloaded operators (#12192) --- vlib/v/gen/c/cgen.v | 19 ++++++++++++++++--- vlib/v/tests/cross_assign_test.v | 11 +++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index dce9c35533..fb1a66a768 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -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()) diff --git a/vlib/v/tests/cross_assign_test.v b/vlib/v/tests/cross_assign_test.v index 61d4d59986..7b53987c5c 100644 --- a/vlib/v/tests/cross_assign_test.v +++ b/vlib/v/tests/cross_assign_test.v @@ -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 +}