authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-11-08 23:52:59-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-11-08 23:52:59-07:00
loga1d688b86aeba7ab72ae12679ff04a7730931af3
tree610ba41fc7035e49ea24004221aed8411643a129
parent997eaf6d8724fe2076195de4d6d54bf2bf880eea
parent52d8099daeb34edc00898ef8cc34bd6f136949aa
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #17913 from jacobly0/vararg-int

Sema: implement vararg integer promotions

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

src/Sema.zig+29-3
......@@ -29419,10 +29419,10 @@ fn coerceVarArgParam(
2941929419 "integer and float literals passed to variadic function must be casted to a fixed-size number type",
2942029420 .{},
2942129421 ),
29422 .Fn => blk: {
29422 .Fn => fn_ptr: {
2942329423 const fn_val = try sema.resolveConstDefinedValue(block, .unneeded, inst, undefined);
2942429424 const fn_decl = fn_val.pointerDecl(mod).?;
29425 break :blk try sema.analyzeDeclRef(fn_decl);
29425 break :fn_ptr try sema.analyzeDeclRef(fn_decl);
2942629426 },
2942729427 .Array => return sema.fail(block, inst_src, "arrays must be passed by reference to variadic function", .{}),
2942829428 .Float => float: {
......@@ -29436,7 +29436,33 @@ fn coerceVarArgParam(
2943629436 else => unreachable,
2943729437 }
2943829438 },
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,
2944029466 };
2944129467
2944229468 const coerced_ty = sema.typeOf(coerced);