authorgravatar for evan@lagerdata.comEvan Haas <evan@lagerdata.com> 2024-07-30 23:30:10-07:00
committergravatar for evan@lagerdata.comEvan Haas <evan@lagerdata.com> 2024-07-31 09:35:07-07:00
logb3f576993087f90a249b75f8e72cb95974633eb4
treedf23ac9ec790d6358290ab15947a47befba385a1
parent93a502cb2f5a38d0a94ebccd1be523bc71f6a00b
signaturebadge-check Signed by SSH key SHA256:cf2/TFgSxv2uRX26INvFSw25Prr1Dy9H8MiRXgLpok4

aro_translate_c: handle opaque struct defs in prototypes


3 files changed, 15 insertions(+), 11 deletions(-)

lib/compiler/aro_translate_c.zig+5
...@@ -398,6 +398,11 @@ fn transRecordDecl(c: *Context, scope: *Scope, record_ty: Type) Error!void {...@@ -398,6 +398,11 @@ fn transRecordDecl(c: *Context, scope: *Scope, record_ty: Type) Error!void {
398398
399 const is_pub = toplevel and !is_unnamed;399 const is_pub = toplevel and !is_unnamed;
400 const init_node = blk: {400 const init_node = blk: {
401 if (record_decl.isIncomplete()) {
402 try c.opaque_demotes.put(c.gpa, @intFromPtr(record_decl), {});
403 break :blk ZigTag.opaque_literal.init();
404 }
405
401 var fields = try std.ArrayList(ast.Payload.Record.Field).initCapacity(c.gpa, record_decl.fields.len);406 var fields = try std.ArrayList(ast.Payload.Record.Field).initCapacity(c.gpa, record_decl.fields.len);
402 defer fields.deinit();407 defer fields.deinit();
403408
test/cases/translate_c/struct prototype used in func.c created+10
...@@ -0,0 +1,10 @@
1struct Foo;
2struct Foo *some_func(struct Foo *foo, int x);
3
4// translate-c
5// c_frontend=clang,aro
6//
7// pub const struct_Foo = opaque {};
8// pub extern fn some_func(foo: ?*struct_Foo, x: c_int) ?*struct_Foo;
9//
10// pub const Foo = struct_Foo;
test/translate_c.zig-11
...@@ -879,17 +879,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -879,17 +879,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
879 \\pub const Foo = struct_Foo;879 \\pub const Foo = struct_Foo;
880 });880 });
881881
882 cases.add("struct prototype used in func",
883 \\struct Foo;
884 \\struct Foo *some_func(struct Foo *foo, int x);
885 , &[_][]const u8{
886 \\pub const struct_Foo = opaque {};
887 ,
888 \\pub extern fn some_func(foo: ?*struct_Foo, x: c_int) ?*struct_Foo;
889 ,
890 \\pub const Foo = struct_Foo;
891 });
892
893 cases.add("#define an unsigned integer literal",882 cases.add("#define an unsigned integer literal",
894 \\#define CHANNEL_COUNT 24883 \\#define CHANNEL_COUNT 24
895 , &[_][]const u8{884 , &[_][]const u8{