authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-04-20 17:52:35-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-04-20 17:52:35-07:00
loge9477048e51898a15dfe988933122f25b09fe937
tree003dc4726bad3664dac55b762cfd9a2600a451d2
parent30c9808391bead620eaf24991d7a9ba21e4266b9

AstGen: implement for loop payload


1 files changed, 16 insertions(+), 3 deletions(-)

src/AstGen.zig+16-3
......@@ -4263,6 +4263,7 @@ fn forExpr(
42634263 };
42644264 defer then_scope.instructions.deinit(astgen.gpa);
42654265
4266 var payload_val_scope: Scope.LocalVal = undefined;
42664267 var index_scope: Scope.LocalPtr = undefined;
42674268 const then_sub_scope = blk: {
42684269 const payload_token = for_full.payload_token.?;
......@@ -4272,22 +4273,34 @@ fn forExpr(
42724273 payload_token;
42734274 const is_ptr = ident != payload_token;
42744275 const value_name = tree.tokenSlice(ident);
4276 var payload_sub_scope: *Scope = undefined;
42754277 if (!mem.eql(u8, value_name, "_")) {
4276 return astgen.failTok(ident, "TODO implement for loop value payload", .{});
4278 const tag: Zir.Inst.Tag = if (is_ptr) .elem_ptr else .elem_val;
4279 const payload_inst = try then_scope.addBin(tag, array_ptr, index);
4280 payload_val_scope = .{
4281 .parent = &then_scope.base,
4282 .gen_zir = &then_scope,
4283 .name = value_name,
4284 .inst = payload_inst,
4285 .token_src = ident,
4286 };
4287 payload_sub_scope = &payload_val_scope.base;
42774288 } else if (is_ptr) {
42784289 return astgen.failTok(payload_token, "pointer modifier invalid on discard", .{});
4290 } else {
4291 payload_sub_scope = &then_scope.base;
42794292 }
42804293
42814294 const index_token = if (token_tags[ident + 1] == .comma)
42824295 ident + 2
42834296 else
4284 break :blk &then_scope.base;
4297 break :blk payload_sub_scope;
42854298 if (mem.eql(u8, tree.tokenSlice(index_token), "_")) {
42864299 return astgen.failTok(index_token, "discard of index capture; omit it instead", .{});
42874300 }
42884301 const index_name = try astgen.identifierTokenString(index_token);
42894302 index_scope = .{
4290 .parent = &then_scope.base,
4303 .parent = payload_sub_scope,
42914304 .gen_zir = &then_scope,
42924305 .name = index_name,
42934306 .ptr = index_ptr,