authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-11-07 12:11:57-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-11-08 14:43:23-05:00
log045a5e924ce9abe239634545b0ad35576cc2fafc
treee3b15a212909290f52f52309b4b712ed33fd50d9
parenta70d8d29d5895a8b44a86e8f065ee3ee59c9bfe8

Sema: implement vararg integer promotions


1 files changed, 28 insertions(+), 3 deletions(-)

src/Sema.zig+28-3
......@@ -29418,10 +29418,10 @@ fn coerceVarArgParam(
2941829418 "integer and float literals passed to variadic function must be casted to a fixed-size number type",
2941929419 .{},
2942029420 ),
29421 .Fn => blk: {
29421 .Fn => fn_ptr: {
2942229422 const fn_val = try sema.resolveConstDefinedValue(block, .unneeded, inst, undefined);
2942329423 const fn_decl = fn_val.pointerDecl(mod).?;
29424 break :blk try sema.analyzeDeclRef(fn_decl);
29424 break :fn_ptr try sema.analyzeDeclRef(fn_decl);
2942529425 },
2942629426 .Array => return sema.fail(block, inst_src, "arrays must be passed by reference to variadic function", .{}),
2942729427 .Float => float: {
......@@ -29435,7 +29435,32 @@ fn coerceVarArgParam(
2943529435 else => unreachable,
2943629436 }
2943729437 },
29438 else => inst,
29438 else => if (uncasted_ty.isAbiInt(mod)) int: {
29439 const target = sema.mod.getTarget();
29440 const uncasted_info = uncasted_ty.intInfo(mod);
29441 if (uncasted_info.bits <= target.c_type_bit_size(switch (uncasted_info.signedness) {
29442 .signed => .int,
29443 .unsigned => .uint,
29444 })) break :int try sema.coerce(block, switch (uncasted_info.signedness) {
29445 .signed => Type.c_int,
29446 .unsigned => Type.c_uint,
29447 }, inst, inst_src);
29448 if (uncasted_info.bits <= target.c_type_bit_size(switch (uncasted_info.signedness) {
29449 .signed => .long,
29450 .unsigned => .ulong,
29451 })) break :int try sema.coerce(block, switch (uncasted_info.signedness) {
29452 .signed => Type.c_long,
29453 .unsigned => Type.c_ulong,
29454 }, inst, inst_src);
29455 if (uncasted_info.bits <= target.c_type_bit_size(switch (uncasted_info.signedness) {
29456 .signed => .longlong,
29457 .unsigned => .ulonglong,
29458 })) break :int try sema.coerce(block, switch (uncasted_info.signedness) {
29459 .signed => Type.c_longlong,
29460 .unsigned => Type.c_ulonglong,
29461 }, inst, inst_src);
29462 break :int inst;
29463 } else inst,
2943929464 };
2944029465
2944129466 const coerced_ty = sema.typeOf(coerced);