From 0ef26d113ae5a8b307a3af76db61706846fea22f Mon Sep 17 00:00:00 2001 From: Justus Klausecker Date: Thu, 7 Aug 2025 02:08:40 +0200 Subject: [PATCH] make `>>` a compile error with any undef arg ; add a bunch of test cases --- src/Sema.zig | 22 ++++++------------- src/Sema/arith.zig | 13 +++-------- test/behavior/bit_shifting.zig | 7 ------ .../shl_exact_on_undefined_value.zig | 11 ++++++++++ .../compile_errors/shl_on_undefined_value.zig | 11 ++++++++++ .../shl_with_overflow_on_undefined_value.zig | 11 ++++++++++ .../shr_exact_on_undefined_value.zig | 11 ++++++++++ .../compile_errors/shr_on_undefined_value.zig | 11 ++++++++++ 8 files changed, 65 insertions(+), 32 deletions(-) create mode 100644 test/cases/compile_errors/shl_exact_on_undefined_value.zig create mode 100644 test/cases/compile_errors/shl_on_undefined_value.zig create mode 100644 test/cases/compile_errors/shl_with_overflow_on_undefined_value.zig create mode 100644 test/cases/compile_errors/shr_exact_on_undefined_value.zig create mode 100644 test/cases/compile_errors/shr_on_undefined_value.zig diff --git a/src/Sema.zig b/src/Sema.zig index 077d430e41..d653e39bbf 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -13826,11 +13826,9 @@ fn zirShr( else => unreachable, })).toIntern()); } - if (rhs_val.isUndef(zcu)) switch (air_tag) { - .shr => return pt.undefRef(lhs_ty), - .shr_exact => return sema.failWithUseOfUndef(block, rhs_src, null), - else => unreachable, - }; + if (rhs_val.isUndef(zcu)) { + return sema.failWithUseOfUndef(block, rhs_src, null); + } const bits_val = try pt.intValue(.comptime_int, scalar_ty.intInfo(zcu).bits); switch (rhs_ty.zigTypeTag(zcu)) { .int, .comptime_int => { @@ -13849,11 +13847,9 @@ fn zirShr( var elem_idx: usize = 0; while (elem_idx < rhs_ty.vectorLen(zcu)) : (elem_idx += 1) { const rhs_elem = try rhs_val.elemValue(pt, elem_idx); - if (rhs_elem.isUndef(zcu)) switch (air_tag) { - .shr => continue, - .shr_exact => return sema.failWithUseOfUndef(block, rhs_src, elem_idx), - else => unreachable, - }; + if (rhs_elem.isUndef(zcu)) { + return sema.failWithUseOfUndef(block, rhs_src, elem_idx); + } switch (try rhs_elem.orderAgainstZeroSema(pt)) { .gt => { if (try rhs_elem.compareHeteroSema(.gte, bits_val, pt)) { @@ -13875,11 +13871,7 @@ fn zirShr( return sema.fail(block, src, "LHS of shift must be a fixed-width integer type, or RHS must be comptime-known", .{}); } if (maybe_lhs_val) |lhs_val| { - switch (air_tag) { - .shr => if (lhs_val.isUndef(zcu)) return pt.undefRef(lhs_ty), - .shr_exact => try sema.checkAllScalarsDefined(block, lhs_src, lhs_val), - else => unreachable, - } + try sema.checkAllScalarsDefined(block, lhs_src, lhs_val); } } break :rs rhs_src; diff --git a/src/Sema/arith.zig b/src/Sema/arith.zig index 43263e7254..a2d931295d 100644 --- a/src/Sema/arith.zig +++ b/src/Sema/arith.zig @@ -1221,16 +1221,9 @@ fn shrScalar( const pt = sema.pt; const zcu = pt.zcu; - switch (op) { - .shr => { - if (lhs_val.isUndef(zcu)) return lhs_val; - if (rhs_val.isUndef(zcu)) return pt.undefValue(lhs_ty); - }, - .shr_exact => { - if (lhs_val.isUndef(zcu)) return sema.failWithUseOfUndef(block, lhs_src, vec_idx); - if (rhs_val.isUndef(zcu)) return sema.failWithUseOfUndef(block, rhs_src, vec_idx); - }, - } + if (lhs_val.isUndef(zcu)) return sema.failWithUseOfUndef(block, lhs_src, vec_idx); + if (rhs_val.isUndef(zcu)) return sema.failWithUseOfUndef(block, rhs_src, vec_idx); + switch (try rhs_val.orderAgainstZeroSema(pt)) { .gt => {}, .eq => return lhs_val, diff --git a/test/behavior/bit_shifting.zig b/test/behavior/bit_shifting.zig index 9477249717..42d3e982d7 100644 --- a/test/behavior/bit_shifting.zig +++ b/test/behavior/bit_shifting.zig @@ -196,10 +196,3 @@ test "Saturating Shift Left" { try expectEqual(170141183460469231731687303715884105727, S.shlSat(@as(i128, 0x2fe6bc5448c55ce18252e2c9d4477750), 0x31)); try expectEqual(0, S.shlSat(@as(i128, 0), 127)); } - -test "shift by partially undef vector" { - comptime { - const a: @Vector(1, u8) = .{undefined}; - _ = a >> @splat(4); - } -} diff --git a/test/cases/compile_errors/shl_exact_on_undefined_value.zig b/test/cases/compile_errors/shl_exact_on_undefined_value.zig new file mode 100644 index 0000000000..a2c7684b47 --- /dev/null +++ b/test/cases/compile_errors/shl_exact_on_undefined_value.zig @@ -0,0 +1,11 @@ +comptime { + var a: i64 = undefined; + var b: u6 = undefined; + _ = &a; + _ = &b; + _ = @shlExact(a, b); +} + +// error +// +// :6:19: error: use of undefined value here causes illegal behavior diff --git a/test/cases/compile_errors/shl_on_undefined_value.zig b/test/cases/compile_errors/shl_on_undefined_value.zig new file mode 100644 index 0000000000..30d9e806c5 --- /dev/null +++ b/test/cases/compile_errors/shl_on_undefined_value.zig @@ -0,0 +1,11 @@ +comptime { + var a: i64 = undefined; + var b: u6 = undefined; + _ = &a; + _ = &b; + _ = a << b; +} + +// error +// +// :6:9: error: use of undefined value here causes illegal behavior diff --git a/test/cases/compile_errors/shl_with_overflow_on_undefined_value.zig b/test/cases/compile_errors/shl_with_overflow_on_undefined_value.zig new file mode 100644 index 0000000000..7099d0b256 --- /dev/null +++ b/test/cases/compile_errors/shl_with_overflow_on_undefined_value.zig @@ -0,0 +1,11 @@ +comptime { + var a: i64 = undefined; + var b: u6 = undefined; + _ = &a; + _ = &b; + _ = @shlWithOverflow(a, b); +} + +// error +// +// :6:26: error: use of undefined value here causes illegal behavior diff --git a/test/cases/compile_errors/shr_exact_on_undefined_value.zig b/test/cases/compile_errors/shr_exact_on_undefined_value.zig new file mode 100644 index 0000000000..1a6d06612f --- /dev/null +++ b/test/cases/compile_errors/shr_exact_on_undefined_value.zig @@ -0,0 +1,11 @@ +comptime { + var a: i64 = undefined; + var b: u6 = undefined; + _ = &a; + _ = &b; + _ = @shrExact(a, b); +} + +// error +// +// :6:19: error: use of undefined value here causes illegal behavior diff --git a/test/cases/compile_errors/shr_on_undefined_value.zig b/test/cases/compile_errors/shr_on_undefined_value.zig new file mode 100644 index 0000000000..cae5f3e6a8 --- /dev/null +++ b/test/cases/compile_errors/shr_on_undefined_value.zig @@ -0,0 +1,11 @@ +comptime { + var a: i64 = undefined; + var b: u6 = undefined; + _ = &a; + _ = &b; + _ = a >> b; +} + +// error +// +// :6:9: error: use of undefined value here causes illegal behavior