From ce1978ecde18c3f4c9cf8d1e9fff44eaf6637844 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 19 Feb 2023 10:00:29 -0300 Subject: [PATCH] parser: disallow defining methods on option receivers - `fn (x ?Type) method() {` (#17351) --- vlib/v/checker/fn.v | 3 +++ vlib/v/checker/tests/option_in_receiver_err.out | 7 +++++++ vlib/v/checker/tests/option_in_receiver_err.vv | 12 ++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 vlib/v/checker/tests/option_in_receiver_err.out create mode 100644 vlib/v/checker/tests/option_in_receiver_err.vv diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 0fccc2111..2a3e2610d 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -146,6 +146,9 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) { } } if node.is_method { + if node.receiver.typ.has_flag(.option) { + c.error('option types cannot have methods', node.receiver_pos) + } mut sym := c.table.sym(node.receiver.typ) if sym.kind == .array && !c.is_builtin_mod && node.name == 'map' { // TODO `node.map in array_builtin_methods` diff --git a/vlib/v/checker/tests/option_in_receiver_err.out b/vlib/v/checker/tests/option_in_receiver_err.out new file mode 100644 index 000000000..111e0ddf9 --- /dev/null +++ b/vlib/v/checker/tests/option_in_receiver_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/option_in_receiver_err.vv:10:9: error: option types cannot have methods + 8 | } + 9 | + 10 | fn (mut f ?Foo) t1(arr ?[]int) ?string { + | ~~~ + 11 | return arr?.len.str() + 12 | } diff --git a/vlib/v/checker/tests/option_in_receiver_err.vv b/vlib/v/checker/tests/option_in_receiver_err.vv new file mode 100644 index 000000000..0c1eb3c76 --- /dev/null +++ b/vlib/v/checker/tests/option_in_receiver_err.vv @@ -0,0 +1,12 @@ +struct Foo { +mut: + name string +} + +fn (mut f Foo) t0(arr ?[]int) ?string { + return arr?.len.str() +} + +fn (mut f ?Foo) t1(arr ?[]int) ?string { + return arr?.len.str() +} \ No newline at end of file -- 2.39.5