checker: c2v: allow passing fixed array as pointer to functions; bool <-> int (#14309)
							parent
							
								
									3f87f8f4b4
								
							
						
					
					
						commit
						a17d744e8b
					
				|  | @ -13,6 +13,9 @@ pub fn (mut c Checker) check_types(got ast.Type, expected ast.Type) bool { | |||
| 	got_is_ptr := got.is_ptr() | ||||
| 	exp_is_ptr := expected.is_ptr() | ||||
| 	if c.pref.translated { | ||||
| 		if expected.is_int() && got.is_int() { | ||||
| 			return true | ||||
| 		} | ||||
| 		if expected == ast.byteptr_type { | ||||
| 			return true | ||||
| 		} | ||||
|  |  | |||
|  | @ -935,6 +935,12 @@ pub fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool) | |||
| 				if arg_typ == ast.int_type && param_typ_sym.kind == .enum_ { | ||||
| 					continue | ||||
| 				} | ||||
| 
 | ||||
| 				if (arg_typ == ast.bool_type && param.typ.is_int()) | ||||
| 					|| (arg_typ.is_int() && param.typ == ast.bool_type) { | ||||
| 					continue | ||||
| 				} | ||||
| 
 | ||||
| 				// In C unsafe number casts are used all the time (e.g. `char*` where
 | ||||
| 				// `int*` is expected etc), so just allow them all.
 | ||||
| 				mut param_is_number := param.typ.is_number() | ||||
|  | @ -953,8 +959,10 @@ pub fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool) | |||
| 					continue | ||||
| 				} | ||||
| 				// Allow `[32]i8` as `&i8` etc
 | ||||
| 				if (arg_typ_sym.kind == .array_fixed && param_is_number) | ||||
| 					|| (param_typ_sym.kind == .array_fixed && typ_is_number) { | ||||
| 				if (arg_typ_sym.kind == .array_fixed && (param_is_number | ||||
| 					|| param.typ.is_any_kind_of_pointer())) | ||||
| 					|| (param_typ_sym.kind == .array_fixed && (typ_is_number | ||||
| 					|| arg_typ.is_any_kind_of_pointer())) { | ||||
| 					continue | ||||
| 				} | ||||
| 				// Allow `int` as `&i8`
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue