| ... | @@ -358,7 +358,10 @@ fn testCastIntToErr(err: anyerror) !void { | ... | @@ -358,7 +358,10 @@ fn testCastIntToErr(err: anyerror) !void { |
| 358 | } | 358 | } |
| 359 | | 359 | |
| 360 | test "peer resolve array and const slice" { | 360 | test "peer resolve array and const slice" { |
| 361 | if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO | 361 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| | 362 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| | 363 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| | 364 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 362 | | 365 | |
| 363 | try testPeerResolveArrayConstSlice(true); | 366 | try testPeerResolveArrayConstSlice(true); |
| 364 | comptime try testPeerResolveArrayConstSlice(true); | 367 | comptime try testPeerResolveArrayConstSlice(true); |
| ... | @@ -415,7 +418,10 @@ fn gimmeErrOrSlice() anyerror![]u8 { | ... | @@ -415,7 +418,10 @@ fn gimmeErrOrSlice() anyerror![]u8 { |
| 415 | } | 418 | } |
| 416 | | 419 | |
| 417 | test "peer type resolution: [0]u8, []const u8, and anyerror![]u8" { | 420 | test "peer type resolution: [0]u8, []const u8, and anyerror![]u8" { |
| 418 | if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO | 421 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| | 422 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| | 423 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| | 424 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 419 | | 425 | |
| 420 | const S = struct { | 426 | const S = struct { |
| 421 | fn doTheTest() anyerror!void { | 427 | fn doTheTest() anyerror!void { |
| ... | @@ -494,7 +500,10 @@ fn testPeerErrorAndArray2(x: u8) anyerror![]const u8 { | ... | @@ -494,7 +500,10 @@ fn testPeerErrorAndArray2(x: u8) anyerror![]const u8 { |
| 494 | } | 500 | } |
| 495 | | 501 | |
| 496 | test "single-item pointer of array to slice to unknown length pointer" { | 502 | test "single-item pointer of array to slice to unknown length pointer" { |
| 497 | if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO | 503 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| | 504 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| | 505 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| | 506 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 498 | | 507 | |
| 499 | try testCastPtrOfArrayToSliceAndPtr(); | 508 | try testCastPtrOfArrayToSliceAndPtr(); |
| 500 | comptime try testCastPtrOfArrayToSliceAndPtr(); | 509 | comptime try testCastPtrOfArrayToSliceAndPtr(); |
| ... | @@ -609,17 +618,25 @@ test "peer type resolution: unreachable, error set, unreachable" { | ... | @@ -609,17 +618,25 @@ test "peer type resolution: unreachable, error set, unreachable" { |
| 609 | } | 618 | } |
| 610 | | 619 | |
| 611 | test "peer cast *[0]T to E![]const T" { | 620 | test "peer cast *[0]T to E![]const T" { |
| 612 | if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO | 621 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| | 622 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| | 623 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| | 624 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 613 | | 625 | |
| 614 | var buffer: [5]u8 = "abcde".*; | 626 | var buffer: [5]u8 = "abcde".*; |
| 615 | var buf: anyerror![]const u8 = buffer[0..]; | 627 | var buf: anyerror![]const u8 = buffer[0..]; |
| 616 | var b = false; | 628 | var b = false; |
| 617 | var y = if (b) &[0]u8{} else buf; | 629 | var y = if (b) &[0]u8{} else buf; |
| | 630 | var z = if (!b) buf else &[0]u8{}; |
| 618 | try expect(mem.eql(u8, "abcde", y catch unreachable)); | 631 | try expect(mem.eql(u8, "abcde", y catch unreachable)); |
| | 632 | try expect(mem.eql(u8, "abcde", z catch unreachable)); |
| 619 | } | 633 | } |
| 620 | | 634 | |
| 621 | test "peer cast *[0]T to []const T" { | 635 | test "peer cast *[0]T to []const T" { |
| 622 | if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO | 636 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| | 637 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| | 638 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| | 639 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 623 | | 640 | |
| 624 | var buffer: [5]u8 = "abcde".*; | 641 | var buffer: [5]u8 = "abcde".*; |
| 625 | var buf: []const u8 = buffer[0..]; | 642 | var buf: []const u8 = buffer[0..]; |
| ... | @@ -628,6 +645,18 @@ test "peer cast *[0]T to []const T" { | ... | @@ -628,6 +645,18 @@ test "peer cast *[0]T to []const T" { |
| 628 | try expect(mem.eql(u8, "abcde", y)); | 645 | try expect(mem.eql(u8, "abcde", y)); |
| 629 | } | 646 | } |
| 630 | | 647 | |
| | 648 | test "peer cast *[N]T to [*]T" { |
| | 649 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| | 650 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| | 651 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| | 652 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| | 653 | |
| | 654 | var array = [4:99]i32{ 1, 2, 3, 4 }; |
| | 655 | var dest: [*]i32 = undefined; |
| | 656 | try expect(@TypeOf(&array, dest) == [*]i32); |
| | 657 | try expect(@TypeOf(dest, &array) == [*]i32); |
| | 658 | } |
| | 659 | |
| 631 | test "peer resolution of string literals" { | 660 | test "peer resolution of string literals" { |
| 632 | if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO | 661 | if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO |
| 633 | | 662 | |
| ... | @@ -648,55 +677,89 @@ test "peer resolution of string literals" { | ... | @@ -648,55 +677,89 @@ test "peer resolution of string literals" { |
| 648 | comptime try S.doTheTest(.b); | 677 | comptime try S.doTheTest(.b); |
| 649 | } | 678 | } |
| 650 | | 679 | |
| 651 | test "type coercion related to sentinel-termination" { | 680 | test "peer cast [:x]T to []T" { |
| 652 | if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO | 681 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| | 682 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| | 683 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| | 684 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 653 | | 685 | |
| 654 | const S = struct { | 686 | const S = struct { |
| 655 | fn doTheTest() !void { | 687 | fn doTheTest() !void { |
| 656 | // [:x]T to []T | 688 | var array = [4:0]i32{ 1, 2, 3, 4 }; |
| 657 | { | 689 | var slice: [:0]i32 = &array; |
| 658 | var array = [4:0]i32{ 1, 2, 3, 4 }; | 690 | var dest: []i32 = slice; |
| 659 | var slice: [:0]i32 = &array; | 691 | try expect(mem.eql(i32, dest, &[_]i32{ 1, 2, 3, 4 })); |
| 660 | var dest: []i32 = slice; | 692 | } |
| 661 | try expect(mem.eql(i32, dest, &[_]i32{ 1, 2, 3, 4 })); | 693 | }; |
| 662 | } | 694 | try S.doTheTest(); |
| | 695 | comptime try S.doTheTest(); |
| | 696 | } |
| 663 | | 697 | |
| 664 | // [*:x]T to [*]T | 698 | test "peer cast [N:x]T to [N]T" { |
| 665 | { | 699 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 666 | var array = [4:99]i32{ 1, 2, 3, 4 }; | 700 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 667 | var dest: [*]i32 = &array; | 701 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 668 | try expect(dest[0] == 1); | 702 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 669 | try expect(dest[1] == 2); | | |
| 670 | try expect(dest[2] == 3); | | |
| 671 | try expect(dest[3] == 4); | | |
| 672 | try expect(dest[4] == 99); | | |
| 673 | } | | |
| 674 | | 703 | |
| 675 | // [N:x]T to [N]T | 704 | const S = struct { |
| 676 | { | 705 | fn doTheTest() !void { |
| 677 | var array = [4:0]i32{ 1, 2, 3, 4 }; | 706 | var array = [4:0]i32{ 1, 2, 3, 4 }; |
| 678 | var dest: [4]i32 = array; | 707 | var dest: [4]i32 = array; |
| 679 | try expect(mem.eql(i32, &dest, &[_]i32{ 1, 2, 3, 4 })); | 708 | try expect(mem.eql(i32, &dest, &[_]i32{ 1, 2, 3, 4 })); |
| 680 | } | 709 | } |
| | 710 | }; |
| | 711 | try S.doTheTest(); |
| | 712 | comptime try S.doTheTest(); |
| | 713 | } |
| 681 | | 714 | |
| 682 | // *[N:x]T to *[N]T | 715 | test "peer cast *[N:x]T to *[N]T" { |
| 683 | { | 716 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 684 | var array = [4:0]i32{ 1, 2, 3, 4 }; | 717 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 685 | var dest: *[4]i32 = &array; | 718 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 686 | try expect(mem.eql(i32, dest, &[_]i32{ 1, 2, 3, 4 })); | 719 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 687 | } | | |
| 688 | | 720 | |
| 689 | // [:x]T to [*:x]T | 721 | const S = struct { |
| 690 | { | 722 | fn doTheTest() !void { |
| 691 | var array = [4:0]i32{ 1, 2, 3, 4 }; | 723 | var array = [4:0]i32{ 1, 2, 3, 4 }; |
| 692 | var slice: [:0]i32 = &array; | 724 | var dest: *[4]i32 = &array; |
| 693 | var dest: [*:0]i32 = slice; | 725 | try expect(mem.eql(i32, dest, &[_]i32{ 1, 2, 3, 4 })); |
| 694 | try expect(dest[0] == 1); | 726 | } |
| 695 | try expect(dest[1] == 2); | 727 | }; |
| 696 | try expect(dest[2] == 3); | 728 | try S.doTheTest(); |
| 697 | try expect(dest[3] == 4); | 729 | comptime try S.doTheTest(); |
| 698 | try expect(dest[4] == 0); | 730 | } |
| 699 | } | 731 | |
| | 732 | test "peer cast [*:x]T to [*]T" { |
| | 733 | if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO |
| | 734 | |
| | 735 | const S = struct { |
| | 736 | fn doTheTest() !void { |
| | 737 | var array = [4:99]i32{ 1, 2, 3, 4 }; |
| | 738 | var dest: [*]i32 = &array; |
| | 739 | try expect(dest[0] == 1); |
| | 740 | try expect(dest[1] == 2); |
| | 741 | try expect(dest[2] == 3); |
| | 742 | try expect(dest[3] == 4); |
| | 743 | try expect(dest[4] == 99); |
| | 744 | } |
| | 745 | }; |
| | 746 | try S.doTheTest(); |
| | 747 | comptime try S.doTheTest(); |
| | 748 | } |
| | 749 | |
| | 750 | test "peer cast [:x]T to [*:x]T" { |
| | 751 | if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO |
| | 752 | |
| | 753 | const S = struct { |
| | 754 | fn doTheTest() !void { |
| | 755 | var array = [4:0]i32{ 1, 2, 3, 4 }; |
| | 756 | var slice: [:0]i32 = &array; |
| | 757 | var dest: [*:0]i32 = slice; |
| | 758 | try expect(dest[0] == 1); |
| | 759 | try expect(dest[1] == 2); |
| | 760 | try expect(dest[2] == 3); |
| | 761 | try expect(dest[3] == 4); |
| | 762 | try expect(dest[4] == 0); |
| 700 | } | 763 | } |
| 701 | }; | 764 | }; |
| 702 | try S.doTheTest(); | 765 | try S.doTheTest(); |
| ... | @@ -746,8 +809,6 @@ test "peer type resolution implicit cast to variable type" { | ... | @@ -746,8 +809,6 @@ test "peer type resolution implicit cast to variable type" { |
| 746 | } | 809 | } |
| 747 | | 810 | |
| 748 | test "variable initialization uses result locations properly with regards to the type" { | 811 | test "variable initialization uses result locations properly with regards to the type" { |
| 749 | if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO | | |
| 750 | | | |
| 751 | var b = true; | 812 | var b = true; |
| 752 | const x: i32 = if (b) 1 else 2; | 813 | const x: i32 = if (b) 1 else 2; |
| 753 | try expect(x == 1); | 814 | try expect(x == 1); |