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 {
677677 .rhs = undefined,
678678 },
679679 });
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
681693 ctx.nodes.items(.data)[0] = .{
682694 .lhs = root_members.start,
683695 .rhs = root_members.end,
......@@ -762,7 +774,6 @@ fn renderNodes(c: *Context, nodes: []const Node) Allocator.Error!NodeSubRange {
762774 for (nodes) |node| {
763775 const res = try renderNode(c, node);
764776 if (node.tag() == .warning) continue;
765 if (c.nodes.items(.tag)[res] == .identifier) continue; // TODO remove
766777 try result.append(res);
767778 }
768779
......@@ -1176,7 +1187,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
11761187 };
11771188 if (payload.is_const) _ = try c.addToken(.keyword_const, "const");
11781189 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
11811192 return c.addNode(.{
11821193 .tag = .ptr_type_aligned,
......@@ -2447,7 +2458,7 @@ fn renderMacroFunc(c: *Context, node: Node) !NodeIndex {
24472458 _ = try c.addToken(.r_paren, ")");
24482459 break :blk res;
24492460 };
2450 const return_type_expr = try renderNode(c, payload.return_type);
2461 const return_type_expr = try renderNodeGrouped(c, payload.return_type);
24512462
24522463 const fn_proto = try blk: {
24532464 if (params.items.len < 2)
test/run_translated_c.zig+2
......@@ -6,6 +6,8 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {
66 cases.add("failed macros are only declared once",
77 \\#define FOO =
88 \\#define FOO =
9 \\#define PtrToPtr64(p) ((void *POINTER_64) p)
10 \\#define STRUC_ALIGNED_STACK_COPY(t,s) ((CONST t *)(s))
911 \\int main(void) {}
1012 , "");
1113