cgen: fix cross assign of struct fields (#5606)
parent
56ae814cbc
commit
40a393926d
|
@ -1108,6 +1108,12 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
|||
g.writeln(', &($styp[]){ $zero });')
|
||||
}
|
||||
}
|
||||
ast.SelectorExpr {
|
||||
styp := g.typ(left.typ)
|
||||
g.write('$styp _var_$left.pos.pos = ')
|
||||
g.expr(left.expr)
|
||||
g.writeln('.$left.field_name;')
|
||||
}
|
||||
else {}
|
||||
}
|
||||
}
|
||||
|
@ -1331,6 +1337,19 @@ fn (mut g Gen) gen_cross_tmp_variable(left []ast.Expr, val ast.Expr) {
|
|||
g.gen_cross_tmp_variable(left, val.expr)
|
||||
g.write(val.op.str())
|
||||
}
|
||||
ast.SelectorExpr {
|
||||
mut has_var := false
|
||||
for lx in left {
|
||||
if val_.str() == lx.str() {
|
||||
g.write('_var_${lx.position().pos}')
|
||||
has_var = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !has_var {
|
||||
g.expr(val_)
|
||||
}
|
||||
}
|
||||
else {
|
||||
g.expr(val_)
|
||||
}
|
||||
|
|
|
@ -66,6 +66,13 @@ fn (mut p Parser) check_cross_variables(exprs []ast.Expr, val ast.Expr) bool {
|
|||
ast.InfixExpr { return p.check_cross_variables(exprs, val_.left) || p.check_cross_variables(exprs, val_.right) }
|
||||
ast.PrefixExpr { return p.check_cross_variables(exprs, val_.right) }
|
||||
ast.PostfixExpr { return p.check_cross_variables(exprs, val_.expr) }
|
||||
ast.SelectorExpr {
|
||||
for expr in exprs {
|
||||
if expr.str() == val.str() {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
else {}
|
||||
}
|
||||
return false
|
||||
|
|
|
@ -313,3 +313,17 @@ fn test_struct_with_default_values_no_init() {
|
|||
assert s2.field_optional == 3
|
||||
assert s3.field_optional == 2
|
||||
}
|
||||
|
||||
struct Zoo {
|
||||
mut:
|
||||
a int
|
||||
b int
|
||||
}
|
||||
|
||||
fn test_struct_field_cross_assign() {
|
||||
mut x := Zoo{a:1, b:2}
|
||||
x.a, x.b = x.b, x.a
|
||||
//println(x)
|
||||
assert x.a == 2
|
||||
assert x.b == 1
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue