From e16ee9d4d8b9aadd1eb5c4f5550291c82ddfc19f Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 21 Apr 2026 16:05:02 +0300 Subject: [PATCH] checker: fix c error when reference field improperly initialized (fixes #25980) --- vlib/v/checker/struct.v | 4 +++- .../tests/struct_ref_field_const_default_err.out | 6 ++++++ .../tests/struct_ref_field_const_default_err.vv | 12 ++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 vlib/v/checker/tests/struct_ref_field_const_default_err.out create mode 100644 vlib/v/checker/tests/struct_ref_field_const_default_err.vv diff --git a/vlib/v/checker/struct.v b/vlib/v/checker/struct.v index 86291e5f0..66e4d9cec 100644 --- a/vlib/v/checker/struct.v +++ b/vlib/v/checker/struct.v @@ -136,7 +136,9 @@ fn (mut c Checker) struct_decl(mut node ast.StructDecl) { val_desc := if field.default_expr_typ.is_ptr() { 'is' } else { 'is not' } c.error('field ${err_desc} reference but default value ${val_desc} reference', default_pos) - } else if field.default_expr is ast.StructInit { + } else if field.default_expr is ast.StructInit + || (field.typ.is_ptr() + && (field.default_expr is ast.Ident || field.default_expr is ast.SelectorExpr)) { c.error('reference field must be initialized with reference', default_pos) } } diff --git a/vlib/v/checker/tests/struct_ref_field_const_default_err.out b/vlib/v/checker/tests/struct_ref_field_const_default_err.out new file mode 100644 index 000000000..d6e381d05 --- /dev/null +++ b/vlib/v/checker/tests/struct_ref_field_const_default_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/struct_ref_field_const_default_err.vv:11:13: error: reference field must be initialized with reference + 9 | a int + 10 | pub mut: + 11 | tag &Tag = null_tag + | ~~~~~~~~ + 12 | } diff --git a/vlib/v/checker/tests/struct_ref_field_const_default_err.vv b/vlib/v/checker/tests/struct_ref_field_const_default_err.vv new file mode 100644 index 000000000..03196451e --- /dev/null +++ b/vlib/v/checker/tests/struct_ref_field_const_default_err.vv @@ -0,0 +1,12 @@ +struct Tag { + name string +} + +const null_tag = Tag{} + +struct Thing { +pub: + a int +pub mut: + tag &Tag = null_tag +} -- 2.39.5