authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-02-19 12:50:42+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-02-19 12:50:42+02:00
log974a1c55255560318f1d99003d353374b94b63e1
tree7656f9083421f8982efc4ee48c340c8d143a2205
parent3aba1fa04fe633f89e05a7adc4c170d400705bf9
signaturelock-open Commit is signed but in an unrecognized format.

translate-c: small fixes to avoid generating invalid code for macros


2 files changed, 17 insertions(+), 4 deletions(-)

src/translate_c/ast.zig+15-4
...@@ -677,7 +677,19 @@ pub fn render(gpa: *Allocator, nodes: []const Node) !std.zig.ast.Tree {...@@ -677,7 +677,19 @@ pub fn render(gpa: *Allocator, nodes: []const Node) !std.zig.ast.Tree {
677 .rhs = undefined,677 .rhs = undefined,
678 },678 },
679 });679 });
680 const root_members = try renderNodes(&ctx, nodes);680
681 const root_members = blk: {
682 var result = std.ArrayList(NodeIndex).init(gpa);
683 defer result.deinit();
684
685 for (nodes) |node| {
686 const res = try renderNode(&ctx, node);
687 if (node.tag() == .warning) continue;
688 try result.append(res);
689 }
690 break :blk try ctx.listToSpan(result.items);
691 };
692
681 ctx.nodes.items(.data)[0] = .{693 ctx.nodes.items(.data)[0] = .{
682 .lhs = root_members.start,694 .lhs = root_members.start,
683 .rhs = root_members.end,695 .rhs = root_members.end,
...@@ -762,7 +774,6 @@ fn renderNodes(c: *Context, nodes: []const Node) Allocator.Error!NodeSubRange {...@@ -762,7 +774,6 @@ fn renderNodes(c: *Context, nodes: []const Node) Allocator.Error!NodeSubRange {
762 for (nodes) |node| {774 for (nodes) |node| {
763 const res = try renderNode(c, node);775 const res = try renderNode(c, node);
764 if (node.tag() == .warning) continue;776 if (node.tag() == .warning) continue;
765 if (c.nodes.items(.tag)[res] == .identifier) continue; // TODO remove
766 try result.append(res);777 try result.append(res);
767 }778 }
768779
...@@ -1176,7 +1187,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {...@@ -1176,7 +1187,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
1176 };1187 };
1177 if (payload.is_const) _ = try c.addToken(.keyword_const, "const");1188 if (payload.is_const) _ = try c.addToken(.keyword_const, "const");
1178 if (payload.is_volatile) _ = try c.addToken(.keyword_volatile, "volatile");1189 if (payload.is_volatile) _ = try c.addToken(.keyword_volatile, "volatile");
1179 const elem_type = try renderNode(c, payload.elem_type);1190 const elem_type = try renderNodeGrouped(c, payload.elem_type);
11801191
1181 return c.addNode(.{1192 return c.addNode(.{
1182 .tag = .ptr_type_aligned,1193 .tag = .ptr_type_aligned,
...@@ -2447,7 +2458,7 @@ fn renderMacroFunc(c: *Context, node: Node) !NodeIndex {...@@ -2447,7 +2458,7 @@ fn renderMacroFunc(c: *Context, node: Node) !NodeIndex {
2447 _ = try c.addToken(.r_paren, ")");2458 _ = try c.addToken(.r_paren, ")");
2448 break :blk res;2459 break :blk res;
2449 };2460 };
2450 const return_type_expr = try renderNode(c, payload.return_type);2461 const return_type_expr = try renderNodeGrouped(c, payload.return_type);
24512462
2452 const fn_proto = try blk: {2463 const fn_proto = try blk: {
2453 if (params.items.len < 2)2464 if (params.items.len < 2)
test/run_translated_c.zig+2
...@@ -6,6 +6,8 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {...@@ -6,6 +6,8 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {
6 cases.add("failed macros are only declared once",6 cases.add("failed macros are only declared once",
7 \\#define FOO =7 \\#define FOO =
8 \\#define FOO =8 \\#define FOO =
9 \\#define PtrToPtr64(p) ((void *POINTER_64) p)
10 \\#define STRUC_ALIGNED_STACK_COPY(t,s) ((CONST t *)(s))
9 \\int main(void) {}11 \\int main(void) {}
10 , "");12 , "");
1113