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(...@@ -2741,6 +2741,9 @@ fn transCPtrCast(
2741 if (ZigClangType_isVoidType(qualTypeCanon(child_type))) {2741 if (ZigClangType_isVoidType(qualTypeCanon(child_type))) {
2742 // void has 1-byte alignment, so @alignCast is not needed2742 // void has 1-byte alignment, so @alignCast is not needed
2743 try ptrcast_node.params.push(expr);2743 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);
2744 } else {2747 } else {
2745 const aligncast_node = try transCreateNodeBuiltinFnCall(rp.c, "@alignCast");2748 const aligncast_node = try transCreateNodeBuiltinFnCall(rp.c, "@alignCast");
2746 const alignof_node = try transCreateNodeBuiltinFnCall(rp.c, "@alignOf");2749 const alignof_node = try transCreateNodeBuiltinFnCall(rp.c, "@alignOf");
test/translate_c.zig+15
...@@ -3,6 +3,21 @@ const builtin = @import("builtin");...@@ -3,6 +3,21 @@ const builtin = @import("builtin");
33
4pub fn addCases(cases: *tests.TranslateCContext) void {4pub fn addCases(cases: *tests.TranslateCContext) void {
5 /////////////// Cases that pass for both stage1/stage2 ////////////////5 /////////////// 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
6 cases.add("simple function prototypes",21 cases.add("simple function prototypes",
7 \\void __attribute__((noreturn)) foo(void);22 \\void __attribute__((noreturn)) foo(void);
8 \\int bar(void);23 \\int bar(void);