Commit de894f2bde
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);