diff --git a/lib/compiler/aro_translate_c.zig b/lib/compiler/aro_translate_c.zig index 5665c3b2e6..cec10a301a 100644 --- 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 new file mode 100644 index 0000000000..b688e6e742 --- /dev/null +++ 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 index d2ed936434..5c74110749 100644 --- 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{