diff --git a/src/stage1/ir.cpp b/src/stage1/ir.cpp index 2f2cfe08f3..9a3b938dbd 100644 --- a/src/stage1/ir.cpp +++ b/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); diff --git a/test/compile_errors.zig b/test/compile_errors.zig index ab0d504e68..877ceec85d 100644 --- a/test/compile_errors.zig +++ b/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) {