zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 4b64c777ee465abb1f4a6bf2d31ba39805d5fa54 (tree)
parent 0fc645ab7084c1812d367583b37218359b21c02c
Author: Andrew Kelley <superjoe30@gmail.com>
Date:   Thu, 18 Jan 2018 17:47:21 -0500

add compile error for shifting by negative comptime integer

closes #698

Diffstat:
Msrc/ir.cpp | 7+++++++
Mtest/compile_errors.zig | 8+++++++-
2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/ir.cpp b/src/ir.cpp @@ -8816,6 +8816,13 @@ static TypeTableEntry *ir_analyze_bit_shift(IrAnalyze *ira, IrInstructionBinOp * if (op_id == IrBinOpBitShiftLeftLossy) { op_id = IrBinOpBitShiftLeftExact; } + + if (casted_op2->value.data.x_bigint.is_negative) { + Buf *val_buf = buf_alloc(); + bigint_append_buf(val_buf, &casted_op2->value.data.x_bigint, 10); + ir_add_error(ira, casted_op2, buf_sprintf("shift by negative value %s", buf_ptr(val_buf))); + return ira->codegen->builtin_types.entry_invalid; + } } else { TypeTableEntry *shift_amt_type = get_smallest_unsigned_int_type(ira->codegen, op1->value.type->data.integral.bit_count - 1); diff --git a/test/compile_errors.zig b/test/compile_errors.zig @@ -1,13 +1,19 @@ const tests = @import("tests.zig"); pub fn addCases(cases: &tests.CompileErrorContext) { + cases.add("shift by negative comptime integer", + \\comptime { + \\ var a = 1 >> -1; + \\} + , ".tmp_source.zig:2:18: error: shift by negative value -1"); + cases.add("@panic called at compile time", \\export fn entry() { \\ comptime { \\ @panic("aoeu"); \\ } \\} - , "error: encountered @panic at compile-time"); + , ".tmp_source.zig:3:9: error: encountered @panic at compile-time"); cases.add("wrong return type for main", \\pub fn main() -> f32 { }