authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-01-02 10:31:55+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-01-02 10:42:26-05:00
logde894f2bde4ce708206a8161dc0c98cb8f5bcb67
tree911d5bf43d620fa71e4d28997b50812aff20e348
parent1e61e5f4041859859dc5b6f1936cccfd32e9c3a5

Prefer simple ptrCast between opaque types

Closes #4031

2 files changed, 18 insertions(+), 0 deletions(-)

src-self-hosted/translate_c.zig+3
......@@ -2741,6 +2741,9 @@ fn transCPtrCast(
27412741 if (ZigClangType_isVoidType(qualTypeCanon(child_type))) {
27422742 // void has 1-byte alignment, so @alignCast is not needed
27432743 try ptrcast_node.params.push(expr);
2744 } else if (typeIsOpaque(rp.c, qualTypeCanon(child_type), loc)) {
2745 // For opaque types a ptrCast is enough
2746 try ptrcast_node.params.push(expr);
27442747 } else {
27452748 const aligncast_node = try transCreateNodeBuiltinFnCall(rp.c, "@alignCast");
27462749 const alignof_node = try transCreateNodeBuiltinFnCall(rp.c, "@alignOf");
test/translate_c.zig+15
......@@ -3,6 +3,21 @@ const builtin = @import("builtin");
33
44pub fn addCases(cases: *tests.TranslateCContext) void {
55 /////////////// Cases that pass for both stage1/stage2 ////////////////
6 cases.add("simple ptrCast for casts between opaque types",
7 \\struct opaque;
8 \\struct opaque_2;
9 \\void function(struct opaque *opaque) {
10 \\ struct opaque_2 *cast = (struct opaque_2 *)opaque;
11 \\}
12 , &[_][]const u8{
13 \\pub const struct_opaque = @OpaqueType();
14 \\pub const struct_opaque_2 = @OpaqueType();
15 \\pub export fn function(arg_opaque_1: ?*struct_opaque) void {
16 \\ var opaque_1 = arg_opaque_1;
17 \\ var cast: ?*struct_opaque_2 = @ptrCast(?*struct_opaque_2, opaque_1);
18 \\}
19 });
20
621 cases.add("simple function prototypes",
722 \\void __attribute__((noreturn)) foo(void);
823 \\int bar(void);