aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-12-08 19:09:37 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-12-08 19:09:37 -0700
commit803178353976fe4ef343aef25dfa6d8e418ef88f (patch)
tree22b79769fc5e0038332d3f2c39333311894cc7e2 /src
parent38b2d6209239f0dad7cb38e656d9d38506f126ca (diff)
downloadzig-803178353976fe4ef343aef25dfa6d8e418ef88f.tar.gz
zig-803178353976fe4ef343aef25dfa6d8e418ef88f.zip
stage1: fix regression of shift by negative value error
The previous commit (38b2d6209239f0dad7cb38e656d9d38506f126ca) regressed the compile error test case for when doing saturating shift left of a comptime-known negative RHS. This commit additionally fixes the error for regular shifts in addition to saturating shifts.
Diffstat (limited to 'src')
-rw-r--r--src/stage1/ir.cpp32
1 files changed, 24 insertions, 8 deletions
diff --git a/src/stage1/ir.cpp b/src/stage1/ir.cpp
index 5cec62bc80..34ff4a4f04 100644
--- a/src/stage1/ir.cpp
+++ b/src/stage1/ir.cpp
@@ -10121,6 +10121,30 @@ static Stage1AirInst *ir_analyze_bit_shift(IrAnalyze *ira, Stage1ZirInstBinOp *b
if (op2_val == nullptr)
return ira->codegen->invalid_inst_gen;
+ if (op2_val->type->id == ZigTypeIdVector) {
+ expand_undef_array(ira->codegen, op2_val);
+ size_t len = op2_val->type->data.vector.len;
+ for (size_t i = 0; i < len; i += 1) {
+ ZigValue *scalar_val = &op2_val->data.x_array.data.s_none.elements[i];
+ if (scalar_val->data.x_bigint.is_negative) {
+ Buf *val_buf = buf_alloc();
+ bigint_append_buf(val_buf, &scalar_val->data.x_bigint, 10);
+ ir_add_error(ira, casted_op2,
+ buf_sprintf("shift by negative value %s at vector index %zu",
+ buf_ptr(val_buf), i));
+ return ira->codegen->invalid_inst_gen;
+ }
+ }
+ } else {
+ 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;
+ }
+ }
+
if (value_cmp_numeric_val_all(op2_val, CmpEQ, nullptr))
return ir_analyze_cast(ira, bin_op_instruction->base.scope, bin_op_instruction->base.source_node, op1->value->type, op1);
}
@@ -10515,14 +10539,6 @@ 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);