From e4563860feba97626630d15f481c6ad19348b81f Mon Sep 17 00:00:00 2001 From: xackus <14938807+xackus@users.noreply.github.com> Date: Sun, 4 Apr 2021 00:15:22 +0200 Subject: [PATCH] translate-c: fix calls with no args in macros --- src/translate_c.zig | 31 ++++++++++++++++++------------- test/translate_c.zig | 8 ++++++++ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/translate_c.zig b/src/translate_c.zig index 9ad90a5320..4c6d9ccee1 100644 --- a/src/translate_c.zig +++ b/src/translate_c.zig @@ -5211,21 +5211,26 @@ fn parseCPostfixExpr(c: *Context, m: *MacroCtx, scope: *Scope) ParseError!Node { } }, .LParen => { - var args = std.ArrayList(Node).init(c.gpa); - defer args.deinit(); - while (true) { - const arg = try parseCCondExpr(c, m, scope); - try args.append(arg); - switch (m.next().?) { - .Comma => {}, - .RParen => break, - else => { - try m.fail(c, "unable to translate C expr: expected ',' or ')'", .{}); - return error.ParseError; - }, + if (m.peek().? == .RParen) { + m.i += 1; + node = try Tag.call.create(c.arena, .{ .lhs = node, .args = &[0]Node{} }); + } else { + var args = std.ArrayList(Node).init(c.gpa); + defer args.deinit(); + while (true) { + const arg = try parseCCondExpr(c, m, scope); + try args.append(arg); + switch (m.next().?) { + .Comma => {}, + .RParen => break, + else => { + try m.fail(c, "unable to translate C expr: expected ',' or ')'", .{}); + return error.ParseError; + }, + } } + node = try Tag.call.create(c.arena, .{ .lhs = node, .args = try c.arena.dupe(Node, args.items) }); } - node = try Tag.call.create(c.arena, .{ .lhs = node, .args = try c.arena.dupe(Node, args.items) }); }, .LBrace => { var init_vals = std.ArrayList(Node).init(c.gpa); diff --git a/test/translate_c.zig b/test/translate_c.zig index 54bb468cf9..e2f974ff89 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -2529,6 +2529,14 @@ pub fn addCases(cases: *tests.TranslateCContext) void { \\} }); + cases.add("macro call with no args", + \\#define CALL(arg) bar() + , &[_][]const u8{ + \\pub fn CALL(arg: anytype) callconv(.Inline) @TypeOf(bar()) { + \\ return bar(); + \\} + }); + cases.add("logical and, logical or", \\int max(int a, int b) { \\ if (a < b || a == b)