parent
b4a542c51c
commit
6c87c25ef1
|
@ -1284,15 +1284,22 @@ fn (mut g Gen) for_in(it ast.ForInStmt) {
|
||||||
}
|
}
|
||||||
} else if it.kind == .array_fixed {
|
} else if it.kind == .array_fixed {
|
||||||
atmp := g.new_tmp_var()
|
atmp := g.new_tmp_var()
|
||||||
atmp_type := g.typ(it.cond_type)
|
atmp_type := g.typ(it.cond_type).trim('*')
|
||||||
if !it.cond.is_lvalue() {
|
if !it.cond.is_lvalue() {
|
||||||
g.write('$atmp_type *$atmp = &(($atmp_type)')
|
g.write('$atmp_type *$atmp = ')
|
||||||
|
if !it.cond_type.is_ptr() {
|
||||||
|
g.write('&')
|
||||||
|
}
|
||||||
|
g.write('(($atmp_type)')
|
||||||
} else {
|
} else {
|
||||||
g.write('$atmp_type *$atmp = &(')
|
g.write('$atmp_type *$atmp = ')
|
||||||
|
if !it.cond_type.is_ptr() {
|
||||||
|
g.write('&')
|
||||||
|
}
|
||||||
|
g.write('(')
|
||||||
}
|
}
|
||||||
g.expr(it.cond)
|
g.expr(it.cond)
|
||||||
g.writeln(')')
|
g.writeln(');')
|
||||||
g.writeln(';')
|
|
||||||
i := if it.key_var in ['', '_'] { g.new_tmp_var() } else { it.key_var }
|
i := if it.key_var in ['', '_'] { g.new_tmp_var() } else { it.key_var }
|
||||||
cond_sym := g.table.get_type_symbol(it.cond_type)
|
cond_sym := g.table.get_type_symbol(it.cond_type)
|
||||||
info := cond_sym.info as table.ArrayFixed
|
info := cond_sym.info as table.ArrayFixed
|
||||||
|
@ -1306,7 +1313,11 @@ fn (mut g Gen) for_in(it ast.ForInStmt) {
|
||||||
styp := g.typ(it.val_type)
|
styp := g.typ(it.val_type)
|
||||||
g.write('\t$styp ${c_name(it.val_var)}')
|
g.write('\t$styp ${c_name(it.val_var)}')
|
||||||
}
|
}
|
||||||
g.writeln(' = (*$atmp)[$i];')
|
if it.val_is_mut {
|
||||||
|
g.writeln(' = &(*$atmp)[$i];')
|
||||||
|
} else {
|
||||||
|
g.writeln(' = (*$atmp)[$i];')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if it.kind == .map {
|
} else if it.kind == .map {
|
||||||
// `for key, val in map {
|
// `for key, val in map {
|
||||||
|
@ -4181,7 +4192,13 @@ fn (mut g Gen) index_expr(node ast.IndexExpr) {
|
||||||
g.expr(node.index)
|
g.expr(node.index)
|
||||||
g.write(')')
|
g.write(')')
|
||||||
} else {
|
} else {
|
||||||
g.expr(node.left)
|
if sym.kind == .array_fixed && node.left_type.is_ptr() {
|
||||||
|
g.write('(*')
|
||||||
|
g.expr(node.left)
|
||||||
|
g.write(')')
|
||||||
|
} else {
|
||||||
|
g.expr(node.left)
|
||||||
|
}
|
||||||
g.write('[')
|
g.write('[')
|
||||||
g.expr(node.index)
|
g.expr(node.index)
|
||||||
g.write(']')
|
g.write(']')
|
||||||
|
|
|
@ -241,13 +241,7 @@ fn (mut g Gen) fn_args(args []table.Param, is_variadic bool) ([]string, []string
|
||||||
g.definitions.write(')')
|
g.definitions.write(')')
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// TODO: combine two operations into one once ternary in expression is fixed
|
s := '$arg_type_name $caname'
|
||||||
mut s := if arg_type_sym.kind == .array_fixed {
|
|
||||||
arg_type_name.trim('*')
|
|
||||||
} else {
|
|
||||||
arg_type_name
|
|
||||||
}
|
|
||||||
s += ' ' + caname
|
|
||||||
g.write(s)
|
g.write(s)
|
||||||
g.definitions.write(s)
|
g.definitions.write(s)
|
||||||
fargs << caname
|
fargs << caname
|
||||||
|
|
|
@ -1,12 +1,25 @@
|
||||||
fn foo(mut arr []int) {
|
fn foo1(mut arr []int) {
|
||||||
for _, mut j in arr {
|
for _, mut j in arr {
|
||||||
j *= 2
|
j *= 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_for_in_mut_val() {
|
fn test_for_in_mut_val_of_array() {
|
||||||
mut arr := [1, 2, 3]
|
mut arr := [1, 2, 3]
|
||||||
foo(mut arr)
|
foo1(mut arr)
|
||||||
println(arr)
|
println(arr)
|
||||||
assert arr == [2, 4, 6]
|
assert arr == [2, 4, 6]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn foo2(mut arr [3]int) {
|
||||||
|
for _, mut j in arr {
|
||||||
|
j *= 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_for_in_mut_val_of_fixed_array() {
|
||||||
|
mut arr := [1,2,3]!
|
||||||
|
foo2(mut arr)
|
||||||
|
println(arr)
|
||||||
|
assert arr == [2, 4, 6]!
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue