From 94841d0292932098df2e1e807e1b5c36dc1f7b66 Mon Sep 17 00:00:00 2001 From: SuperAuguste Date: Tue, 7 Apr 2020 13:26:17 -0400 Subject: [PATCH 1/5] Nameless struct field consistency --- src-self-hosted/translate_c.zig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 124a142f94..a2a4854306 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -815,6 +815,9 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?* raw_name = try std.fmt.allocPrint(c.a(), "unnamed_{}", .{c.getMangle()}); is_anon = true; } + if (raw_name.len == 0) { + continue; + } const field_name = try appendIdentifier(c, raw_name); _ = try appendToken(c, .Colon, ":"); const field_type = transQualType(rp, field_qt, field_loc) catch |err| switch (err) { @@ -5570,6 +5573,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, return &group_node.base; }, else => { + std.debug.warn("{}", .{source}); const first_tok = it.list.at(0); try failDecl( c, From 9298d38ceee67251542112045fdf2cd86b842b0c Mon Sep 17 00:00:00 2001 From: SuperAuguste Date: Tue, 7 Apr 2020 13:33:01 -0400 Subject: [PATCH 2/5] remove debug statement --- src-self-hosted/translate_c.zig | 1 - 1 file changed, 1 deletion(-) diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index a2a4854306..5b91ec6a4d 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -5573,7 +5573,6 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, return &group_node.base; }, else => { - std.debug.warn("{}", .{source}); const first_tok = it.list.at(0); try failDecl( c, From f21ac0220aa16cc1376cc001d123c8ad25607ecd Mon Sep 17 00:00:00 2001 From: SuperAuguste Date: Tue, 7 Apr 2020 14:39:24 -0400 Subject: [PATCH 3/5] msvc fix --- src-self-hosted/translate_c.zig | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 5b91ec6a4d..80bf3b561a 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -811,13 +811,10 @@ 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 (std.Target.current.abi == .msvc and raw_name.len == 0)) { raw_name = try std.fmt.allocPrint(c.a(), "unnamed_{}", .{c.getMangle()}); is_anon = true; } - if (raw_name.len == 0) { - continue; - } const field_name = try appendIdentifier(c, raw_name); _ = try appendToken(c, .Colon, ":"); const field_type = transQualType(rp, field_qt, field_loc) catch |err| switch (err) { From 882aa868436a8e2562ffbdb9f5f7551b6808873f Mon Sep 17 00:00:00 2001 From: SuperAuguste Date: Tue, 7 Apr 2020 15:08:46 -0400 Subject: [PATCH 4/5] more fixes --- src-self-hosted/translate_c.zig | 2 +- test/translate_c.zig | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 80bf3b561a..023687f1c0 100644 --- 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) or (std.Target.current.abi == .msvc and raw_name.len == 0)) { + 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 index b850cc4a09..df605c8eff 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -2853,4 +2853,28 @@ pub fn addCases(cases: *tests.TranslateCContext) void { , &[_][]const u8{ \\pub const FOO = 0x61626364; }); + + if (std.Target.current.abi == .msvc) { + cases.add("nameless struct fields on msvc", + \\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, + \\}; + }); + } } From 116c76cf82cd9e7ea3018e36dd9756f2f063143d Mon Sep 17 00:00:00 2001 From: SuperAuguste Date: Tue, 7 Apr 2020 15:19:28 -0400 Subject: [PATCH 5/5] fix tests --- test/translate_c.zig | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/test/translate_c.zig b/test/translate_c.zig index df605c8eff..32e6020e77 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -2855,7 +2855,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void { }); if (std.Target.current.abi == .msvc) { - cases.add("nameless struct fields on msvc", + cases.add("nameless struct fields", \\typedef struct NAMED \\{ \\ long name; @@ -2876,5 +2876,26 @@ pub fn addCases(cases: *tests.TranslateCContext) void { \\ 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, + \\}; + }); } }