Commit de894f2bde

LemonBoy <thatlemon@gmail.com>
2020-01-02 10:31:55
Prefer simple ptrCast between opaque types
Closes #4031
1 parent 1e61e5f
Changed files (2)
src-self-hosted
test
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");
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);