cgen: fix error for fixed array in operate (#14269)
							parent
							
								
									0e5c1cee48
								
							
						
					
					
						commit
						276bd8060c
					
				| 
						 | 
				
			
			@ -700,6 +700,7 @@ fn (mut g Gen) gen_array_contains_methods() {
 | 
			
		|||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		done << t
 | 
			
		||||
		if left_final_sym.kind == .array {
 | 
			
		||||
			mut left_type_str := g.typ(t)
 | 
			
		||||
			fn_name := '${left_type_str}_contains'
 | 
			
		||||
			left_info := left_final_sym.info as ast.Array
 | 
			
		||||
| 
						 | 
				
			
			@ -744,6 +745,52 @@ fn (mut g Gen) gen_array_contains_methods() {
 | 
			
		|||
			fn_builder.writeln('\treturn false;')
 | 
			
		||||
			fn_builder.writeln('}')
 | 
			
		||||
			g.auto_fn_definitions << fn_builder.str()
 | 
			
		||||
		} else if left_final_sym.kind == .array_fixed {
 | 
			
		||||
			mut left_type_str := g.typ(t)
 | 
			
		||||
			fn_name := '${left_type_str}_contains'
 | 
			
		||||
			left_info := left_final_sym.info as ast.ArrayFixed
 | 
			
		||||
			mut elem_type_str := g.typ(left_info.elem_type)
 | 
			
		||||
			elem_sym := g.table.sym(left_info.elem_type)
 | 
			
		||||
			if elem_sym.kind == .function {
 | 
			
		||||
				left_type_str = 'Array_voidptr'
 | 
			
		||||
				elem_type_str = 'voidptr'
 | 
			
		||||
			}
 | 
			
		||||
			g.type_definitions.writeln('static bool ${fn_name}($left_type_str a, $elem_type_str v); // auto')
 | 
			
		||||
			mut fn_builder := strings.new_builder(512)
 | 
			
		||||
			fn_builder.writeln('static bool ${fn_name}($left_type_str a, $elem_type_str v) {')
 | 
			
		||||
			fn_builder.writeln('\tfor (int i = 0; i < $left_info.size; ++i) {')
 | 
			
		||||
			if elem_sym.kind == .string {
 | 
			
		||||
				fn_builder.writeln('\t\tif (fast_string_eq(a[i], v)) {')
 | 
			
		||||
			} else if elem_sym.kind == .array && left_info.elem_type.nr_muls() == 0 {
 | 
			
		||||
				ptr_typ := g.equality_fn(left_info.elem_type)
 | 
			
		||||
				fn_builder.writeln('\t\tif (${ptr_typ}_arr_eq(a[i], v)) {')
 | 
			
		||||
			} else if elem_sym.kind == .function {
 | 
			
		||||
				fn_builder.writeln('\t\tif (a[i] == v) {')
 | 
			
		||||
			} else if elem_sym.kind == .map && left_info.elem_type.nr_muls() == 0 {
 | 
			
		||||
				ptr_typ := g.equality_fn(left_info.elem_type)
 | 
			
		||||
				fn_builder.writeln('\t\tif (${ptr_typ}_map_eq(a[i], v)) {')
 | 
			
		||||
			} else if elem_sym.kind == .struct_ && left_info.elem_type.nr_muls() == 0 {
 | 
			
		||||
				ptr_typ := g.equality_fn(left_info.elem_type)
 | 
			
		||||
				fn_builder.writeln('\t\tif (${ptr_typ}_struct_eq(a[i], v)) {')
 | 
			
		||||
			} else if elem_sym.kind == .interface_ && left_info.elem_type.nr_muls() == 0 {
 | 
			
		||||
				ptr_typ := g.equality_fn(left_info.elem_type)
 | 
			
		||||
				fn_builder.writeln('\t\tif (${ptr_typ}_interface_eq(a[i], v)) {')
 | 
			
		||||
			} else if elem_sym.kind == .sum_type && left_info.elem_type.nr_muls() == 0 {
 | 
			
		||||
				ptr_typ := g.equality_fn(left_info.elem_type)
 | 
			
		||||
				fn_builder.writeln('\t\tif (${ptr_typ}_sumtype_eq(a[i], v)) {')
 | 
			
		||||
			} else if elem_sym.kind == .alias && left_info.elem_type.nr_muls() == 0 {
 | 
			
		||||
				ptr_typ := g.equality_fn(left_info.elem_type)
 | 
			
		||||
				fn_builder.writeln('\t\tif (${ptr_typ}_alias_eq(a[i], v)) {')
 | 
			
		||||
			} else {
 | 
			
		||||
				fn_builder.writeln('\t\tif (a[i] == v) {')
 | 
			
		||||
			}
 | 
			
		||||
			fn_builder.writeln('\t\t\treturn true;')
 | 
			
		||||
			fn_builder.writeln('\t\t}')
 | 
			
		||||
			fn_builder.writeln('\t}')
 | 
			
		||||
			fn_builder.writeln('\treturn false;')
 | 
			
		||||
			fn_builder.writeln('}')
 | 
			
		||||
			g.auto_fn_definitions << fn_builder.str()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -472,7 +472,7 @@ fn (mut g Gen) infix_expr_in_op(node ast.InfixExpr) {
 | 
			
		|||
				return
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if right.sym.info is ast.Array {
 | 
			
		||||
		if right.sym.info is ast.ArrayFixed {
 | 
			
		||||
			elem_type := right.sym.info.elem_type
 | 
			
		||||
			elem_type_ := g.unwrap(elem_type)
 | 
			
		||||
			if elem_type_.sym.kind == .sum_type {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,4 +5,14 @@ fn test_fixed_array_in_op() {
 | 
			
		|||
 | 
			
		||||
	ch := `"`
 | 
			
		||||
	assert ch in [`"`, `'`]!
 | 
			
		||||
 | 
			
		||||
	fixed_arr := [1, 2, 3]!
 | 
			
		||||
 | 
			
		||||
	b1 := 2 in fixed_arr
 | 
			
		||||
	println(b1)
 | 
			
		||||
	assert b1
 | 
			
		||||
 | 
			
		||||
	b2 := 5 !in fixed_arr
 | 
			
		||||
	println(b2)
 | 
			
		||||
	assert b2
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue