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 +}