authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-11-07 10:37:44+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-11-09 16:25:47-07:00
log0e2eb6eb651112e27ae996cfdb67a878ddb61f81
tree17f382cf71f11cee884e69043857ee7bd75829e6
parentc2c3177d8246bebbeb8d4dfd9349318f36122e90

stage1: Print correct error message for vector @intCast


2 files changed, 17 insertions(+), 2 deletions(-)

src/stage1/codegen.cpp+1-1
......@@ -1487,7 +1487,7 @@ static LLVMValueRef gen_widen_or_shorten(CodeGen *g, bool want_runtime_safety, Z
14871487 LLVMBuildCondBr(g->builder, ok_bit, ok_block, fail_block);
14881488
14891489 LLVMPositionBuilderAtEnd(g->builder, fail_block);
1490 gen_safety_crash(g, actual_type->data.integral.is_signed ? PanicMsgIdCastNegativeToUnsigned : PanicMsgIdCastTruncatedData);
1490 gen_safety_crash(g, scalar_actual_type->data.integral.is_signed ? PanicMsgIdCastNegativeToUnsigned : PanicMsgIdCastTruncatedData);
14911491
14921492 LLVMPositionBuilderAtEnd(g->builder, ok_block);
14931493 }
test/runtime_safety.zig+16-1
......@@ -89,7 +89,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
8989 \\const std = @import("std");
9090 \\const V = @import("std").meta.Vector;
9191 \\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn {
92 \\ if (std.mem.eql(u8, message, "attempt to cast negative value to unsigned integer")) {
92 \\ if (std.mem.eql(u8, message, "integer cast truncated bits")) {
9393 \\ std.process.exit(126); // good
9494 \\ }
9595 \\ std.process.exit(0); // test failed
......@@ -100,6 +100,21 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
100100 \\}
101101 );
102102
103 cases.addRuntimeSafety("signed-unsigned vector cast",
104 \\const std = @import("std");
105 \\const V = @import("std").meta.Vector;
106 \\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn {
107 \\ if (std.mem.eql(u8, message, "attempt to cast negative value to unsigned integer")) {
108 \\ std.process.exit(126); // good
109 \\ }
110 \\ std.process.exit(0); // test failed
111 \\}
112 \\pub fn main() void {
113 \\ var x = @splat(4, @as(i32, -2147483647));
114 \\ var y = @intCast(V(4, u32), x);
115 \\}
116 );
117
103118 cases.addRuntimeSafety("shift left by huge amount",
104119 \\const std = @import("std");
105120 \\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn {