authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-03-07 17:36:17+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-03-07 12:14:44-05:00
logabe7305e169be2047d65f96e6525d3828684f058
tree6f5e191be8c5e1beeacd2193be222be9c0a749a6
parent895672b3f96aab1f5bad3446f5186a047f29412c

translate-c remove redundant grouping, fix nested loops without blocks.


2 files changed, 30 insertions(+), 32 deletions(-)

src-self-hosted/translate_c.zig+11-28
......@@ -2237,6 +2237,7 @@ fn transWhileLoop(
22372237 .id = .Loop,
22382238 };
22392239 while_node.body = try transStmt(rp, &loop_scope, ZigClangWhileStmt_getBody(stmt), .unused, .r_value);
2240 _ = try appendToken(rp.c, .Semicolon, ";");
22402241 return &while_node.base;
22412242}
22422243
......@@ -2346,8 +2347,10 @@ fn transForLoop(
23462347 try block_scope.?.block_node.statements.push(&while_node.base);
23472348 block_scope.?.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");
23482349 return &block_scope.?.block_node.base;
2349 } else
2350 } else {
2351 _ = try appendToken(rp.c, .Semicolon, ";");
23502352 return &while_node.base;
2353 }
23512354}
23522355
23532356fn transSwitch(
......@@ -5576,14 +5579,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
55765579 );
55775580 return error.ParseError;
55785581 }
5579 // deref is often used together with casts so we group the lhs expression
5580 const group = try c.a().create(ast.Node.GroupedExpression);
5581 group.* = .{
5582 .lparen = try appendToken(c, .LParen, "("),
5583 .expr = node,
5584 .rparen = try appendToken(c, .RParen, ")"),
5585 };
5586 const deref = try transCreateNodePtrDeref(c, &group.base);
5582 const deref = try transCreateNodePtrDeref(c, node);
55875583 node = try transCreateNodeFieldAccess(c, deref, source[name_tok.start..name_tok.end]);
55885584 continue;
55895585 },
......@@ -5627,7 +5623,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
56275623 },
56285624 .Ampersand => {
56295625 op_token = try appendToken(c, .Ampersand, "&");
5630 op_id .BitAnd;
5626 op_id = .BitAnd;
56315627 },
56325628 .Plus => {
56335629 op_token = try appendToken(c, .Plus, "+");
......@@ -5635,7 +5631,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
56355631 },
56365632 .Minus => {
56375633 op_token = try appendToken(c, .Minus, "-");
5638 op_id .Sub;
5634 op_id = .Sub;
56395635 },
56405636 .AmpersandAmpersand => {
56415637 op_token = try appendToken(c, .Keyword_and, "and");
......@@ -5707,7 +5703,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
57075703 },
57085704 .BangEqual => {
57095705 op_token = try appendToken(c, .BangEqual, "!=");
5710 op_id = .BangEqual;
5706 op_id = .BangEqual;
57115707 },
57125708 .EqualEqual => {
57135709 op_token = try appendToken(c, .EqualEqual, "==");
......@@ -5760,25 +5756,12 @@ fn parseCPrefixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
57605756 return &node.base;
57615757 },
57625758 .Asterisk => {
5763 // deref is often used together with casts so we group the lhs expression
5764 const group = try c.a().create(ast.Node.GroupedExpression);
5765 group.* = .{
5766 .lparen = try appendToken(c, .LParen, "("),
5767 .expr = try parseCPrefixOpExpr(c, it, source, source_loc, scope),
5768 .rparen = try appendToken(c, .RParen, ")"),
5769 };
5770 return try transCreateNodePtrDeref(c, &group.base);
5759 const node = try parseCPrefixOpExpr(c, it, source, source_loc, scope);
5760 return try transCreateNodePtrDeref(c, node);
57715761 },
57725762 .Ampersand => {
5773 // address of is often used together with casts so we group the rhs expression
57745763 const node = try transCreateNodePrefixOp(c, .AddressOf, .Ampersand, "&");
5775 const group = try c.a().create(ast.Node.GroupedExpression);
5776 group.* = .{
5777 .lparen = try appendToken(c, .LParen, "("),
5778 .expr = try parseCPrefixOpExpr(c, it, source, source_loc, scope),
5779 .rparen = try appendToken(c, .RParen, ")"),
5780 };
5781 node.rhs = &group.base;
5764 node.rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope);
57825765 return &node.base;
57835766 },
57845767 else => {
test/translate_c.zig+19-4
......@@ -3,6 +3,22 @@ const std = @import("std");
33const CrossTarget = std.zig.CrossTarget;
44
55pub fn addCases(cases: *tests.TranslateCContext) void {
6 cases.add("nested loops without blocks",
7 \\void foo() {
8 \\ while (0) while (0) {}
9 \\ for (;;) while (0);
10 \\ for (;;) do {} while (0);
11 \\}
12 , &[_][]const u8{
13 \\pub export fn foo() void {
14 \\ while (@as(c_int, 0) != 0) while (@as(c_int, 0) != 0) {};
15 \\ while (true) while (@as(c_int, 0) != 0) {};
16 \\ while (true) while (true) {
17 \\ if (!(@as(c_int, 0) != 0)) break;
18 \\ };
19 \\}
20 });
21
622 cases.add("macro comma operator",
723 \\#define foo (foo, bar)
824 \\#define bar(x) (&x, +3, 4 == 4, 5 * 6, baz(1, 2), 2 % 2, baz(1,2))
......@@ -14,7 +30,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1430 ,
1531 \\pub inline fn bar(x: var) @TypeOf(baz(1, 2)) {
1632 \\ return blk: {
17 \\ _ = &(x);
33 \\ _ = &x;
1834 \\ _ = 3;
1935 \\ _ = 4 == 4;
2036 \\ _ = 5 * 6;
......@@ -1993,7 +2009,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
19932009 ,
19942010 \\pub const DOT = a.b;
19952011 ,
1996 \\pub const ARROW = (a).*.b;
2012 \\pub const ARROW = a.*.b;
19972013 });
19982014
19992015 cases.add("array access",
......@@ -2762,12 +2778,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
27622778 \\}
27632779 \\*_XPrivDisplay;
27642780 \\typedef struct _XDisplay Display;
2765 \\#define DefaultScreen(dpy) (((_XPrivDisplay)(dpy))->default_screen)
2781 \\#define DefaultScreen(dpy) (((_XPrivDisplay)(dpy))->default_screen)
27662782 \\
27672783 , &[_][]const u8{
27682784 \\pub inline fn DefaultScreen(dpy: var) @TypeOf((if (@typeInfo(@TypeOf(dpy)) == .Pointer) @ptrCast(_XPrivDisplay, @alignCast(@alignOf(_XPrivDisplay.Child), dpy)) else if (@typeInfo(@TypeOf(dpy)) == .Int) @intToPtr(_XPrivDisplay, dpy) else @as(_XPrivDisplay, dpy)).*.default_screen) {
27692785 \\ return (if (@typeInfo(@TypeOf(dpy)) == .Pointer) @ptrCast(_XPrivDisplay, @alignCast(@alignOf(_XPrivDisplay.Child), dpy)) else if (@typeInfo(@TypeOf(dpy)) == .Int) @intToPtr(_XPrivDisplay, dpy) else @as(_XPrivDisplay, dpy)).*.default_screen;
27702786 \\}
27712787 });
2772
27732788}