Commit 974a1c5525

Veikka Tuominen <git@vexu.eu>
2021-02-19 11:50:42
translate-c: small fixes to avoid generating invalid code for macros
1 parent 3aba1fa
Changed files (2)
src
translate_c
test
src/translate_c/ast.zig
@@ -677,7 +677,19 @@ pub fn render(gpa: *Allocator, nodes: []const Node) !std.zig.ast.Tree {
             .rhs = undefined,
         },
     });
-    const root_members = try renderNodes(&ctx, nodes);
+
+    const root_members = blk: {
+        var result = std.ArrayList(NodeIndex).init(gpa);
+        defer result.deinit();
+
+        for (nodes) |node| {
+            const res = try renderNode(&ctx, node);
+            if (node.tag() == .warning) continue;
+            try result.append(res);
+        }
+        break :blk try ctx.listToSpan(result.items);
+    };
+
     ctx.nodes.items(.data)[0] = .{
         .lhs = root_members.start,
         .rhs = root_members.end,
@@ -762,7 +774,6 @@ fn renderNodes(c: *Context, nodes: []const Node) Allocator.Error!NodeSubRange {
     for (nodes) |node| {
         const res = try renderNode(c, node);
         if (node.tag() == .warning) continue;
-        if (c.nodes.items(.tag)[res] == .identifier) continue; // TODO remove
         try result.append(res);
     }
 
@@ -1176,7 +1187,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
             };
             if (payload.is_const) _ = try c.addToken(.keyword_const, "const");
             if (payload.is_volatile) _ = try c.addToken(.keyword_volatile, "volatile");
-            const elem_type = try renderNode(c, payload.elem_type);
+            const elem_type = try renderNodeGrouped(c, payload.elem_type);
 
             return c.addNode(.{
                 .tag = .ptr_type_aligned,
@@ -2447,7 +2458,7 @@ fn renderMacroFunc(c: *Context, node: Node) !NodeIndex {
         _ = try c.addToken(.r_paren, ")");
         break :blk res;
     };
-    const return_type_expr = try renderNode(c, payload.return_type);
+    const return_type_expr = try renderNodeGrouped(c, payload.return_type);
 
     const fn_proto = try blk: {
         if (params.items.len < 2)
test/run_translated_c.zig
@@ -6,6 +6,8 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {
     cases.add("failed macros are only declared once",
         \\#define FOO =
         \\#define FOO =
+        \\#define PtrToPtr64(p) ((void *POINTER_64) p)
+        \\#define STRUC_ALIGNED_STACK_COPY(t,s) ((CONST t *)(s))
         \\int main(void) {}
     , "");