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(...@@ -29418,10 +29418,10 @@ fn coerceVarArgParam(
29418 "integer and float literals passed to variadic function must be casted to a fixed-size number type",29418 "integer and float literals passed to variadic function must be casted to a fixed-size number type",
29419 .{},29419 .{},
29420 ),29420 ),
29421 .Fn => blk: {29421 .Fn => fn_ptr: {
29422 const fn_val = try sema.resolveConstDefinedValue(block, .unneeded, inst, undefined);29422 const fn_val = try sema.resolveConstDefinedValue(block, .unneeded, inst, undefined);
29423 const fn_decl = fn_val.pointerDecl(mod).?;29423 const fn_decl = fn_val.pointerDecl(mod).?;
29424 break :blk try sema.analyzeDeclRef(fn_decl);29424 break :fn_ptr try sema.analyzeDeclRef(fn_decl);
29425 },29425 },
29426 .Array => return sema.fail(block, inst_src, "arrays must be passed by reference to variadic function", .{}),29426 .Array => return sema.fail(block, inst_src, "arrays must be passed by reference to variadic function", .{}),
29427 .Float => float: {29427 .Float => float: {
...@@ -29435,7 +29435,32 @@ fn coerceVarArgParam(...@@ -29435,7 +29435,32 @@ fn coerceVarArgParam(
29435 else => unreachable,29435 else => unreachable,
29436 }29436 }
29437 },29437 },
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,
29439 };29464 };
2944029465
29441 const coerced_ty = sema.typeOf(coerced);29466 const coerced_ty = sema.typeOf(coerced);