Commit 16ac034a32

travisstaloch <twostepted@gmail.com>
2021-10-15 19:56:27
Sat shl neg rhs (#9949)
* saturating shl - check for negative rhs at comptime - adds expected compile_errors case for negative rhs * add expected compile error for sat shl assign
1 parent 411e9ca
Changed files (2)
src
stage1
test
src/stage1/ir.cpp
@@ -10407,6 +10407,14 @@ static Stage1AirInst *ir_analyze_bin_op_math(IrAnalyze *ira, Stage1ZirInstBinOp
                     return ira->codegen->invalid_inst_gen;
                 }
             }
+        } else if (op_id == IrBinOpShlSat) {
+            if (op2_val->data.x_bigint.is_negative) {
+                Buf *val_buf = buf_alloc();
+                bigint_append_buf(val_buf, &op2_val->data.x_bigint, 10);
+                ir_add_error(ira, casted_op2,
+                    buf_sprintf("shift by negative value %s", buf_ptr(val_buf)));
+                return ira->codegen->invalid_inst_gen;
+            }
         }
 
         return ir_analyze_math_op(ira, instruction->base.scope, instruction->base.source_node, resolved_type, op1_val, op_id, op2_val);
test/compile_errors.zig
@@ -8869,6 +8869,25 @@ pub fn addCases(ctx: *TestContext) !void {
         "error: invalid operands to binary expression: 'f32' and 'f32'",
     });
 
+    ctx.objErrStage1("saturating shl does not allow negative rhs at comptime",
+        \\pub fn main() !void {
+        \\    _ = @as(i32, 1) <<| @as(i32, -2);
+        \\}
+    , &[_][]const u8{
+        "error: shift by negative value -2",
+    });
+
+    ctx.objErrStage1("saturating shl assign does not allow negative rhs at comptime",
+        \\pub fn main() !void {
+        \\    comptime {
+        \\      var x = @as(i32, 1);
+        \\      x <<|= @as(i32, -2);
+        \\  }
+        \\}
+    , &[_][]const u8{
+        "error: shift by negative value -2",
+    });
+
     ctx.objErrStage1("undeclared identifier in unanalyzed branch",
         \\export fn a() void {
         \\    if (false) {