gen/c: fix double evaluation of rvalue array expression in slice
parent
34dd4f34ab
commit
083469eeaa
|
|
@ -62,6 +62,7 @@ fn (mut g Gen) range_expr(node ast.IndexExpr, range ast.RangeExpr) {
|
||||||
mut tmp_opt := ''
|
mut tmp_opt := ''
|
||||||
mut cur_line := ''
|
mut cur_line := ''
|
||||||
mut gen_or := node.or_expr.kind != .absent || node.is_option
|
mut gen_or := node.or_expr.kind != .absent || node.is_option
|
||||||
|
mut tmp_left := ''
|
||||||
|
|
||||||
if sym.kind == .string {
|
if sym.kind == .string {
|
||||||
if node.is_gated {
|
if node.is_gated {
|
||||||
|
|
@ -82,6 +83,15 @@ fn (mut g Gen) range_expr(node ast.IndexExpr, range ast.RangeExpr) {
|
||||||
}
|
}
|
||||||
g.expr(node.left)
|
g.expr(node.left)
|
||||||
} else if sym.kind == .array {
|
} else if sym.kind == .array {
|
||||||
|
if !range.has_high {
|
||||||
|
tmp_left = g.new_tmp_var()
|
||||||
|
line := g.go_before_stmt(0)
|
||||||
|
g.out.write_string(util.tabs(g.indent))
|
||||||
|
tmp_type := g.typ(node.left_type)
|
||||||
|
g.write('$tmp_type $tmp_left = ')
|
||||||
|
g.expr(node.left)
|
||||||
|
g.write(';\n$line')
|
||||||
|
}
|
||||||
if node.is_gated {
|
if node.is_gated {
|
||||||
g.write('array_slice_ni(')
|
g.write('array_slice_ni(')
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -90,7 +100,11 @@ fn (mut g Gen) range_expr(node ast.IndexExpr, range ast.RangeExpr) {
|
||||||
if node.left_type.is_ptr() {
|
if node.left_type.is_ptr() {
|
||||||
g.write('*')
|
g.write('*')
|
||||||
}
|
}
|
||||||
g.expr(node.left)
|
if range.has_high {
|
||||||
|
g.expr(node.left)
|
||||||
|
} else {
|
||||||
|
g.write(tmp_left)
|
||||||
|
}
|
||||||
} else if sym.kind == .array_fixed {
|
} else if sym.kind == .array_fixed {
|
||||||
// Convert a fixed array to V array when doing `fixed_arr[start..end]`
|
// Convert a fixed array to V array when doing `fixed_arr[start..end]`
|
||||||
info := sym.info as ast.ArrayFixed
|
info := sym.info as ast.ArrayFixed
|
||||||
|
|
@ -132,15 +146,16 @@ fn (mut g Gen) range_expr(node ast.IndexExpr, range ast.RangeExpr) {
|
||||||
} else if sym.kind == .array_fixed {
|
} else if sym.kind == .array_fixed {
|
||||||
info := sym.info as ast.ArrayFixed
|
info := sym.info as ast.ArrayFixed
|
||||||
g.write('$info.size')
|
g.write('$info.size')
|
||||||
} else if node.left_type.is_ptr() {
|
} else if sym.kind == .array {
|
||||||
g.write('(')
|
if node.left_type.is_ptr() {
|
||||||
g.write('*')
|
g.write('${tmp_left}->len')
|
||||||
g.expr(node.left)
|
} else {
|
||||||
g.write(')')
|
g.write('${tmp_left}.len')
|
||||||
g.write('.len')
|
}
|
||||||
} else {
|
} else {
|
||||||
|
g.write('(')
|
||||||
g.expr(node.left)
|
g.expr(node.left)
|
||||||
g.write('.len')
|
g.write(').len')
|
||||||
}
|
}
|
||||||
g.write(')')
|
g.write(')')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fn test_arr_rval() {
|
||||||
|
a := [1,2]
|
||||||
|
s := (*&a)[..]
|
||||||
|
assert s == a
|
||||||
|
|
||||||
|
b := unsafe {*&[]int(&a)}[..]
|
||||||
|
assert b == a
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue