commit b3f576993087f90a249b75f8e72cb95974633eb4 (tree)
parent 93a502cb2f5a38d0a94ebccd1be523bc71f6a00b
Author: Evan Haas <evan@lagerdata.com>
Date: Tue, 30 Jul 2024 23:30:10 -0700
aro_translate_c: handle opaque struct defs in prototypes
Diffstat:
3 files changed, 15 insertions(+), 11 deletions(-)
diff --git a/lib/compiler/aro_translate_c.zig b/lib/compiler/aro_translate_c.zig
@@ -398,6 +398,11 @@ fn transRecordDecl(c: *Context, scope: *Scope, record_ty: Type) Error!void {
const is_pub = toplevel and !is_unnamed;
const init_node = blk: {
+ if (record_decl.isIncomplete()) {
+ try c.opaque_demotes.put(c.gpa, @intFromPtr(record_decl), {});
+ break :blk ZigTag.opaque_literal.init();
+ }
+
var fields = try std.ArrayList(ast.Payload.Record.Field).initCapacity(c.gpa, record_decl.fields.len);
defer fields.deinit();
diff --git a/test/cases/translate_c/struct prototype used in func.c b/test/cases/translate_c/struct prototype used in func.c
@@ -0,0 +1,10 @@
+struct Foo;
+struct Foo *some_func(struct Foo *foo, int x);
+
+// translate-c
+// c_frontend=clang,aro
+//
+// pub const struct_Foo = opaque {};
+// pub extern fn some_func(foo: ?*struct_Foo, x: c_int) ?*struct_Foo;
+//
+// pub const Foo = struct_Foo;
diff --git a/test/translate_c.zig b/test/translate_c.zig
@@ -879,17 +879,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
\\pub const Foo = struct_Foo;
});
- cases.add("struct prototype used in func",
- \\struct Foo;
- \\struct Foo *some_func(struct Foo *foo, int x);
- , &[_][]const u8{
- \\pub const struct_Foo = opaque {};
- ,
- \\pub extern fn some_func(foo: ?*struct_Foo, x: c_int) ?*struct_Foo;
- ,
- \\pub const Foo = struct_Foo;
- });
-
cases.add("#define an unsigned integer literal",
\\#define CHANNEL_COUNT 24
, &[_][]const u8{