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
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		done << t
 | 
							done << t
 | 
				
			||||||
 | 
							if left_final_sym.kind == .array {
 | 
				
			||||||
			mut left_type_str := g.typ(t)
 | 
								mut left_type_str := g.typ(t)
 | 
				
			||||||
			fn_name := '${left_type_str}_contains'
 | 
								fn_name := '${left_type_str}_contains'
 | 
				
			||||||
			left_info := left_final_sym.info as ast.Array
 | 
								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('\treturn false;')
 | 
				
			||||||
			fn_builder.writeln('}')
 | 
								fn_builder.writeln('}')
 | 
				
			||||||
			g.auto_fn_definitions << fn_builder.str()
 | 
								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
 | 
									return
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if right.sym.info is ast.Array {
 | 
							if right.sym.info is ast.ArrayFixed {
 | 
				
			||||||
			elem_type := right.sym.info.elem_type
 | 
								elem_type := right.sym.info.elem_type
 | 
				
			||||||
			elem_type_ := g.unwrap(elem_type)
 | 
								elem_type_ := g.unwrap(elem_type)
 | 
				
			||||||
			if elem_type_.sym.kind == .sum_type {
 | 
								if elem_type_.sym.kind == .sum_type {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,4 +5,14 @@ fn test_fixed_array_in_op() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ch := `"`
 | 
						ch := `"`
 | 
				
			||||||
	assert ch in [`"`, `'`]!
 | 
						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