| ... | ... | @@ -505,6 +505,21 @@ pub fn addCases(cases: *tests.CompareOutputContext) void { |
| 505 | 505 | \\} |
| 506 | 506 | ); |
| 507 | 507 | |
| 508 | cases.addRuntimeSafety("signed integer division overflow - vectors", |
| 509 | \\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn { |
| 510 | \\ @import("std").os.exit(126); |
| 511 | \\} |
| 512 | \\pub fn main() !void { |
| 513 | \\ var a: @Vector(4, i16) = [_]i16{ 1, 2, -32768, 4 }; |
| 514 | \\ var b: @Vector(4, i16) = [_]i16{ 1, 2, -1, 4 }; |
| 515 | \\ const x = div(a, b); |
| 516 | \\ if (x[2] == 32767) return error.Whatever; |
| 517 | \\} |
| 518 | \\fn div(a: @Vector(4, i16), b: @Vector(4, i16)) @Vector(4, i16) { |
| 519 | \\ return @divTrunc(a, b); |
| 520 | \\} |
| 521 | ); |
| 522 | |
| 508 | 523 | cases.addRuntimeSafety("signed shift left overflow", |
| 509 | 524 | \\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn { |
| 510 | 525 | \\ @import("std").os.exit(126); |
| ... | ... | @@ -569,6 +584,20 @@ pub fn addCases(cases: *tests.CompareOutputContext) void { |
| 569 | 584 | \\} |
| 570 | 585 | ); |
| 571 | 586 | |
| 587 | cases.addRuntimeSafety("integer division by zero - vectors", |
| 588 | \\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn { |
| 589 | \\ @import("std").os.exit(126); |
| 590 | \\} |
| 591 | \\pub fn main() void { |
| 592 | \\ var a: @Vector(4, i32) = [4]i32{111, 222, 333, 444}; |
| 593 | \\ var b: @Vector(4, i32) = [4]i32{111, 0, 333, 444}; |
| 594 | \\ const x = div0(a, b); |
| 595 | \\} |
| 596 | \\fn div0(a: @Vector(4, i32), b: @Vector(4, i32)) @Vector(4, i32) { |
| 597 | \\ return @divTrunc(a, b); |
| 598 | \\} |
| 599 | ); |
| 600 | |
| 572 | 601 | cases.addRuntimeSafety("exact division failure", |
| 573 | 602 | \\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn { |
| 574 | 603 | \\ @import("std").os.exit(126); |
| ... | ... | @@ -582,6 +611,20 @@ pub fn addCases(cases: *tests.CompareOutputContext) void { |
| 582 | 611 | \\} |
| 583 | 612 | ); |
| 584 | 613 | |
| 614 | cases.addRuntimeSafety("exact division failure - vectors", |
| 615 | \\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn { |
| 616 | \\ @import("std").os.exit(126); |
| 617 | \\} |
| 618 | \\pub fn main() !void { |
| 619 | \\ var a: @Vector(4, i32) = [4]i32{111, 222, 333, 444}; |
| 620 | \\ var b: @Vector(4, i32) = [4]i32{111, 222, 333, 441}; |
| 621 | \\ const x = divExact(a, b); |
| 622 | \\} |
| 623 | \\fn divExact(a: @Vector(4, i32), b: @Vector(4, i32)) @Vector(4, i32) { |
| 624 | \\ return @divExact(a, b); |
| 625 | \\} |
| 626 | ); |
| 627 | |
| 585 | 628 | cases.addRuntimeSafety("cast []u8 to bigger slice of wrong size", |
| 586 | 629 | \\const std = @import("std"); |
| 587 | 630 | \\pub fn panic(message: []const u8, stack_trace: ?*std.builtin.StackTrace) noreturn { |