From d67f4d0234729b018c633ddd9e59e7e6e9da8380 Mon Sep 17 00:00:00 2001 From: larpon <768942+larpon@users.noreply.github.com> Date: Thu, 27 Jun 2024 07:27:43 +0200 Subject: [PATCH] checker: add error for `field [$d('x', 2)]int = [1, 2]!` (#21741) --- vlib/v/checker/struct.v | 9 +++++++++ .../struct_field_fixed_size_init_with_d_as_size_err.out | 7 +++++++ .../struct_field_fixed_size_init_with_d_as_size_err.vv | 6 ++++++ 3 files changed, 22 insertions(+) create mode 100644 vlib/v/checker/tests/struct_field_fixed_size_init_with_d_as_size_err.out create mode 100644 vlib/v/checker/tests/struct_field_fixed_size_init_with_d_as_size_err.vv diff --git a/vlib/v/checker/struct.v b/vlib/v/checker/struct.v index 9327da75b..88d81d7cf 100644 --- a/vlib/v/checker/struct.v +++ b/vlib/v/checker/struct.v @@ -199,6 +199,15 @@ fn (mut c Checker) struct_decl(mut node ast.StructDecl) { if !field.typ.has_flag(.option) && !field.typ.has_flag(.result) { c.check_expr_option_or_result_call(field.default_expr, field.default_expr_typ) } + if sym.info is ast.ArrayFixed && field.typ == field.default_expr_typ { + if sym.info.size_expr is ast.ComptimeCall { + // field [$d('x' ,2)]int = [1 ,2]! + if sym.info.size_expr.method_name == 'd' { + c.error('cannot initialize a fixed size array field that uses `\$d()` as size quantifier since the size may change via -d', + field.default_expr.pos()) + } + } + } interface_implemented := sym.kind == .interface_ && c.type_implements(field.default_expr_typ, field.typ, field.pos) c.check_expected(field.default_expr_typ, field.typ) or { diff --git a/vlib/v/checker/tests/struct_field_fixed_size_init_with_d_as_size_err.out b/vlib/v/checker/tests/struct_field_fixed_size_init_with_d_as_size_err.out new file mode 100644 index 000000000..e62bef668 --- /dev/null +++ b/vlib/v/checker/tests/struct_field_fixed_size_init_with_d_as_size_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/struct_field_fixed_size_init_with_d_as_size_err.vv:3:31: error: cannot initialize a fixed size array field that uses `$d()` as size quantifier since the size may change via -d + 1 | struct Gin { + 2 | mut: + 3 | juice [$d('amount', 4)]int = [1, 2, 3, 4]! + | ~~~~~~~~~~~~~ + 4 | } + 5 | \ No newline at end of file diff --git a/vlib/v/checker/tests/struct_field_fixed_size_init_with_d_as_size_err.vv b/vlib/v/checker/tests/struct_field_fixed_size_init_with_d_as_size_err.vv new file mode 100644 index 000000000..929ed1911 --- /dev/null +++ b/vlib/v/checker/tests/struct_field_fixed_size_init_with_d_as_size_err.vv @@ -0,0 +1,6 @@ +struct Gin { +mut: + juice [$d('amount', 4)]int = [1, 2, 3, 4]! +} + +fn main() {} -- 2.39.5