Commit 10016e0368

amp-59 <114923809+amp-59@users.noreply.github.com>
2023-12-27 00:14:48
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.
1 parent ecd520f
Changed files (2)
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;
 
test/cases/shl_exact_comptime_int_lhs.zig
@@ -0,0 +1,6 @@
+export fn entry() void {
+    if (@shlExact(1, 1) != 2) @compileError("should be 2");
+}
+
+// compile
+// output_mode=Obj