mirror of
https://github.com/vlang/v.git
synced 2025-09-12 17:07:11 -04:00
cgen: fix infix expr in method of mut receiver variable (#20225)
This commit is contained in:
parent
a64b87204f
commit
ecb1dc1cb0
@ -1053,7 +1053,7 @@ fn (mut g Gen) gen_plain_infix_expr(node ast.InfixExpr) {
|
|||||||
typ_str := g.typ(node.promoted_type)
|
typ_str := g.typ(node.promoted_type)
|
||||||
g.write('(${typ_str})(')
|
g.write('(${typ_str})(')
|
||||||
}
|
}
|
||||||
if node.left_type.is_ptr() && node.left.is_auto_deref_var() {
|
if node.left_type.is_ptr() && node.left.is_auto_deref_var() && !node.right_type.is_pointer() {
|
||||||
g.write('*')
|
g.write('*')
|
||||||
} else if !g.inside_interface_deref && node.left is ast.Ident
|
} else if !g.inside_interface_deref && node.left is ast.Ident
|
||||||
&& g.table.is_interface_var(node.left.obj) {
|
&& g.table.is_interface_var(node.left.obj) {
|
||||||
@ -1065,7 +1065,7 @@ fn (mut g Gen) gen_plain_infix_expr(node ast.InfixExpr) {
|
|||||||
}
|
}
|
||||||
g.expr(node.left)
|
g.expr(node.left)
|
||||||
g.write(' ${node.op.str()} ')
|
g.write(' ${node.op.str()} ')
|
||||||
if node.right_type.is_ptr() && node.right.is_auto_deref_var() {
|
if node.right_type.is_ptr() && node.right.is_auto_deref_var() && !node.left_type.is_pointer() {
|
||||||
g.write('*')
|
g.write('*')
|
||||||
g.expr(node.right)
|
g.expr(node.right)
|
||||||
} else {
|
} else {
|
||||||
|
62
vlib/v/tests/infix_expr_in_mut_receiver_method_test.v
Normal file
62
vlib/v/tests/infix_expr_in_mut_receiver_method_test.v
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
@[heap]
|
||||||
|
struct UI {}
|
||||||
|
|
||||||
|
pub fn (ui &UI) draw_rect() {
|
||||||
|
println('[]')
|
||||||
|
}
|
||||||
|
|
||||||
|
@[heap]
|
||||||
|
pub interface Node {
|
||||||
|
id u64
|
||||||
|
draw()
|
||||||
|
mut:
|
||||||
|
ui &UI
|
||||||
|
init(ui &UI) !
|
||||||
|
}
|
||||||
|
|
||||||
|
@[heap]
|
||||||
|
pub struct Item {
|
||||||
|
pub:
|
||||||
|
id u64 = 1
|
||||||
|
mut:
|
||||||
|
ui &UI = unsafe { nil }
|
||||||
|
body []&Node
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (mut i Item) init(ui &UI) ! {
|
||||||
|
assert i != unsafe { nil } // This assert generates a C gen error
|
||||||
|
i.ui = ui
|
||||||
|
for mut child in i.body {
|
||||||
|
child.init(ui)!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (i &Item) draw() {
|
||||||
|
assert i != unsafe { nil }
|
||||||
|
for child in i.body {
|
||||||
|
child.draw()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@[heap]
|
||||||
|
pub struct Rectangle {
|
||||||
|
Item
|
||||||
|
pub mut:
|
||||||
|
field f32
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (r &Rectangle) draw() {
|
||||||
|
assert r != unsafe { nil }
|
||||||
|
r.ui.draw_rect()
|
||||||
|
r.Item.draw()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_infix_expr_in_mut_receiver_method() {
|
||||||
|
ui := &UI{}
|
||||||
|
mut rect := &Rectangle{}
|
||||||
|
|
||||||
|
rect.init(ui)!
|
||||||
|
|
||||||
|
rect.draw()
|
||||||
|
assert true
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user