| ... | @@ -5211,21 +5211,26 @@ fn parseCPostfixExpr(c: *Context, m: *MacroCtx, scope: *Scope) ParseError!Node { | ... | @@ -5211,21 +5211,26 @@ fn parseCPostfixExpr(c: *Context, m: *MacroCtx, scope: *Scope) ParseError!Node { |
| 5211 | } | 5211 | } |
| 5212 | }, | 5212 | }, |
| 5213 | .LParen => { | 5213 | .LParen => { |
| 5214 | var args = std.ArrayList(Node).init(c.gpa); | 5214 | if (m.peek().? == .RParen) { |
| 5215 | defer args.deinit(); | 5215 | m.i += 1; |
| 5216 | while (true) { | 5216 | node = try Tag.call.create(c.arena, .{ .lhs = node, .args = &[0]Node{} }); |
| 5217 | const arg = try parseCCondExpr(c, m, scope); | 5217 | } else { |
| 5218 | try args.append(arg); | 5218 | var args = std.ArrayList(Node).init(c.gpa); |
| 5219 | switch (m.next().?) { | 5219 | defer args.deinit(); |
| 5220 | .Comma => {}, | 5220 | while (true) { |
| 5221 | .RParen => break, | 5221 | const arg = try parseCCondExpr(c, m, scope); |
| 5222 | else => { | 5222 | try args.append(arg); |
| 5223 | try m.fail(c, "unable to translate C expr: expected ',' or ')'", .{}); | 5223 | switch (m.next().?) { |
| 5224 | return error.ParseError; | 5224 | .Comma => {}, |
| 5225 | }, | 5225 | .RParen => break, |
| | 5226 | else => { |
| | 5227 | try m.fail(c, "unable to translate C expr: expected ',' or ')'", .{}); |
| | 5228 | return error.ParseError; |
| | 5229 | }, |
| | 5230 | } |
| 5226 | } | 5231 | } |
| | 5232 | node = try Tag.call.create(c.arena, .{ .lhs = node, .args = try c.arena.dupe(Node, args.items) }); |
| 5227 | } | 5233 | } |
| 5228 | node = try Tag.call.create(c.arena, .{ .lhs = node, .args = try c.arena.dupe(Node, args.items) }); | | |
| 5229 | }, | 5234 | }, |
| 5230 | .LBrace => { | 5235 | .LBrace => { |
| 5231 | var init_vals = std.ArrayList(Node).init(c.gpa); | 5236 | var init_vals = std.ArrayList(Node).init(c.gpa); |