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:
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,
+ \\};
+ });
+ }
}