From 5fc7eadd8b5aff3623c298abfddc97a29a98c230 Mon Sep 17 00:00:00 2001 From: Tim Basel Date: Thu, 28 Jan 2021 09:05:09 +0100 Subject: [PATCH] cgen: fix short struct init with `mut` (#8384) --- vlib/v/checker/checker.v | 3 +++ vlib/v/gen/cgen.v | 7 +++++++ vlib/v/tests/struct_test.v | 10 ++++++++++ 3 files changed, 20 insertions(+) diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index ca48c698ab..4eefbee119 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1122,6 +1122,9 @@ fn (mut c Checker) fail_if_immutable(expr ast.Expr) (string, token.Position) { ast.ArrayInit { return '', pos } + ast.StructInit { + return '', pos + } else { c.error('unexpected expression `$expr.type_name()`', expr.position()) } diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index a681cefb46..697a790183 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -4710,6 +4710,13 @@ fn (mut g Gen) struct_init(struct_init ast.StructInit) { } else { g.write('($styp*)memdup(&($styp){') } + } else if struct_init.typ.is_ptr() { + basetyp := g.typ(struct_init.typ.set_nr_muls(0)) + if is_multiline { + g.writeln('&($basetyp){') + } else { + g.write('&($basetyp){') + } } else { if g.is_shared { g.writeln('{.val = {') diff --git a/vlib/v/tests/struct_test.v b/vlib/v/tests/struct_test.v index bc3761db3d..ab50fccbd8 100644 --- a/vlib/v/tests/struct_test.v +++ b/vlib/v/tests/struct_test.v @@ -231,6 +231,7 @@ fn test_fixed_field() { } */ struct Config { +mut: n int def int = 10 } @@ -241,6 +242,11 @@ fn foo_config(def int, c Config) { fn bar_config(c Config, def int) { assert c.def == def } +fn mut_bar_config(mut c Config, def int) &Config { + c.n = c.def + assert c.n == def + return c +} fn foo_user(u User) {} @@ -256,6 +262,10 @@ fn test_struct_literal_args() { bar_config({}, 10) bar_config({def:4}, 4) + c := mut_bar_config(mut {def: 10}, 10) + assert c.n == 10 + assert c.def == 10 + foo_user({ name: 'Peter' })