mirror of
https://github.com/ziglang/zig.git
synced 2024-11-27 07:32:44 +00:00
Sema: fix crash compiling @shlExact
Updated `zirShl`, to compute `shl_exact` with `comptime_int` LHS operand like `shl`, and added test case for `@shlExact` with `comptime_int` LHS operand.
This commit is contained in:
parent
ecd520f661
commit
10016e0368
22
src/Sema.zig
22
src/Sema.zig
@ -13247,32 +13247,20 @@ fn zirShl(
|
||||
}
|
||||
break :rs rhs_src;
|
||||
};
|
||||
|
||||
const val = switch (air_tag) {
|
||||
const val = if (scalar_ty.zigTypeTag(mod) == .ComptimeInt)
|
||||
try lhs_val.shl(rhs_val, lhs_ty, sema.arena, mod)
|
||||
else switch (air_tag) {
|
||||
.shl_exact => val: {
|
||||
const shifted = try lhs_val.shlWithOverflow(rhs_val, lhs_ty, sema.arena, mod);
|
||||
if (scalar_ty.zigTypeTag(mod) == .ComptimeInt) {
|
||||
break :val shifted.wrapped_result;
|
||||
}
|
||||
if (shifted.overflow_bit.compareAllWithZero(.eq, mod)) {
|
||||
break :val shifted.wrapped_result;
|
||||
}
|
||||
return sema.fail(block, src, "operation caused overflow", .{});
|
||||
},
|
||||
|
||||
.shl_sat => if (scalar_ty.zigTypeTag(mod) == .ComptimeInt)
|
||||
try lhs_val.shl(rhs_val, lhs_ty, sema.arena, mod)
|
||||
else
|
||||
try lhs_val.shlSat(rhs_val, lhs_ty, sema.arena, mod),
|
||||
|
||||
.shl => if (scalar_ty.zigTypeTag(mod) == .ComptimeInt)
|
||||
try lhs_val.shl(rhs_val, lhs_ty, sema.arena, mod)
|
||||
else
|
||||
try lhs_val.shlTrunc(rhs_val, lhs_ty, sema.arena, mod),
|
||||
|
||||
.shl_sat => try lhs_val.shlSat(rhs_val, lhs_ty, sema.arena, mod),
|
||||
.shl => try lhs_val.shlTrunc(rhs_val, lhs_ty, sema.arena, mod),
|
||||
else => unreachable,
|
||||
};
|
||||
|
||||
return Air.internedToRef(val.toIntern());
|
||||
} else lhs_src;
|
||||
|
||||
|
6
test/cases/shl_exact_comptime_int_lhs.zig
Normal file
6
test/cases/shl_exact_comptime_int_lhs.zig
Normal file
@ -0,0 +1,6 @@
|
||||
export fn entry() void {
|
||||
if (@shlExact(1, 1) != 2) @compileError("should be 2");
|
||||
}
|
||||
|
||||
// compile
|
||||
// output_mode=Obj
|
Loading…
Reference in New Issue
Block a user