From b8af81240a348fb0d20fd53566108e08ac9360ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20D=C3=A4schle?= Date: Wed, 30 Dec 2020 19:44:01 +0100 Subject: [PATCH] cgen: fix struct embedding method when receiver is ptr (#7710) --- vlib/v/gen/fn.v | 9 +++++++-- vlib/v/tests/struct_embed_test.v | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/vlib/v/gen/fn.v b/vlib/v/gen/fn.v index 216d6e2391..1b19eb6784 100644 --- a/vlib/v/gen/fn.v +++ b/vlib/v/gen/fn.v @@ -436,7 +436,7 @@ fn (mut g Gen) method_call(node ast.CallExpr) { } else { g.write('${name}(') } - if node.receiver_type.is_ptr() && !node.left_type.is_ptr() { + if node.receiver_type.is_ptr() && (!node.left_type.is_ptr() || node.from_embed_type != 0) { // The receiver is a reference, but the caller provided a value // Add `&` automatically. // TODO same logic in call_args() @@ -455,7 +455,12 @@ fn (mut g Gen) method_call(node ast.CallExpr) { g.expr(node.left) if node.from_embed_type != 0 { embed_name := typ_sym.embed_name() - g.write('.$embed_name') + if node.left_type.is_ptr() { + g.write('->') + } else { + g.write('.') + } + g.write(embed_name) } } if has_cast { diff --git a/vlib/v/tests/struct_embed_test.v b/vlib/v/tests/struct_embed_test.v index 1ef1ca6b7e..1a0e137d01 100644 --- a/vlib/v/tests/struct_embed_test.v +++ b/vlib/v/tests/struct_embed_test.v @@ -79,3 +79,18 @@ fn test_assign() { h.x = 5 assert h.x == 5 } + +struct Eggs {} + +fn (f &Eggs) test(x int) int { + return x +} + +struct Breakfast { + Eggs +} + +fn test_embed_method_receiver_ptr() { + b := Breakfast{} + assert b.test(5) == 5 +}