commit 0e118ed0aca3d852d2499fa37d04adef62b03ead (tree)
parent 8fd20a5eb015fda4b27cef14c9e3149575861994
Author: LeRoyce Pearson <contact@leroycepearson.dev>
Date: Tue, 9 Aug 2022 16:08:59 -0600
stage2: add compile error for shlExact overflow
- moves a stage1 test case and makes it target `llvm` backend instead
of `stage1` backend
Diffstat:
3 files changed, 15 insertions(+), 17 deletions(-)
diff --git a/src/Sema.zig b/src/Sema.zig
@@ -10269,16 +10269,14 @@ fn zirShl(
const val = switch (air_tag) {
.shl_exact => val: {
- const shifted = try lhs_val.shl(rhs_val, lhs_ty, sema.arena, target);
+ const shifted = try lhs_val.shlWithOverflow(rhs_val, lhs_ty, sema.arena, target);
if (scalar_ty.zigTypeTag() == .ComptimeInt) {
- break :val shifted;
+ break :val shifted.wrapped_result;
}
- const int_info = scalar_ty.intInfo(target);
- const truncated = try shifted.intTrunc(lhs_ty, sema.arena, int_info.signedness, int_info.bits, target);
- if (try sema.compare(block, src, truncated, .eq, shifted, lhs_ty)) {
- break :val shifted;
+ if (shifted.overflowed.compareWithZero(.eq)) {
+ break :val shifted.wrapped_result;
}
- return sema.addConstUndef(lhs_ty);
+ return sema.fail(block, src, "operation caused overflow", .{});
},
.shl_sat => if (scalar_ty.zigTypeTag() == .ComptimeInt)
diff --git a/test/cases/compile_errors/shlExact_shifts_out_1_bits.zig b/test/cases/compile_errors/shlExact_shifts_out_1_bits.zig
@@ -0,0 +1,10 @@
+comptime {
+ const x = @shlExact(@as(u8, 0b01010101), 2);
+ _ = x;
+}
+
+// error
+// backend=llvm
+// target=native
+//
+// :2:15: error: operation caused overflow
diff --git a/test/cases/compile_errors/stage1/obj/shlExact_shifts_out_1_bits.zig b/test/cases/compile_errors/stage1/obj/shlExact_shifts_out_1_bits.zig
@@ -1,10 +0,0 @@
-comptime {
- const x = @shlExact(@as(u8, 0b01010101), 2);
- _ = x;
-}
-
-// error
-// backend=stage1
-// target=native
-//
-// tmp.zig:2:15: error: operation caused overflow