| ... | ... | @@ -6061,6 +6061,61 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 6061 | 6061 | node = &call_node.base; |
| 6062 | 6062 | continue; |
| 6063 | 6063 | }, |
| 6064 | .LBrace => { |
| 6065 | // must come immediately after `node` |
| 6066 | _ = try appendToken(c, .Comma, ","); |
| 6067 | |
| 6068 | const dot = try appendToken(c, .Period, "."); |
| 6069 | _ = try appendToken(c, .LBrace, "{"); |
| 6070 | |
| 6071 | var init_vals = std.ArrayList(*ast.Node).init(c.gpa); |
| 6072 | defer init_vals.deinit(); |
| 6073 | |
| 6074 | while (true) { |
| 6075 | const val = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 6076 | try init_vals.append(val); |
| 6077 | const next = it.next().?; |
| 6078 | if (next.id == .Comma) |
| 6079 | _ = try appendToken(c, .Comma, ",") |
| 6080 | else if (next.id == .RBrace) |
| 6081 | break |
| 6082 | else { |
| 6083 | const first_tok = it.list.at(0); |
| 6084 | try failDecl( |
| 6085 | c, |
| 6086 | source_loc, |
| 6087 | source[first_tok.start..first_tok.end], |
| 6088 | "unable to translate C expr: expected ',' or '}}'", |
| 6089 | .{}, |
| 6090 | ); |
| 6091 | return error.ParseError; |
| 6092 | } |
| 6093 | } |
| 6094 | const tuple_node = try ast.Node.StructInitializerDot.alloc(c.arena, init_vals.items.len); |
| 6095 | tuple_node.* = .{ |
| 6096 | .dot = dot, |
| 6097 | .list_len = init_vals.items.len, |
| 6098 | .rtoken = try appendToken(c, .RBrace, "}"), |
| 6099 | }; |
| 6100 | mem.copy(*ast.Node, tuple_node.list(), init_vals.items); |
| 6101 | |
| 6102 | |
| 6103 | //(@import("std").mem.zeroInit(T, .{x})) |
| 6104 | const import_fn_call = try c.createBuiltinCall("@import", 1); |
| 6105 | const std_node = try transCreateNodeStringLiteral(c, "\"std\""); |
| 6106 | import_fn_call.params()[0] = std_node; |
| 6107 | import_fn_call.rparen_token = try appendToken(c, .RParen, ")"); |
| 6108 | const inner_field_access = try transCreateNodeFieldAccess(c, &import_fn_call.base, "mem"); |
| 6109 | const outer_field_access = try transCreateNodeFieldAccess(c, inner_field_access, "zeroInit"); |
| 6110 | |
| 6111 | const zero_init_call = try c.createCall(outer_field_access, 2); |
| 6112 | zero_init_call.params()[0] = node; |
| 6113 | zero_init_call.params()[1] = &tuple_node.base; |
| 6114 | zero_init_call.rtoken = try appendToken(c, .RParen, ")"); |
| 6115 | |
| 6116 | node = &zero_init_call.base; |
| 6117 | continue; |
| 6118 | }, |
| 6064 | 6119 | .BangEqual => { |
| 6065 | 6120 | op_token = try appendToken(c, .BangEqual, "!="); |
| 6066 | 6121 | op_id = .BangEqual; |