From 76ae9dba5c1bdebf2d916972abcdc7fa1e12b3c1 Mon Sep 17 00:00:00 2001 From: yuyi Date: Wed, 21 Jun 2023 17:36:28 +0800 Subject: [PATCH] checker: check struct init with pointer field (fix #18485) (#18501) --- vlib/v/checker/struct.v | 6 ++++++ .../checker/tests/struct_voidptr_field_init_err.out | 7 +++++++ .../checker/tests/struct_voidptr_field_init_err.vv | 13 +++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 vlib/v/checker/tests/struct_voidptr_field_init_err.out create mode 100644 vlib/v/checker/tests/struct_voidptr_field_init_err.vv diff --git a/vlib/v/checker/struct.v b/vlib/v/checker/struct.v index c6ca8712e2..501d1f7ec5 100644 --- a/vlib/v/checker/struct.v +++ b/vlib/v/checker/struct.v @@ -544,6 +544,12 @@ fn (mut c Checker) struct_init(mut node ast.StructInit, is_field_zero_struct_ini && field.expr.str() != '0' && !exp_type.has_flag(.option) { c.error('reference field must be initialized with reference', field.pos) + } else if exp_type.is_pointer() && !got_type.is_any_kind_of_pointer() + && !got_type.is_int() { + got_typ_str := c.table.type_to_str(got_type) + exp_typ_str := c.table.type_to_str(exp_type) + c.error('cannot assign to field `${field_info.name}`: expected a pointer `${exp_typ_str}`, but got `${got_typ_str}`', + field.pos) } } node.fields[i].typ = got_type diff --git a/vlib/v/checker/tests/struct_voidptr_field_init_err.out b/vlib/v/checker/tests/struct_voidptr_field_init_err.out new file mode 100644 index 0000000000..872bc8b29e --- /dev/null +++ b/vlib/v/checker/tests/struct_voidptr_field_init_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/struct_voidptr_field_init_err.vv:7:3: error: cannot assign to field `example`: expected a pointer `voidptr`, but got `string` + 5 | fn main() { + 6 | println(Example{ + 7 | example: get() + | ~~~~~~~~~~~~~~ + 8 | }) + 9 | } diff --git a/vlib/v/checker/tests/struct_voidptr_field_init_err.vv b/vlib/v/checker/tests/struct_voidptr_field_init_err.vv new file mode 100644 index 0000000000..5771ca80c1 --- /dev/null +++ b/vlib/v/checker/tests/struct_voidptr_field_init_err.vv @@ -0,0 +1,13 @@ +struct Example { + example voidptr +} + +fn main() { + println(Example{ + example: get() + }) +} + +fn get() string { + return 'hello' +}