From b21e5b71ba8dddd2793728a33cd039594fd9c7dc Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Thu, 22 Dec 2022 20:58:52 -0300 Subject: [PATCH] cgen: fix call arg type changing on match expr (#16744) --- vlib/v/gen/c/fn.v | 3 +-- vlib/v/tests/sumtype_on_match_test.v | 35 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 vlib/v/tests/sumtype_on_match_test.v diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 0ebce349d2..4850eb70d6 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -1719,8 +1719,7 @@ fn (mut g Gen) call_args(node ast.CallExpr) { exp_sym := g.table.sym(expected_types[i]) orig_sym := g.table.sym(arg.expr.obj.orig_type) if orig_sym.kind != .interface_ && (exp_sym.kind != .sum_type - || (exp_sym.kind == .sum_type - && expected_types[i] != arg.expr.obj.orig_type)) { + && expected_types[i] != arg.expr.obj.orig_type) { expected_types[i] = g.unwrap_generic(arg.expr.obj.smartcasts.last()) cast_sym := g.table.sym(expected_types[i]) if cast_sym.info is ast.Aggregate { diff --git a/vlib/v/tests/sumtype_on_match_test.v b/vlib/v/tests/sumtype_on_match_test.v new file mode 100644 index 0000000000..ee7f77d13c --- /dev/null +++ b/vlib/v/tests/sumtype_on_match_test.v @@ -0,0 +1,35 @@ +struct MotionEvent {} + +struct ButtonEvent {} + +struct WheelEvent {} + +type Event = ButtonEvent | MotionEvent | WheelEvent + +type GameEvent = ButtonEvent | MotionEvent + +fn test_main() { + be := ButtonEvent{} + assert handle_event(be) == true + e := Event(be) + assert handle_event(e) == true + match e { + MotionEvent { + assert handle_game_event(e) == true + } + ButtonEvent { + assert handle_game_event(e) == true + } + else {} + } +} + +fn handle_game_event(ge GameEvent) bool { + is_button_event := ge is ButtonEvent + return is_button_event +} + +fn handle_event(e Event) bool { + is_button_event := e is ButtonEvent + return is_button_event +}