mirror of
https://github.com/ziglang/zig.git
synced 2026-02-14 05:20:34 +00:00
AstGen: implement for loop payload
This commit is contained in:
parent
30c9808391
commit
e9477048e5
@ -4263,6 +4263,7 @@ fn forExpr(
|
||||
};
|
||||
defer then_scope.instructions.deinit(astgen.gpa);
|
||||
|
||||
var payload_val_scope: Scope.LocalVal = undefined;
|
||||
var index_scope: Scope.LocalPtr = undefined;
|
||||
const then_sub_scope = blk: {
|
||||
const payload_token = for_full.payload_token.?;
|
||||
@ -4272,22 +4273,34 @@ fn forExpr(
|
||||
payload_token;
|
||||
const is_ptr = ident != payload_token;
|
||||
const value_name = tree.tokenSlice(ident);
|
||||
var payload_sub_scope: *Scope = undefined;
|
||||
if (!mem.eql(u8, value_name, "_")) {
|
||||
return astgen.failTok(ident, "TODO implement for loop value payload", .{});
|
||||
const tag: Zir.Inst.Tag = if (is_ptr) .elem_ptr else .elem_val;
|
||||
const payload_inst = try then_scope.addBin(tag, array_ptr, index);
|
||||
payload_val_scope = .{
|
||||
.parent = &then_scope.base,
|
||||
.gen_zir = &then_scope,
|
||||
.name = value_name,
|
||||
.inst = payload_inst,
|
||||
.token_src = ident,
|
||||
};
|
||||
payload_sub_scope = &payload_val_scope.base;
|
||||
} else if (is_ptr) {
|
||||
return astgen.failTok(payload_token, "pointer modifier invalid on discard", .{});
|
||||
} else {
|
||||
payload_sub_scope = &then_scope.base;
|
||||
}
|
||||
|
||||
const index_token = if (token_tags[ident + 1] == .comma)
|
||||
ident + 2
|
||||
else
|
||||
break :blk &then_scope.base;
|
||||
break :blk payload_sub_scope;
|
||||
if (mem.eql(u8, tree.tokenSlice(index_token), "_")) {
|
||||
return astgen.failTok(index_token, "discard of index capture; omit it instead", .{});
|
||||
}
|
||||
const index_name = try astgen.identifierTokenString(index_token);
|
||||
index_scope = .{
|
||||
.parent = &then_scope.base,
|
||||
.parent = payload_sub_scope,
|
||||
.gen_zir = &then_scope,
|
||||
.name = index_name,
|
||||
.ptr = index_ptr,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user