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...@@ -1487,7 +1487,7 @@ static LLVMValueRef gen_widen_or_shorten(CodeGen *g, bool want_runtime_safety, Z
1487 LLVMBuildCondBr(g->builder, ok_bit, ok_block, fail_block);1487 LLVMBuildCondBr(g->builder, ok_bit, ok_block, fail_block);
14881488
1489 LLVMPositionBuilderAtEnd(g->builder, fail_block);1489 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
1492 LLVMPositionBuilderAtEnd(g->builder, ok_block);1492 LLVMPositionBuilderAtEnd(g->builder, ok_block);
1493 }1493 }
test/runtime_safety.zig+16-1
...@@ -89,7 +89,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {...@@ -89,7 +89,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
89 \\const std = @import("std");89 \\const std = @import("std");
90 \\const V = @import("std").meta.Vector;90 \\const V = @import("std").meta.Vector;
91 \\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn {91 \\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")) {
93 \\ std.process.exit(126); // good93 \\ std.process.exit(126); // good
94 \\ }94 \\ }
95 \\ std.process.exit(0); // test failed95 \\ std.process.exit(0); // test failed
...@@ -100,6 +100,21 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {...@@ -100,6 +100,21 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
100 \\}100 \\}
101 );101 );
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
103 cases.addRuntimeSafety("shift left by huge amount",118 cases.addRuntimeSafety("shift left by huge amount",
104 \\const std = @import("std");119 \\const std = @import("std");
105 \\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn {120 \\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn {