| ... | @@ -29419,10 +29419,10 @@ fn coerceVarArgParam( | ... | @@ -29419,10 +29419,10 @@ fn coerceVarArgParam( |
| 29419 | "integer and float literals passed to variadic function must be casted to a fixed-size number type", | 29419 | "integer and float literals passed to variadic function must be casted to a fixed-size number type", |
| 29420 | .{}, | 29420 | .{}, |
| 29421 | ), | 29421 | ), |
| 29422 | .Fn => blk: { | 29422 | .Fn => fn_ptr: { |
| 29423 | const fn_val = try sema.resolveConstDefinedValue(block, .unneeded, inst, undefined); | 29423 | const fn_val = try sema.resolveConstDefinedValue(block, .unneeded, inst, undefined); |
| 29424 | const fn_decl = fn_val.pointerDecl(mod).?; | 29424 | const fn_decl = fn_val.pointerDecl(mod).?; |
| 29425 | break :blk try sema.analyzeDeclRef(fn_decl); | 29425 | break :fn_ptr try sema.analyzeDeclRef(fn_decl); |
| 29426 | }, | 29426 | }, |
| 29427 | .Array => return sema.fail(block, inst_src, "arrays must be passed by reference to variadic function", .{}), | 29427 | .Array => return sema.fail(block, inst_src, "arrays must be passed by reference to variadic function", .{}), |
| 29428 | .Float => float: { | 29428 | .Float => float: { |
| ... | @@ -29436,7 +29436,33 @@ fn coerceVarArgParam( | ... | @@ -29436,7 +29436,33 @@ fn coerceVarArgParam( |
| 29436 | else => unreachable, | 29436 | else => unreachable, |
| 29437 | } | 29437 | } |
| 29438 | }, | 29438 | }, |
| 29439 | else => inst, | 29439 | else => if (uncasted_ty.isAbiInt(mod)) int: { |
| | 29440 | if (!try sema.validateExternType(uncasted_ty, .param_ty)) break :int inst; |
| | 29441 | const target = sema.mod.getTarget(); |
| | 29442 | const uncasted_info = uncasted_ty.intInfo(mod); |
| | 29443 | if (uncasted_info.bits <= target.c_type_bit_size(switch (uncasted_info.signedness) { |
| | 29444 | .signed => .int, |
| | 29445 | .unsigned => .uint, |
| | 29446 | })) break :int try sema.coerce(block, switch (uncasted_info.signedness) { |
| | 29447 | .signed => Type.c_int, |
| | 29448 | .unsigned => Type.c_uint, |
| | 29449 | }, inst, inst_src); |
| | 29450 | if (uncasted_info.bits <= target.c_type_bit_size(switch (uncasted_info.signedness) { |
| | 29451 | .signed => .long, |
| | 29452 | .unsigned => .ulong, |
| | 29453 | })) break :int try sema.coerce(block, switch (uncasted_info.signedness) { |
| | 29454 | .signed => Type.c_long, |
| | 29455 | .unsigned => Type.c_ulong, |
| | 29456 | }, inst, inst_src); |
| | 29457 | if (uncasted_info.bits <= target.c_type_bit_size(switch (uncasted_info.signedness) { |
| | 29458 | .signed => .longlong, |
| | 29459 | .unsigned => .ulonglong, |
| | 29460 | })) break :int try sema.coerce(block, switch (uncasted_info.signedness) { |
| | 29461 | .signed => Type.c_longlong, |
| | 29462 | .unsigned => Type.c_ulonglong, |
| | 29463 | }, inst, inst_src); |
| | 29464 | break :int inst; |
| | 29465 | } else inst, |
| 29440 | }; | 29466 | }; |
| 29441 | | 29467 | |
| 29442 | const coerced_ty = sema.typeOf(coerced); | 29468 | const coerced_ty = sema.typeOf(coerced); |