| ... | ... | @@ -11,7 +11,8 @@ const print = std.debug.print; |
| 11 | 11 | const expect = std.testing.expect; |
| 12 | 12 | const expectEqual = std.testing.expectEqual; |
| 13 | 13 | const have_i128 = builtin.cpu.arch != .x86 and !builtin.cpu.arch.isArm() and |
| 14 | | !builtin.cpu.arch.isMIPS() and !builtin.cpu.arch.isPowerPC32() and builtin.cpu.arch != .riscv32; |
| 14 | !builtin.cpu.arch.isMIPS() and !builtin.cpu.arch.isPowerPC32() and builtin.cpu.arch != .riscv32 and |
| 15 | builtin.cpu.arch != .hexagon; |
| 15 | 16 | |
| 16 | 17 | const have_f128 = builtin.cpu.arch.isWasm() or (builtin.cpu.arch.isX86() and !builtin.os.tag.isDarwin()); |
| 17 | 18 | const have_f80 = builtin.cpu.arch.isX86(); |
| ... | ... | @@ -183,7 +184,8 @@ extern fn c_cmultf(a: ComplexFloat, b: ComplexFloat) ComplexFloat; |
| 183 | 184 | extern fn c_cmultd(a: ComplexDouble, b: ComplexDouble) ComplexDouble; |
| 184 | 185 | |
| 185 | 186 | const complex_abi_compatible = builtin.cpu.arch != .x86 and !builtin.cpu.arch.isMIPS() and |
| 186 | | !builtin.cpu.arch.isArm() and !builtin.cpu.arch.isPowerPC32() and !builtin.cpu.arch.isRISCV(); |
| 187 | !builtin.cpu.arch.isArm() and !builtin.cpu.arch.isPowerPC32() and !builtin.cpu.arch.isRISCV() and |
| 188 | builtin.cpu.arch != .hexagon; |
| 187 | 189 | |
| 188 | 190 | test "C ABI complex float" { |
| 189 | 191 | if (!complex_abi_compatible) return error.SkipZigTest; |
| ... | ... | @@ -326,6 +328,7 @@ extern fn c_struct_u64_u64_8(usize, usize, usize, usize, usize, usize, usize, us |
| 326 | 328 | test "C ABI struct u64 u64" { |
| 327 | 329 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 328 | 330 | if (builtin.cpu.arch.isPowerPC32()) return error.SkipZigTest; |
| 331 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 329 | 332 | |
| 330 | 333 | const s = c_ret_struct_u64_u64(); |
| 331 | 334 | try expect(s.a == 21); |
| ... | ... | @@ -417,6 +420,7 @@ test "C ABI struct {f32,f32} f32" { |
| 417 | 420 | if (builtin.cpu.arch.isPowerPC32()) return error.SkipZigTest; |
| 418 | 421 | if (builtin.cpu.arch.isArm() and builtin.abi.float() == .soft) return error.SkipZigTest; |
| 419 | 422 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 423 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 420 | 424 | |
| 421 | 425 | const s = c_ret_struct_f32f32_f32(); |
| 422 | 426 | try expect(s.a.b == 1.0); |
| ... | ... | @@ -449,6 +453,7 @@ test "C ABI struct f32 {f32,f32}" { |
| 449 | 453 | if (builtin.cpu.arch.isPowerPC32()) return error.SkipZigTest; |
| 450 | 454 | if (builtin.cpu.arch.isArm() and builtin.abi.float() == .soft) return error.SkipZigTest; |
| 451 | 455 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 456 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 452 | 457 | |
| 453 | 458 | const s = c_ret_struct_f32_f32f32(); |
| 454 | 459 | try expect(s.a == 1.0); |
| ... | ... | @@ -485,6 +490,7 @@ test "C ABI struct{u32,union{u32,struct{u32,u32}}}" { |
| 485 | 490 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 486 | 491 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 487 | 492 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 493 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 488 | 494 | |
| 489 | 495 | const s = c_ret_struct_u32_union_u32_u32u32(); |
| 490 | 496 | try expect(s.a == 1); |
| ... | ... | @@ -536,6 +542,7 @@ test "C ABI big struct" { |
| 536 | 542 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 537 | 543 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 538 | 544 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 545 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 539 | 546 | |
| 540 | 547 | const s = BigStruct{ |
| 541 | 548 | .a = 1, |
| ... | ... | @@ -563,6 +570,7 @@ extern fn c_big_union(BigUnion) void; |
| 563 | 570 | test "C ABI big union" { |
| 564 | 571 | if (builtin.cpu.arch.isPowerPC32()) return error.SkipZigTest; |
| 565 | 572 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 573 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 566 | 574 | |
| 567 | 575 | const x = BigUnion{ |
| 568 | 576 | .a = BigStruct{ |
| ... | ... | @@ -597,6 +605,7 @@ test "C ABI medium struct of ints and floats" { |
| 597 | 605 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 598 | 606 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 599 | 607 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 608 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 600 | 609 | |
| 601 | 610 | const s = MedStructMixed{ |
| 602 | 611 | .a = 1234, |
| ... | ... | @@ -631,6 +640,7 @@ test "C ABI small struct of ints" { |
| 631 | 640 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 632 | 641 | if (builtin.cpu.arch == .aarch64_be) return error.SkipZigTest; |
| 633 | 642 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 643 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 634 | 644 | |
| 635 | 645 | const s = SmallStructInts{ |
| 636 | 646 | .a = 1, |
| ... | ... | @@ -665,6 +675,7 @@ test "C ABI medium struct of ints" { |
| 665 | 675 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 666 | 676 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 667 | 677 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 678 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 668 | 679 | |
| 669 | 680 | const s = MedStructInts{ |
| 670 | 681 | .x = 1, |
| ... | ... | @@ -744,6 +755,7 @@ test "C ABI split struct of ints" { |
| 744 | 755 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 745 | 756 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 746 | 757 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 758 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 747 | 759 | |
| 748 | 760 | const s = SplitStructInt{ |
| 749 | 761 | .a = 1234, |
| ... | ... | @@ -772,6 +784,7 @@ test "C ABI split struct of ints and floats" { |
| 772 | 784 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 773 | 785 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 774 | 786 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 787 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 775 | 788 | |
| 776 | 789 | const s = SplitStructMixed{ |
| 777 | 790 | .a = 1234, |
| ... | ... | @@ -800,6 +813,7 @@ test "C ABI sret and byval together" { |
| 800 | 813 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 801 | 814 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 802 | 815 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 816 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 803 | 817 | |
| 804 | 818 | const s = BigStruct{ |
| 805 | 819 | .a = 1, |
| ... | ... | @@ -853,6 +867,7 @@ test "C ABI structs of floats as parameter" { |
| 853 | 867 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 854 | 868 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 855 | 869 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 870 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 856 | 871 | |
| 857 | 872 | const v3 = Vector3{ |
| 858 | 873 | .x = 3.0, |
| ... | ... | @@ -894,6 +909,7 @@ test "C ABI structs of ints as multiple parameters" { |
| 894 | 909 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 895 | 910 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 896 | 911 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 912 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 897 | 913 | |
| 898 | 914 | const r1 = Rect{ |
| 899 | 915 | .left = 1, |
| ... | ... | @@ -932,6 +948,7 @@ test "C ABI structs of floats as multiple parameters" { |
| 932 | 948 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 933 | 949 | if (builtin.cpu.arch.isPowerPC32()) return error.SkipZigTest; |
| 934 | 950 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 951 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 935 | 952 | |
| 936 | 953 | const r1 = FloatRect{ |
| 937 | 954 | .left = 1, |
| ... | ... | @@ -1046,6 +1063,7 @@ test "Struct with array as padding." { |
| 1046 | 1063 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 1047 | 1064 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 1048 | 1065 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 1066 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 1049 | 1067 | |
| 1050 | 1068 | c_struct_with_array(.{ .a = 1, .padding = undefined, .b = 2 }); |
| 1051 | 1069 | |
| ... | ... | @@ -1072,6 +1090,7 @@ test "Float array like struct" { |
| 1072 | 1090 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 1073 | 1091 | if (builtin.cpu.arch.isPowerPC32()) return error.SkipZigTest; |
| 1074 | 1092 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 1093 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 1075 | 1094 | |
| 1076 | 1095 | c_float_array_struct(.{ |
| 1077 | 1096 | .origin = .{ |
| ... | ... | @@ -5471,6 +5490,7 @@ test "DC: Zig passes to C" { |
| 5471 | 5490 | if (builtin.cpu.arch.isRISCV()) return error.SkipZigTest; |
| 5472 | 5491 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 5473 | 5492 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 5493 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 5474 | 5494 | try expectOk(c_assert_DC(.{ .v1 = -0.25, .v2 = 15 })); |
| 5475 | 5495 | } |
| 5476 | 5496 | test "DC: Zig returns to C" { |
| ... | ... | @@ -5485,6 +5505,7 @@ test "DC: C passes to Zig" { |
| 5485 | 5505 | if (builtin.cpu.arch.isRISCV()) return error.SkipZigTest; |
| 5486 | 5506 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 5487 | 5507 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 5508 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 5488 | 5509 | try expectOk(c_send_DC()); |
| 5489 | 5510 | } |
| 5490 | 5511 | test "DC: C returns to Zig" { |
| ... | ... | @@ -5518,6 +5539,7 @@ test "CFF: Zig passes to C" { |
| 5518 | 5539 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 5519 | 5540 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 5520 | 5541 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 5542 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 5521 | 5543 | try expectOk(c_assert_CFF(.{ .v1 = 39, .v2 = 0.875, .v3 = 1.0 })); |
| 5522 | 5544 | } |
| 5523 | 5545 | test "CFF: Zig returns to C" { |
| ... | ... | @@ -5533,6 +5555,7 @@ test "CFF: C passes to Zig" { |
| 5533 | 5555 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 5534 | 5556 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 5535 | 5557 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 5558 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 5536 | 5559 | |
| 5537 | 5560 | try expectOk(c_send_CFF()); |
| 5538 | 5561 | } |
| ... | ... | @@ -5567,6 +5590,7 @@ test "PD: Zig passes to C" { |
| 5567 | 5590 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 5568 | 5591 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 5569 | 5592 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 5593 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 5570 | 5594 | try expectOk(c_assert_PD(.{ .v1 = null, .v2 = 0.5 })); |
| 5571 | 5595 | } |
| 5572 | 5596 | test "PD: Zig returns to C" { |
| ... | ... | @@ -5579,6 +5603,7 @@ test "PD: C passes to Zig" { |
| 5579 | 5603 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 5580 | 5604 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 5581 | 5605 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 5606 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 5582 | 5607 | try expectOk(c_send_PD()); |
| 5583 | 5608 | } |
| 5584 | 5609 | test "PD: C returns to Zig" { |
| ... | ... | @@ -5641,6 +5666,7 @@ test "C function that takes byval struct called via function pointer" { |
| 5641 | 5666 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 5642 | 5667 | if (builtin.cpu.arch.isPowerPC32()) return error.SkipZigTest; |
| 5643 | 5668 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 5669 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 5644 | 5670 | |
| 5645 | 5671 | var fn_ptr = &c_func_ptr_byval; |
| 5646 | 5672 | _ = &fn_ptr; |
| ... | ... | @@ -5781,6 +5807,7 @@ test "Stdcall ABI structs" { |
| 5781 | 5807 | if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; |
| 5782 | 5808 | if (builtin.cpu.arch == .aarch64_be) return error.SkipZigTest; |
| 5783 | 5809 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 5810 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 5784 | 5811 | |
| 5785 | 5812 | const res = stdcall_coord2( |
| 5786 | 5813 | .{ .x = 0x1111, .y = 0x2222 }, |
| ... | ... | @@ -5795,6 +5822,7 @@ extern fn stdcall_big_union(BigUnion) callconv(stdcall_callconv) void; |
| 5795 | 5822 | test "Stdcall ABI big union" { |
| 5796 | 5823 | if (builtin.cpu.arch.isPowerPC32()) return error.SkipZigTest; |
| 5797 | 5824 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 5825 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 5798 | 5826 | |
| 5799 | 5827 | const x = BigUnion{ |
| 5800 | 5828 | .a = BigStruct{ |
| ... | ... | @@ -5868,6 +5896,7 @@ test "byval tail callsite attribute" { |
| 5868 | 5896 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| 5869 | 5897 | if (builtin.cpu.arch.isPowerPC32()) return error.SkipZigTest; |
| 5870 | 5898 | if (builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; |
| 5899 | if (builtin.cpu.arch == .hexagon) return error.SkipZigTest; |
| 5871 | 5900 | |
| 5872 | 5901 | // Originally reported at https://github.com/ziglang/zig/issues/16290 |
| 5873 | 5902 | // the bug was that the extern function had the byval attribute, but |