From 8300a0671cb3a46bc7557e3cd3e02a98139b482c Mon Sep 17 00:00:00 2001 From: yuyi Date: Sat, 16 Nov 2024 17:40:44 +0800 Subject: [PATCH] checker: check struct aliased field unsign type assigning negative value (fix #22868) (#22871) --- vlib/v/checker/struct.v | 2 +- .../struct_aliased_field_unsign_type_check_err.out | 7 +++++++ .../struct_aliased_field_unsign_type_check_err.vv | 12 ++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 vlib/v/checker/tests/struct_aliased_field_unsign_type_check_err.out create mode 100644 vlib/v/checker/tests/struct_aliased_field_unsign_type_check_err.vv diff --git a/vlib/v/checker/struct.v b/vlib/v/checker/struct.v index e261c3038..9cf8885c6 100644 --- a/vlib/v/checker/struct.v +++ b/vlib/v/checker/struct.v @@ -801,7 +801,7 @@ or use an explicit `unsafe{ a[..] }`, if you do not want a copy of the slice.', c.fail_if_stack_struct_action_outside_unsafe(mut init_field.expr, 'assigned') } - if field_info.typ in ast.unsigned_integer_type_idxs + if c.table.unaliased_type(exp_type) in ast.unsigned_integer_type_idxs && mut init_field.expr is ast.IntegerLiteral && (init_field.expr as ast.IntegerLiteral).val[0] == `-` { c.error('cannot assign negative value to unsigned integer type', init_field.expr.pos) diff --git a/vlib/v/checker/tests/struct_aliased_field_unsign_type_check_err.out b/vlib/v/checker/tests/struct_aliased_field_unsign_type_check_err.out new file mode 100644 index 000000000..d2be17542 --- /dev/null +++ b/vlib/v/checker/tests/struct_aliased_field_unsign_type_check_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/struct_aliased_field_unsign_type_check_err.vv:9:9: error: cannot assign negative value to unsigned integer type + 7 | fn main() { + 8 | app := App{ + 9 | port: -1 + | ~~ + 10 | } + 11 | println(app) diff --git a/vlib/v/checker/tests/struct_aliased_field_unsign_type_check_err.vv b/vlib/v/checker/tests/struct_aliased_field_unsign_type_check_err.vv new file mode 100644 index 000000000..46a22ee0c --- /dev/null +++ b/vlib/v/checker/tests/struct_aliased_field_unsign_type_check_err.vv @@ -0,0 +1,12 @@ +type Port = u16 + +struct App { + port Port +} + +fn main() { + app := App{ + port: -1 + } + println(app) +} -- 2.39.5