aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Sema.zig7
-rw-r--r--test/cases/safety/signed integer not fitting in cast to unsigned integer - widening.zig10
-rw-r--r--test/cases/safety/signed integer not fitting in cast to unsigned integer.zig11
-rw-r--r--test/cases/safety/signed-unsigned vector cast.zig2
4 files changed, 18 insertions, 12 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 9fdb98f3c2..e30b7f5cec 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -8092,6 +8092,7 @@ fn intCast(
const is_in_range = try block.addBinOp(.cmp_lte, diff_unsigned, dest_range);
break :ok is_in_range;
};
+ // TODO negative_to_unsigned?
try sema.addSafetyCheck(block, ok, .cast_truncated_data);
} else {
const ok = if (is_vector) ok: {
@@ -8116,7 +8117,7 @@ fn intCast(
const ok = if (is_vector) ok: {
const zero_val = try Value.Tag.repeated.create(sema.arena, Value.zero);
const zero_inst = try sema.addConstant(operand_ty, zero_val);
- const is_in_range = try block.addCmpVector(operand, zero_inst, .lte, try sema.addType(operand_ty));
+ const is_in_range = try block.addCmpVector(operand, zero_inst, .gte, try sema.addType(operand_ty));
const all_in_range = try block.addInst(.{
.tag = .reduce,
.data = .{ .reduce = .{
@@ -8130,7 +8131,7 @@ fn intCast(
const is_in_range = try block.addBinOp(.cmp_gte, operand, zero_inst);
break :ok is_in_range;
};
- try sema.addSafetyCheck(block, ok, .cast_truncated_data);
+ try sema.addSafetyCheck(block, ok, .negative_to_unsigned);
}
}
return block.addTyOp(.intcast, dest_ty, operand);
@@ -18849,6 +18850,7 @@ pub const PanicId = enum {
incorrect_alignment,
invalid_error_code,
cast_truncated_data,
+ negative_to_unsigned,
integer_overflow,
shl_overflow,
shr_overflow,
@@ -19069,6 +19071,7 @@ fn safetyPanic(
.incorrect_alignment => "incorrect alignment",
.invalid_error_code => "invalid error code",
.cast_truncated_data => "integer cast truncated bits",
+ .negative_to_unsigned => "attempt to cast negative value to unsigned integer",
.integer_overflow => "integer overflow",
.shl_overflow => "left shift overflowed bits",
.shr_overflow => "right shift overflowed bits",
diff --git a/test/cases/safety/signed integer not fitting in cast to unsigned integer - widening.zig b/test/cases/safety/signed integer not fitting in cast to unsigned integer - widening.zig
index 7abd085364..6ee23c9aee 100644
--- a/test/cases/safety/signed integer not fitting in cast to unsigned integer - widening.zig
+++ b/test/cases/safety/signed integer not fitting in cast to unsigned integer - widening.zig
@@ -1,9 +1,11 @@
const std = @import("std");
pub fn panic(message: []const u8, stack_trace: ?*std.builtin.StackTrace) noreturn {
- _ = message;
_ = stack_trace;
- std.process.exit(0);
+ if (std.mem.eql(u8, message, "attempt to cast negative value to unsigned integer")) {
+ std.process.exit(0);
+ }
+ std.process.exit(1);
}
pub fn main() !void {
var value: c_short = -1;
@@ -12,5 +14,5 @@ pub fn main() !void {
return error.TestFailed;
}
// run
-// backend=stage1
-// target=native \ No newline at end of file
+// backend=llvm
+// target=native
diff --git a/test/cases/safety/signed integer not fitting in cast to unsigned integer.zig b/test/cases/safety/signed integer not fitting in cast to unsigned integer.zig
index 4dea06fc82..5c21e0a098 100644
--- a/test/cases/safety/signed integer not fitting in cast to unsigned integer.zig
+++ b/test/cases/safety/signed integer not fitting in cast to unsigned integer.zig
@@ -1,11 +1,12 @@
const std = @import("std");
pub fn panic(message: []const u8, stack_trace: ?*std.builtin.StackTrace) noreturn {
- _ = message;
_ = stack_trace;
- std.process.exit(0);
+ if (std.mem.eql(u8, message, "attempt to cast negative value to unsigned integer")) {
+ std.process.exit(0);
+ }
+ std.process.exit(1);
}
-
pub fn main() !void {
const x = unsigned_cast(-10);
if (x == 0) return error.Whatever;
@@ -15,5 +16,5 @@ fn unsigned_cast(x: i32) u32 {
return @intCast(u32, x);
}
// run
-// backend=stage1
-// target=native \ No newline at end of file
+// backend=llvm
+// target=native
diff --git a/test/cases/safety/signed-unsigned vector cast.zig b/test/cases/safety/signed-unsigned vector cast.zig
index 15d120350e..5d8a2ea271 100644
--- a/test/cases/safety/signed-unsigned vector cast.zig
+++ b/test/cases/safety/signed-unsigned vector cast.zig
@@ -16,5 +16,5 @@ pub fn main() !void {
}
// run
-// backend=stage1
+// backend=llvm
// target=native