From 8088bdc6d5d751766b4b4df700b864b5a0397eb6 Mon Sep 17 00:00:00 2001 From: Vexu Date: Thu, 5 Mar 2020 11:22:50 +0200 Subject: [PATCH 1/2] translate-c macro comma operator --- src-self-hosted/translate_c.zig | 42 ++++++++++++++++++++++++++++++++- test/translate_c.zig | 22 +++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 8efc0e374..279c9facd 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -5038,7 +5038,14 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8, .{last.id}, ); _ = try appendToken(c, .Semicolon, ";"); - try type_of.params.push(expr); + const type_of_arg = if (expr.id != .Block) expr else blk: { + const blk = @fieldParentPtr(ast.Node.Block, "base", expr); + const blk_last = blk.statements.at(blk.statements.len - 1).*; + std.debug.assert(blk_last.id == .ControlFlowExpression); + const br = @fieldParentPtr(ast.Node.ControlFlowExpression, "base", blk_last); + break :blk br.rhs.?; + }; + try type_of.params.push(type_of_arg); return_expr.rhs = expr; block.rbrace = try appendToken(c, .RBrace, "}"); @@ -5073,6 +5080,39 @@ fn parseCExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, source_ if_node.@"else".?.body = try parseCPrimaryExpr(c, it, source, source_loc, scope); return &if_node.base; }, + .Comma => { + _ = try appendToken(c, .Semicolon, ";"); + const block_scope = try Scope.Block.init(c, scope, "blk"); + block_scope.block_node = try transCreateNodeBlock(c, block_scope.label); + + var last = node; + while (true) { + // suppress result + const lhs = try transCreateNodeIdentifier(c, "_"); + const op_token = try appendToken(c, .Equal, "="); + const op_node = try c.a().create(ast.Node.InfixOp); + op_node.* = .{ + .op_token = op_token, + .lhs = lhs, + .op = .Assign, + .rhs = last, + }; + try block_scope.block_node.statements.push(&op_node.base); + + last = try parseCPrefixOpExpr(c, it, source, source_loc, scope); + _ = try appendToken(c, .Semicolon, ";"); + if (it.next().?.id != .Comma) { + _ = it.prev(); + break; + } + } + + const break_node = try transCreateNodeBreak(c, block_scope.label); + break_node.rhs = last; + try block_scope.block_node.statements.push(&break_node.base); + block_scope.block_node.rbrace = try appendToken(c, .RBrace, "}"); + return &block_scope.block_node.base; + }, else => { _ = it.prev(); return node; diff --git a/test/translate_c.zig b/test/translate_c.zig index 1d6c2a60a..ef57ec55d 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -3,6 +3,28 @@ const std = @import("std"); const CrossTarget = std.zig.CrossTarget; pub fn addCases(cases: *tests.TranslateCContext) void { + cases.add("macro comma operator", + \\#define foo (foo, bar) + \\#define bar(x) (x, 3, 4, 5 * 6, baz(1, 2), 2, baz(1,2)) + , &[_][]const u8{ + \\pub const foo = blk: { + \\ _ = foo; + \\ break :blk bar; + \\}; + , + \\pub inline fn bar(x: var) @TypeOf(baz(1, 2)) { + \\ return blk: { + \\ _ = x; + \\ _ = 3; + \\ _ = 4; + \\ _ = 5 * 6; + \\ _ = baz(1, 2); + \\ _ = 2; + \\ break :blk baz(1, 2); + \\ }; + \\} + }); + cases.add("macro line continuation", \\#define FOO -\ \\BAR From e063854563eac4ece0402320492657807571c5df Mon Sep 17 00:00:00 2001 From: Vexu Date: Thu, 5 Mar 2020 12:15:12 +0200 Subject: [PATCH 2/2] translate-c correct assumption about macros --- src-self-hosted/translate_c.zig | 2 +- test/translate_c.zig | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 279c9facd..5262bad1c 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -4874,7 +4874,7 @@ fn transPreprocessorEntities(c: *Context, unit: *ZigClangASTUnit) Error!void { var tok_it = tok_list.iterator(0); const first_tok = tok_it.next().?; - assert(first_tok.id == .Identifier and mem.eql(u8, slice[first_tok.start..first_tok.end], name)); + assert(mem.eql(u8, slice[first_tok.start..first_tok.end], name)); var macro_fn = false; const next = tok_it.peek().?; diff --git a/test/translate_c.zig b/test/translate_c.zig index ef57ec55d..9fb4c3b10 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -25,6 +25,15 @@ pub fn addCases(cases: *tests.TranslateCContext) void { \\} }); + cases.add("macro keyword define", + \\#define foo 1 + \\#define inline 2 + , &[_][]const u8{ + \\pub const foo = 1; + , + \\pub const @"inline" = 2; + }); + cases.add("macro line continuation", \\#define FOO -\ \\BAR