zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 1b1cbd93587642ea281dadc6f8b5e33104f38320 (tree)
parent 732c0cb58c842279404a8b1acad0f18b6650ea66
Author: Vexu <git@vexu.eu>
Date:   Fri, 10 Apr 2020 21:31:32 +0300

Merge pull request #4973 from SuperAuguste/nameless-fields

Nameless fields
Diffstat:
Msrc-self-hosted/translate_c.zig | 2+-
Mtest/translate_c.zig | 47++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig @@ -811,7 +811,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?* var is_anon = false; var raw_name = try c.str(ZigClangNamedDecl_getName_bytes_begin(@ptrCast(*const ZigClangNamedDecl, field_decl))); - if (ZigClangFieldDecl_isAnonymousStructOrUnion(field_decl)) { + if (ZigClangFieldDecl_isAnonymousStructOrUnion(field_decl) or raw_name.len == 0) { raw_name = try std.fmt.allocPrint(c.a(), "unnamed_{}", .{c.getMangle()}); is_anon = true; } diff --git a/test/translate_c.zig b/test/translate_c.zig @@ -2879,7 +2879,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void { , &[_][]const u8{ \\pub const FOO = 0x61626364; }); - + cases.add("Make sure casts are grouped", \\typedef struct \\{ @@ -2910,4 +2910,49 @@ pub fn addCases(cases: *tests.TranslateCContext) void { , \\pub const GPIO_2_MEM_MAP = @intToPtr([*c]c_uint, 0x8008); }); + + if (std.Target.current.abi == .msvc) { + cases.add("nameless struct fields", + \\typedef struct NAMED + \\{ + \\ long name; + \\} NAMED; + \\ + \\typedef struct ONENAMEWITHSTRUCT + \\{ + \\ NAMED; + \\ long b; + \\} ONENAMEWITHSTRUCT; + , &[_][]const u8{ + \\pub const struct_NAMED = extern struct { + \\ name: c_long, + \\}; + \\pub const NAMED = struct_NAMED; + \\pub const struct_ONENAMEWITHSTRUCT = extern struct { + \\ unnamed_1: struct_NAMED, + \\ b: c_long, + \\}; + }); + } else { + cases.add("nameless struct fields", + \\typedef struct NAMED + \\{ + \\ long name; + \\} NAMED; + \\ + \\typedef struct ONENAMEWITHSTRUCT + \\{ + \\ NAMED; + \\ long b; + \\} ONENAMEWITHSTRUCT; + , &[_][]const u8{ + \\pub const struct_NAMED = extern struct { + \\ name: c_long, + \\}; + \\pub const NAMED = struct_NAMED; + \\pub const struct_ONENAMEWITHSTRUCT = extern struct { + \\ b: c_long, + \\}; + }); + } }