diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index b0f2e4fe4e..091d31082d 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -3656,6 +3656,7 @@ pub fn (mut c Checker) mark_as_referenced(mut node ast.Expr, as_interface bool) node.obj.is_auto_heap = true } } + .sum_type, .interface_ {} else { node.obj.is_auto_heap = true } diff --git a/vlib/v/tests/match_reference_sumtype_var_test.v b/vlib/v/tests/match_reference_sumtype_var_test.v new file mode 100644 index 0000000000..56644997c8 --- /dev/null +++ b/vlib/v/tests/match_reference_sumtype_var_test.v @@ -0,0 +1,42 @@ +struct Player { +mut: + x int + y int + level int +} + +struct Enemy { +mut: + x int + y int + damage f64 +} + +type PlayerOrEnemy = Enemy | Player + +fn test_match_reference_sumtype_var() { + mut entity := PlayerOrEnemy(Player{10, 12, 3}) + + x_move := 11 + y_move := 22 + + mut ref := &entity + + match mut entity { + Player { + entity.x += x_move + entity.y += y_move + + println('Player is moved to $entity.x, $entity.y and its level is $entity.level') + } + Enemy { + entity.x += x_move + entity.y += y_move + + println('Enemy is moved to $entity.x, $entity.y and its damage is $entity.damage') + } + } + + println(typeof(ref).name) + assert true +}