From de894f2bde4ce708206a8161dc0c98cb8f5bcb67 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Thu, 2 Jan 2020 10:31:55 +0100 Subject: [PATCH] Prefer simple ptrCast between opaque types Closes #4031 --- src-self-hosted/translate_c.zig | 3 +++ test/translate_c.zig | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index f336d355da..dfb0277ccb 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -2741,6 +2741,9 @@ fn transCPtrCast( if (ZigClangType_isVoidType(qualTypeCanon(child_type))) { // void has 1-byte alignment, so @alignCast is not needed try ptrcast_node.params.push(expr); + } else if (typeIsOpaque(rp.c, qualTypeCanon(child_type), loc)) { + // For opaque types a ptrCast is enough + try ptrcast_node.params.push(expr); } else { const aligncast_node = try transCreateNodeBuiltinFnCall(rp.c, "@alignCast"); const alignof_node = try transCreateNodeBuiltinFnCall(rp.c, "@alignOf"); diff --git a/test/translate_c.zig b/test/translate_c.zig index 40a5e4a340..3c027cce26 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -3,6 +3,21 @@ const builtin = @import("builtin"); pub fn addCases(cases: *tests.TranslateCContext) void { /////////////// Cases that pass for both stage1/stage2 //////////////// + cases.add("simple ptrCast for casts between opaque types", + \\struct opaque; + \\struct opaque_2; + \\void function(struct opaque *opaque) { + \\ struct opaque_2 *cast = (struct opaque_2 *)opaque; + \\} + , &[_][]const u8{ + \\pub const struct_opaque = @OpaqueType(); + \\pub const struct_opaque_2 = @OpaqueType(); + \\pub export fn function(arg_opaque_1: ?*struct_opaque) void { + \\ var opaque_1 = arg_opaque_1; + \\ var cast: ?*struct_opaque_2 = @ptrCast(?*struct_opaque_2, opaque_1); + \\} + }); + cases.add("simple function prototypes", \\void __attribute__((noreturn)) foo(void); \\int bar(void);