1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

cgen: fix copying of a fixed array parameter to a function (fix #16640)

This commit is contained in:
Delyan Angelov 2022-12-10 20:06:51 +02:00
parent 30b39bebde
commit 4b2699fddd
No known key found for this signature in database
GPG Key ID: 66886C0F12D595ED
2 changed files with 29 additions and 3 deletions

View File

@ -443,10 +443,17 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
// TODO Instead of the translated check, check if it's a pointer already // TODO Instead of the translated check, check if it's a pointer already
// and don't generate memcpy & // and don't generate memcpy &
typ_str := g.typ(val_type).trim('*') typ_str := g.typ(val_type).trim('*')
ref_str := if val_type.is_ptr() { '' } else { '&' } final_typ_str := if is_fixed_array_var { '' } else { '(${typ_str}*)' }
g.write('memcpy((${typ_str}*)') final_ref_str := if is_fixed_array_var {
''
} else if val_type.is_ptr() {
'(byte*)'
} else {
'(byte*)&'
}
g.write('memcpy(${final_typ_str}')
g.expr(left) g.expr(left)
g.write(', (byte*)${ref_str}') g.write(', ${final_ref_str}')
g.expr(val) g.expr(val)
g.write(', sizeof(${typ_str}))') g.write(', sizeof(${typ_str}))')
} else if is_decl { } else if is_decl {

View File

@ -119,3 +119,22 @@ fn test_for_in_fixed_array() {
arr := [1, 2, 3]! arr := [1, 2, 3]!
calc_size(arr) calc_size(arr)
} }
//
fn print_fixed_arr(a [2]int) {
println('a: ${a}')
assert a == [1, 2]!
tmp := a
println('tmp: ${tmp}')
assert tmp == [1, 2]!
}
fn test_assignment_of_a_fixed_array_passed_as_parameter() {
arr := [1, 2]!
assert arr == [1, 2]!
tmp := arr
assert tmp == [1, 2]!
println(tmp) // [1, 2]
print_fixed_arr(arr)
}