diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index efab428454..d6b72f3dd8 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -615,6 +615,15 @@ fn transImplicitCastExpr( .child_scope = scope, }; }, + .IntegralCast => { + const dest_type = ZigClangExpr_getType(@ptrCast(*const ZigClangExpr, expr)); + const src_type = ZigClangExpr_getType(sub_expr); + return TransResult{ + .node = try transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node.node), + .node_scope = scope, + .child_scope = scope, + }; + }, .FunctionToPointerDecay, .ArrayToPointerDecay => { return maybeSuppressResult(rp, scope, result_used, sub_expr_node); }, diff --git a/test/translate_c.zig b/test/translate_c.zig index 9785189ce2..d7f8cba0ec 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -18,7 +18,46 @@ pub fn addCases(cases: *tests.TranslateCContext) void { \\pub extern fn bar() c_int; ); + cases.add_both("simple var decls", + \\void foo(void) { + \\ int a; + \\ char b = 123; + \\ const int c; + \\ const unsigned d = 440; + \\} + , + \\pub fn foo() void { + \\ var a: c_int = undefined; + \\ var b: u8 = u8(123); + \\ const c: c_int = undefined; + \\ const d: c_uint = c_uint(440); + \\} + ); + + cases.add_both("ignore result, explicit function arguments", + \\void foo(void) { + \\ int a; + \\ 1; + \\ "hey"; + \\ 1 + 1; + \\ 1 - 1; + \\ a = 1; + \\} + , + \\pub fn foo() void { + \\ var a: c_int = undefined; + \\ _ = 1; + \\ _ = c"hey"; + \\ _ = (1 + 1); + \\ _ = (1 - 1); + \\ a = 1; + \\} + ); + /////////////// Cases that pass for only stage2 //////////////// + // TODO: restore these tests after removing "import mode" concept + // https://github.com/ziglang/zig/issues/2780 + // cases.add_2("Parameterless function prototypes", // \\void a() {} // \\void b(void) {} @@ -39,8 +78,28 @@ pub fn addCases(cases: *tests.TranslateCContext) void { // \\pub extern fn bar() void {} // ); + cases.add_2("parameterless function prototypes", + \\void a() {} + \\void b(void) {} + \\void c(); + \\void d(void); + , + \\pub fn a(...) void {} + \\pub fn b() void {} + \\pub extern fn c(...) void; + \\pub extern fn d() void; + ); + /////////////// Cases for only stage1 which are TODO items for stage2 //////////////// + cases.add_both("simple function definition", + \\void foo(void) {} + \\static void bar(void) {} + , + \\pub fn foo() void {} + \\pub fn bar() void {} + ); + cases.add("macro with left shift", \\#define REDISMODULE_READ (1<<0) , @@ -132,7 +191,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void { \\} ); - cases.add("ignore result", + cases.add("ignore result, no function arguments", \\void foo() { \\ int a; \\ 1;