diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 7a2619ff3b..34c98b6729 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -1841,8 +1841,11 @@ fn transInitListExprRecord( // .field_name = expr const period_tok = try appendToken(rp.c, .Period, "."); - const raw_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, field_decl))); - if (raw_name.len < 1) continue; + var raw_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, field_decl))); + if (ZigClangFieldDecl_isAnonymousStructOrUnion(field_decl)) { + const name = rp.c.decl_table.get(@ptrToInt(ZigClangFieldDecl_getCanonicalDecl(field_decl))).?; + raw_name = try mem.dupe(rp.c.a(), u8, name.value); + } const field_name_tok = try appendIdentifier(rp.c, raw_name); _ = try appendToken(rp.c, .Equal, "="); diff --git a/test/run_translated_c.zig b/test/run_translated_c.zig index b7cc0cb7dc..cb5d0c7f59 100644 --- a/test/run_translated_c.zig +++ b/test/run_translated_c.zig @@ -39,4 +39,18 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void { \\ return 0; \\} , ""); + + cases.add("anonymous struct & unions", + \\#include + \\#include + \\static struct { struct { uint16_t x, y; }; } x = { 1 }; + \\static struct { union { uint32_t x; uint8_t y; }; } y = { 0x55AA55AA }; + \\int main(int argc, char **argv) { + \\ if (x.x != 1) abort(); + \\ if (x.y != 0) abort(); + \\ if (y.x != 0x55AA55AA) abort(); + \\ if (y.y != 0xAA) abort(); + \\ return 0; + \\} + , ""); }