cgen: fix appending an array to a shared array (#13265)
parent
5f38ba896e
commit
009a65b1fc
|
@ -585,15 +585,25 @@ fn (mut g Gen) infix_expr_left_shift_op(node ast.InfixExpr) {
|
|||
// push an array => PUSH_MANY, but not if pushing an array to 2d array (`[][]int << []int`)
|
||||
g.write('_PUSH_MANY${noscan}(')
|
||||
mut expected_push_many_atype := left.typ
|
||||
is_shared := expected_push_many_atype.has_flag(.shared_f)
|
||||
if !expected_push_many_atype.is_ptr() {
|
||||
// fn f(mut a []int) { a << [1,2,3] } -> type of `a` is `array_int*` -> no need for &
|
||||
g.write('&')
|
||||
} else {
|
||||
expected_push_many_atype = expected_push_many_atype.deref()
|
||||
}
|
||||
if is_shared {
|
||||
g.write('&')
|
||||
}
|
||||
if is_shared {
|
||||
expected_push_many_atype = expected_push_many_atype.clear_flag(.shared_f)
|
||||
}
|
||||
g.expr(node.left)
|
||||
if node.left_type.has_flag(.shared_f) {
|
||||
g.write('->val')
|
||||
}
|
||||
g.write(', (')
|
||||
g.expr_with_cast(node.right, node.right_type, left.unaliased)
|
||||
g.expr_with_cast(node.right, node.right_type, left.unaliased.clear_flag(.shared_f))
|
||||
styp := g.typ(expected_push_many_atype)
|
||||
g.write('), $tmp_var, $styp)')
|
||||
} else {
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
fn test_shared_array_append_many() {
|
||||
shared a := []int{}
|
||||
lock a {
|
||||
a << [1, 2, 3]
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue