diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-12-08 19:09:37 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-12-08 19:09:37 -0700 |
| commit | 803178353976fe4ef343aef25dfa6d8e418ef88f (patch) | |
| tree | 22b79769fc5e0038332d3f2c39333311894cc7e2 /src | |
| parent | 38b2d6209239f0dad7cb38e656d9d38506f126ca (diff) | |
| download | zig-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.cpp | 32 |
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); |
