cgen: make use of mut_rec in method consistent (#9308)
parent
e235022e10
commit
2d2e4610e7
|
@ -4498,9 +4498,8 @@ fn (mut g Gen) return_statement(node ast.Return) {
|
||||||
}
|
}
|
||||||
if expr0.is_auto_deref_var() {
|
if expr0.is_auto_deref_var() {
|
||||||
if g.fn_decl.return_type.is_ptr() {
|
if g.fn_decl.return_type.is_ptr() {
|
||||||
g.write('&(*')
|
var_str := g.expr_string(expr0)
|
||||||
g.expr(expr0)
|
g.write(var_str.trim('&'))
|
||||||
g.write(')')
|
|
||||||
} else {
|
} else {
|
||||||
g.write('*')
|
g.write('*')
|
||||||
g.expr(expr0)
|
g.expr(expr0)
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
struct Player {
|
||||||
|
mut:
|
||||||
|
name string
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (mut p Player) set_name(name string) &Player {
|
||||||
|
p.name = name
|
||||||
|
return p // because of automatic (de)reference of return values
|
||||||
|
}
|
||||||
|
|
||||||
|
// NB: `p` is declared as a `mut` parameter,
|
||||||
|
// which now only affects its mutability.
|
||||||
|
fn (mut p Player) set_position(x int, y int) &Player {
|
||||||
|
p.x = x
|
||||||
|
p.y = y
|
||||||
|
// TODO: from the point of view of the V programmer,
|
||||||
|
// `p` has still type &Player.
|
||||||
|
// assert typeof(p).name == 'Player'
|
||||||
|
return &p
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_mut_receiver() {
|
||||||
|
mut p := &Player{}
|
||||||
|
f := p.set_name('frodo')
|
||||||
|
assert u64(p) == u64(f)
|
||||||
|
z := p.set_position(111, 222)
|
||||||
|
assert u64(p) == u64(z)
|
||||||
|
//
|
||||||
|
assert p.name == 'frodo'
|
||||||
|
assert p.x == 111
|
||||||
|
assert p.y == 222
|
||||||
|
assert u64(p.set_name('bilbo')) == u64(p)
|
||||||
|
assert p.name == 'bilbo'
|
||||||
|
}
|
Loading…
Reference in New Issue