From 6b0865dbf6bd9488e8005da0ad700a0a21f07ebf Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 21 Apr 2026 16:58:49 +0300 Subject: [PATCH] tests: add test for pointer access on interface method value (fixes #22237) --- .gitignore | 1 + ...ce_pointer_method_value_issue_22237_test.v | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 vlib/v/tests/interfaces/interface_pointer_method_value_issue_22237_test.v diff --git a/.gitignore b/.gitignore index 73972055d..7f998a939 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ !vlib/v/checker/tests/*.out !vlib/v/gen/c/testdata/nested_unary_minus_regression.vv !vlib/v/gen/c/testdata/nested_unary_minus_regression.out +!vlib/v/tests/interfaces/interface_pointer_method_value_issue_22237_test.v # unignore c codegen testdata files !vlib/v/gen/c/testdata/*.vv diff --git a/vlib/v/tests/interfaces/interface_pointer_method_value_issue_22237_test.v b/vlib/v/tests/interfaces/interface_pointer_method_value_issue_22237_test.v new file mode 100644 index 000000000..60cfee0fc --- /dev/null +++ b/vlib/v/tests/interfaces/interface_pointer_method_value_issue_22237_test.v @@ -0,0 +1,41 @@ +interface Named { + name string +} + +fn (n Named) hello() string { + return 'hello ${n.name}' +} + +struct Sa { + name string + age int +} + +fn (s Sa) ttt() string { + return '${s.name} // ${s.age}' +} + +struct Sb { + name string +} + +type Sum = Sa | Sb + +fn rebound_interface_method(t Sum) string { + match t { + Sa { + tt := t as Sa + mut out := unsafe { (&Sa(&t)).ttt } + iface := unsafe { &Named(&tt) } + out = iface.hello + return out() + } + Sb { + return 'sb' + } + } +} + +fn test_reassign_bound_method_from_interface_pointer_inside_sumtype_match() { + assert rebound_interface_method(Sa{ name: 'mytype', age: 10 }) == 'hello mytype' +} -- 2.39.5