From b1f64a32e386cbd7cd88f86e47e062186e9eadd9 Mon Sep 17 00:00:00 2001 From: Swastik Baranwal Date: Mon, 1 Jan 2024 16:57:12 +0530 Subject: [PATCH] checker: give an error for `.free()` method calls, when used on fixed arrays (#20320) --- vlib/v/checker/fn.v | 3 +++ .../checker/tests/array_fixed_no_free_method_call_err.out | 7 +++++++ .../v/checker/tests/array_fixed_no_free_method_call_err.vv | 7 +++++++ 3 files changed, 17 insertions(+) create mode 100644 vlib/v/checker/tests/array_fixed_no_free_method_call_err.out create mode 100644 vlib/v/checker/tests/array_fixed_no_free_method_call_err.vv diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 499ddde81..42dbf9c62 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -1902,6 +1902,9 @@ fn (mut c Checker) method_call(mut node ast.CallExpr) ast.Type { c.warn('manual memory management with `free()` is only allowed in unsafe code', node.pos) } + if left_sym.kind == .array_fixed { + c.error('unknown method or field: ${left_sym.name}.free()', node.pos) + } return ast.void_type } // call struct field fn type diff --git a/vlib/v/checker/tests/array_fixed_no_free_method_call_err.out b/vlib/v/checker/tests/array_fixed_no_free_method_call_err.out new file mode 100644 index 000000000..9b47a5e5a --- /dev/null +++ b/vlib/v/checker/tests/array_fixed_no_free_method_call_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/array_fixed_no_free_method_call_err.vv:5:19: error: unknown method or field: [24]u8.free() + 3 | `0`, `:`, `0`, `0`, `.`, `0`, `0`, `0`, `Z`]! + 4 | defer { + 5 | unsafe { buffer.free() } + | ~~~~~~ + 6 | } + 7 | } diff --git a/vlib/v/checker/tests/array_fixed_no_free_method_call_err.vv b/vlib/v/checker/tests/array_fixed_no_free_method_call_err.vv new file mode 100644 index 000000000..53c07ead4 --- /dev/null +++ b/vlib/v/checker/tests/array_fixed_no_free_method_call_err.vv @@ -0,0 +1,7 @@ +fn main() { + mut buffer := [u8(`0`), `0`, `0`, `0`, `-`, `0`, `0`, `-`, `0`, `0`, `T`, `0`, `0`, `:`, `0`, + `0`, `:`, `0`, `0`, `.`, `0`, `0`, `0`, `Z`]! + defer { + unsafe { buffer.free() } + } +} -- 2.39.5