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(')') | ||||
| 			} | ||||
| 		} 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.definitions.write(s) | ||||
| 			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) { | ||||
| 	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' + | ||||
| 			'return values instead: `fn foo(mut n $sym.name) {` => `fn foo(n $sym.name) $sym.name {`', | ||||
| 			pos) | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ fn test_fixed_array_can_be_assigned() { | |||
| 	x := 2.32 | ||||
| 	mut v := [8]f64{} | ||||
| 	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 | ||||
| 	v[1] = 2.0 | ||||
| 	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() { | ||||
| 	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[1] == x | ||||
| } | ||||
|  | @ -35,7 +35,7 @@ fn test_fixed_array_can_be_assigned_to_a_struct_field() { | |||
| 	mut ctx := Context{} | ||||
| 	assert ctx.vb.len == 8 | ||||
| 	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[7] == 8.9 | ||||
| 	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] ) | ||||
| 	*/ | ||||
| } | ||||
| 
 | ||||
| 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