authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2019-12-28 21:28:18+01:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-01-02 18:57:07+01:00
log08a26fea0918fba1dd315781fa96d457da5bcb50
tree4efd2bea3f846dda3b5dbfd63b7b717299a915d7
parent0ec64d4c0c610face291f41db4215ea2bcd48d50

translate-c tests


3 files changed, 57 insertions(+), 4 deletions(-)

src-self-hosted/translate_c.zig+1-1
...@@ -4104,7 +4104,7 @@ fn finishTransFnProto(...@@ -4104,7 +4104,7 @@ fn finishTransFnProto(
41044104
4105 const rparen_tok = try appendToken(rp.c, .RParen, ")");4105 const rparen_tok = try appendToken(rp.c, .RParen, ")");
41064106
4107 const callconv_expr = if (cc == .C and is_extern) null else blk: {4107 const callconv_expr = if (extern_export_inline_tok != null) null else blk: {
4108 _ = try appendToken(rp.c, .Keyword_callconv, "callconv");4108 _ = try appendToken(rp.c, .Keyword_callconv, "callconv");
4109 _ = try appendToken(rp.c, .LParen, "(");4109 _ = try appendToken(rp.c, .LParen, "(");
4110 const expr = try transCreateNodeEnumLiteral(rp.c, @tagName(cc));4110 const expr = try transCreateNodeEnumLiteral(rp.c, @tagName(cc));
test/tests.zig+21
...@@ -1422,6 +1422,7 @@ pub const TranslateCContext = struct {...@@ -1422,6 +1422,7 @@ pub const TranslateCContext = struct {
1422 sources: ArrayList(SourceFile),1422 sources: ArrayList(SourceFile),
1423 expected_lines: ArrayList([]const u8),1423 expected_lines: ArrayList([]const u8),
1424 allow_warnings: bool,1424 allow_warnings: bool,
1425 target: Target = .Native,
14251426
1426 const SourceFile = struct {1427 const SourceFile = struct {
1427 filename: []const u8,1428 filename: []const u8,
...@@ -1474,6 +1475,14 @@ pub const TranslateCContext = struct {...@@ -1474,6 +1475,14 @@ pub const TranslateCContext = struct {
1474 var zig_args = ArrayList([]const u8).init(b.allocator);1475 var zig_args = ArrayList([]const u8).init(b.allocator);
1475 zig_args.append(b.zig_exe) catch unreachable;1476 zig_args.append(b.zig_exe) catch unreachable;
14761477
1478 switch (self.case.target) {
1479 .Native => {},
1480 .Cross => {
1481 try zig_args.append("-target");
1482 try zig_args.append(try self.case.target.zigTriple(b.allocator));
1483 },
1484 }
1485
1477 const translate_c_cmd = "translate-c";1486 const translate_c_cmd = "translate-c";
1478 zig_args.append(translate_c_cmd) catch unreachable;1487 zig_args.append(translate_c_cmd) catch unreachable;
1479 zig_args.append(b.pathFromRoot(root_src)) catch unreachable;1488 zig_args.append(b.pathFromRoot(root_src)) catch unreachable;
...@@ -1602,6 +1611,18 @@ pub const TranslateCContext = struct {...@@ -1602,6 +1611,18 @@ pub const TranslateCContext = struct {
1602 self.addCase(tc);1611 self.addCase(tc);
1603 }1612 }
16041613
1614 pub fn addWithTarget(
1615 self: *TranslateCContext,
1616 name: []const u8,
1617 target: Target,
1618 source: []const u8,
1619 expected_lines: []const []const u8,
1620 ) void {
1621 const tc = self.create(false, "source.h", name, source, expected_lines);
1622 tc.target = target;
1623 self.addCase(tc);
1624 }
1625
1605 pub fn addAllowWarnings(1626 pub fn addAllowWarnings(
1606 self: *TranslateCContext,1627 self: *TranslateCContext,
1607 name: []const u8,1628 name: []const u8,
test/translate_c.zig+35-3
...@@ -106,7 +106,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -106,7 +106,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
106 \\static void bar(void) {}106 \\static void bar(void) {}
107 , &[_][]const u8{107 , &[_][]const u8{
108 \\pub export fn foo() void {}108 \\pub export fn foo() void {}
109 \\pub fn bar() void {}109 \\pub fn bar() callconv(.C) void {}
110 });110 });
111111
112 cases.add("typedef void",112 cases.add("typedef void",
...@@ -843,6 +843,38 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -843,6 +843,38 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
843 \\pub const fn1 = ?extern fn (u8) void;843 \\pub const fn1 = ?extern fn (u8) void;
844 });844 });
845845
846 cases.addWithTarget("Calling convention", tests.Target{
847 .Cross = .{ .os = .linux, .arch = .i386, .abi = .none },
848 },
849 \\void __attribute__((fastcall)) foo1(float *a);
850 \\void __attribute__((stdcall)) foo2(float *a);
851 \\void __attribute__((vectorcall)) foo3(float *a);
852 \\void __attribute__((cdecl)) foo4(float *a);
853 , &[_][]const u8{
854 \\pub fn foo1(a: [*c]f32) callconv(.Fastcall) void;
855 \\pub fn foo2(a: [*c]f32) callconv(.Stdcall) void;
856 \\pub fn foo3(a: [*c]f32) callconv(.Vectorcall) void;
857 \\pub extern fn foo4(a: [*c]f32) void;
858 });
859
860 cases.addWithTarget("Calling convention", tests.Target{
861 .Cross = .{ .os = .linux, .arch = .{ .arm = .v8_5a }, .abi = .none },
862 },
863 \\void __attribute__((pcs("aapcs"))) foo1(float *a);
864 \\void __attribute__((pcs("aapcs-vfp"))) foo2(float *a);
865 , &[_][]const u8{
866 \\pub fn foo1(a: [*c]f32) callconv(.AAPCS) void;
867 \\pub fn foo2(a: [*c]f32) callconv(.AAPCSVFP) void;
868 });
869
870 cases.addWithTarget("Calling convention", tests.Target{
871 .Cross = .{ .os = .linux, .arch = .{ .aarch64 = .v8_5a }, .abi = .none },
872 },
873 \\void __attribute__((aarch64_vector_pcs)) foo1(float *a);
874 , &[_][]const u8{
875 \\pub fn foo1(a: [*c]f32) callconv(.Vectorcall) void;
876 });
877
846 cases.add("Parameterless function prototypes",878 cases.add("Parameterless function prototypes",
847 \\void a() {}879 \\void a() {}
848 \\void b(void) {}880 \\void b(void) {}
...@@ -871,7 +903,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -871,7 +903,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
871 \\ char *arr1[10] ={0};903 \\ char *arr1[10] ={0};
872 \\}904 \\}
873 , &[_][]const u8{905 , &[_][]const u8{
874 \\pub fn foo() void {906 \\pub fn foo() callconv(.C) void {
875 \\ var arr: [10]u8 = .{907 \\ var arr: [10]u8 = .{
876 \\ @bitCast(u8, @truncate(i8, @as(c_int, 1))),908 \\ @bitCast(u8, @truncate(i8, @as(c_int, 1))),
877 \\ } ++ .{0} ** 9;909 \\ } ++ .{0} ** 9;
...@@ -2148,7 +2180,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -2148,7 +2180,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
2148 \\ baz();2180 \\ baz();
2149 \\}2181 \\}
2150 , &[_][]const u8{2182 , &[_][]const u8{
2151 \\pub fn bar() void {}2183 \\pub fn bar() callconv(.C) void {}
2152 \\pub export fn foo(arg_baz: ?extern fn () [*c]c_int) void {2184 \\pub export fn foo(arg_baz: ?extern fn () [*c]c_int) void {
2153 \\ var baz = arg_baz;2185 \\ var baz = arg_baz;
2154 \\ bar();2186 \\ bar();