From 51f5841b6ee58aad78395ecd0a23e4ede224fdc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Jen=C3=9F?= Date: Mon, 1 Nov 2021 00:26:15 +0100 Subject: [PATCH] checker: do not deref non-pointer types in `fn_signature_using_aliases` (#12340) --- vlib/v/ast/types.v | 4 +++- ...erface_sameness_check_for_mutable_methods.out | 8 ++++++++ ...terface_sameness_check_for_mutable_methods.vv | 16 ++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 vlib/v/checker/tests/interface_sameness_check_for_mutable_methods.out create mode 100644 vlib/v/checker/tests/interface_sameness_check_for_mutable_methods.vv diff --git a/vlib/v/ast/types.v b/vlib/v/ast/types.v index e61c089f0f..07c9ae9195 100644 --- a/vlib/v/ast/types.v +++ b/vlib/v/ast/types.v @@ -1150,7 +1150,9 @@ pub fn (t &Table) fn_signature_using_aliases(func &Fn, import_aliases map[string param := func.params[i] mut typ := param.typ if param.is_mut { - typ = typ.deref() + if param.typ.is_ptr() { + typ = typ.deref() + } sb.write_string('mut ') } if !opts.type_only { diff --git a/vlib/v/checker/tests/interface_sameness_check_for_mutable_methods.out b/vlib/v/checker/tests/interface_sameness_check_for_mutable_methods.out new file mode 100644 index 0000000000..216c817a68 --- /dev/null +++ b/vlib/v/checker/tests/interface_sameness_check_for_mutable_methods.out @@ -0,0 +1,8 @@ +vlib/v/checker/tests/interface_sameness_check_for_mutable_methods.vv:15:6: error: `St` incorrectly implements method `method` of interface `Interface`: expected return type `u32` + 13 | + 14 | fn bar() { + 15 | foo(St{}) + | ~~~~ + 16 | } +Details: main.Interface has `fn method(mut x main.Interface) u32` + main.St has `fn method(st main.St) int` diff --git a/vlib/v/checker/tests/interface_sameness_check_for_mutable_methods.vv b/vlib/v/checker/tests/interface_sameness_check_for_mutable_methods.vv new file mode 100644 index 0000000000..8d3d5d9646 --- /dev/null +++ b/vlib/v/checker/tests/interface_sameness_check_for_mutable_methods.vv @@ -0,0 +1,16 @@ +interface Interface { +mut: + method() u32 +} + +struct St {} + +fn (st St) method() int { + panic('') +} + +fn foo(_ Interface) {} + +fn bar() { + foo(St{}) +}