gen: fix `mut arr [3]int` as a fn argument (#8085)
parent
cf93be918f
commit
245ed9160a
|
@ -240,7 +240,13 @@ fn (mut g Gen) fn_args(args []table.Param, is_variadic bool) ([]string, []string
|
||||||
g.definitions.write(')')
|
g.definitions.write(')')
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
s := arg_type_name + ' ' + caname
|
// TODO: combine two operations into one once ternary in expression is fixed
|
||||||
|
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
|
||||||
|
|
|
@ -686,7 +686,8 @@ fn (mut p Parser) fn_args() ([]table.Param, bool, bool) {
|
||||||
|
|
||||||
fn (mut p Parser) check_fn_mutable_arguments(typ table.Type, pos token.Position) {
|
fn (mut p Parser) check_fn_mutable_arguments(typ table.Type, pos token.Position) {
|
||||||
sym := p.table.get_type_symbol(typ)
|
sym := p.table.get_type_symbol(typ)
|
||||||
if sym.kind !in [.array, .struct_, .map, .placeholder, .sum_type] && !typ.is_ptr() && !typ.is_pointer() {
|
if sym.kind !in [.array, .array_fixed, .struct_, .map, .placeholder, .sum_type] &&
|
||||||
|
!typ.is_ptr() && !typ.is_pointer() {
|
||||||
p.error_with_pos('mutable arguments are only allowed for arrays, maps, structs and pointers\n' +
|
p.error_with_pos('mutable arguments are only allowed for arrays, maps, structs and pointers\n' +
|
||||||
'return values instead: `fn foo(mut n $sym.name) {` => `fn foo(n $sym.name) $sym.name {`',
|
'return values instead: `fn foo(mut n $sym.name) {` => `fn foo(n $sym.name) $sym.name {`',
|
||||||
pos)
|
pos)
|
||||||
|
|
|
@ -2,7 +2,7 @@ fn test_fixed_array_can_be_assigned() {
|
||||||
x := 2.32
|
x := 2.32
|
||||||
mut v := [8]f64{}
|
mut v := [8]f64{}
|
||||||
assert v[1] == 0
|
assert v[1] == 0
|
||||||
v = [1.0, x, 3.0,4.0,5.0,6.0,7.0,8.0]!!
|
v = [1.0, x, 3.0,4.0,5.0,6.0,7.0,8.0]!
|
||||||
assert v[1] == x
|
assert v[1] == x
|
||||||
v[1] = 2.0
|
v[1] = 2.0
|
||||||
for i, e in v {
|
for i, e in v {
|
||||||
|
@ -20,7 +20,7 @@ fn test_fixed_array_can_be_assigned() {
|
||||||
|
|
||||||
fn test_fixed_array_can_be_used_in_declaration() {
|
fn test_fixed_array_can_be_used_in_declaration() {
|
||||||
x := 2.32
|
x := 2.32
|
||||||
v := [1.0, x, 3.0,4.0,5.0,6.0,7.0,8.0]!!
|
v := [1.0, x, 3.0,4.0,5.0,6.0,7.0,8.0]!
|
||||||
assert v.len == 8
|
assert v.len == 8
|
||||||
assert v[1] == x
|
assert v[1] == x
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ fn test_fixed_array_can_be_assigned_to_a_struct_field() {
|
||||||
mut ctx := Context{}
|
mut ctx := Context{}
|
||||||
assert ctx.vb.len == 8
|
assert ctx.vb.len == 8
|
||||||
x := 2.32
|
x := 2.32
|
||||||
ctx.vb = [1.1, x, 3.3, 4.4, 5.0, 6.0, 7.0, 8.9]!!
|
ctx.vb = [1.1, x, 3.3, 4.4, 5.0, 6.0, 7.0, 8.9]!
|
||||||
assert ctx.vb[1] == x
|
assert ctx.vb[1] == x
|
||||||
assert ctx.vb[7] == 8.9
|
assert ctx.vb[7] == 8.9
|
||||||
for i, e in ctx.vb {
|
for i, e in ctx.vb {
|
||||||
|
@ -49,3 +49,22 @@ fn test_fixed_array_can_be_assigned_to_a_struct_field() {
|
||||||
println( ctx.vb[3] )
|
println( ctx.vb[3] )
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn multiply_by_two(mut arr [3]int) {
|
||||||
|
for i in 0..arr.len {
|
||||||
|
arr[i] *= 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn change_first_element(mut arr [3][3]int) {
|
||||||
|
arr[0][0] = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_fixed_array_can_be_passed_as_mut_arg() {
|
||||||
|
mut arr := [1,2,3]!
|
||||||
|
multiply_by_two(mut arr)
|
||||||
|
assert arr == [2,4,6]!
|
||||||
|
mut arr2 := [[1,2,3]!, [4,5,6]!, [7,8,9]!]!
|
||||||
|
change_first_element(mut arr2)
|
||||||
|
assert arr2 == [[0,2,3]!, [4,5,6]!, [7,8,9]!]!
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue