diff --git a/lib/std/zig/AstGen.zig b/lib/std/zig/AstGen.zig index 304c3f6523..a7e5230e07 100644 --- a/lib/std/zig/AstGen.zig +++ b/lib/std/zig/AstGen.zig @@ -2728,7 +2728,7 @@ fn addEnsureResult(gz: *GenZir, maybe_unused_result: Zir.Inst.Ref, statement: As .elem_ptr, .elem_val, .elem_ptr_node, - .elem_val_node, + .elem_ptr_load, .elem_val_imm, .field_ptr, .field_ptr_load, @@ -6210,14 +6210,14 @@ fn arrayAccess( }, else => { const lhs_node, const rhs_node = tree.nodeData(node).node_and_node; - const lhs = try expr(gz, scope, .{ .rl = .none }, lhs_node); + const lhs = try expr(gz, scope, .{ .rl = .ref }, lhs_node); const cursor = maybeAdvanceSourceCursorToMainToken(gz, node); const rhs = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, rhs_node); try emitDbgStmt(gz, cursor); - return rvalue(gz, ri, try gz.addPlNode(.elem_val_node, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs }), node); + return rvalue(gz, ri, try gz.addPlNode(.elem_ptr_load, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs }), node); }, } } diff --git a/lib/std/zig/Zir.zig b/lib/std/zig/Zir.zig index 3028426665..8d57dbda7a 100644 --- a/lib/std/zig/Zir.zig +++ b/lib/std/zig/Zir.zig @@ -441,12 +441,17 @@ pub const Inst = struct { /// Payload is `Bin`. /// No OOB safety check is emitted. elem_ptr, - /// Given an array, slice, or pointer, returns the element at the provided index. + /// Given a pointer to an array, slice, or pointer, loads the element + /// at the provided index. + /// /// Uses the `pl_node` union field. AST node is a[b] syntax. Payload is `Bin`. - elem_val_node, - /// Same as `elem_val_node` but used only for for loop. - /// Uses the `pl_node` union field. AST node is the condition of a for loop. - /// Payload is `Bin`. + elem_ptr_load, + /// Given an array, slice, or pointer, returns the element at the + /// provided index. + /// + /// Uses the `pl_node` union field. AST node is the condition of a for + /// loop. Payload is `Bin`. + /// /// No OOB safety check is emitted. elem_val, /// Same as `elem_val` but takes the index as an immediate value. @@ -1146,7 +1151,7 @@ pub const Inst = struct { .elem_ptr, .elem_val, .elem_ptr_node, - .elem_val_node, + .elem_ptr_load, .elem_val_imm, .ensure_result_used, .ensure_result_non_error, @@ -1440,7 +1445,7 @@ pub const Inst = struct { .elem_ptr, .elem_val, .elem_ptr_node, - .elem_val_node, + .elem_ptr_load, .elem_val_imm, .field_ptr, .field_ptr_load, @@ -1687,7 +1692,7 @@ pub const Inst = struct { .elem_ptr = .pl_node, .elem_ptr_node = .pl_node, .elem_val = .pl_node, - .elem_val_node = .pl_node, + .elem_ptr_load = .pl_node, .elem_val_imm = .elem_val_imm, .ensure_result_used = .un_node, .ensure_result_non_error = .un_node, @@ -4223,7 +4228,7 @@ fn findTrackableInner( .div, .elem_ptr_node, .elem_ptr, - .elem_val_node, + .elem_ptr_load, .elem_val, .elem_val_imm, .ensure_result_used, diff --git a/src/Sema.zig b/src/Sema.zig index 4e0167180e..b6252551ae 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -1193,7 +1193,7 @@ fn analyzeBodyInner( .elem_ptr => try sema.zirElemPtr(block, inst), .elem_ptr_node => try sema.zirElemPtrNode(block, inst), .elem_val => try sema.zirElemVal(block, inst), - .elem_val_node => try sema.zirElemValNode(block, inst), + .elem_ptr_load => try sema.zirElemPtrLoad(block, inst), .elem_val_imm => try sema.zirElemValImm(block, inst), .elem_type => try sema.zirElemType(block, inst), .indexable_ptr_elem_type => try sema.zirIndexablePtrElemType(block, inst), @@ -10102,7 +10102,7 @@ fn zirElemVal(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air return sema.elemVal(block, src, array, elem_index, src, false); } -fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { +fn zirElemPtrLoad(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { const tracy = trace(@src()); defer tracy.end(); @@ -10110,10 +10110,11 @@ fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError const src = block.nodeOffset(inst_data.src_node); const elem_index_src = block.src(.{ .node_offset_array_access_index = inst_data.src_node }); const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data; - const array = try sema.resolveInst(extra.lhs); + const array_ptr = try sema.resolveInst(extra.lhs); const uncoerced_elem_index = try sema.resolveInst(extra.rhs); const elem_index = try sema.coerce(block, .usize, uncoerced_elem_index, elem_index_src); - return sema.elemVal(block, src, array, elem_index, elem_index_src, true); + const elem_ptr = try elemPtr(sema, block, src, array_ptr, elem_index, elem_index_src, false, true); + return analyzeLoad(sema, block, src, elem_ptr, elem_index_src); } fn zirElemValImm(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { diff --git a/src/print_zir.zig b/src/print_zir.zig index 490bba5c19..d263db9f33 100644 --- a/src/print_zir.zig +++ b/src/print_zir.zig @@ -406,7 +406,7 @@ const Writer = struct { .memset, .memmove, .elem_ptr_node, - .elem_val_node, + .elem_ptr_load, .elem_ptr, .elem_val, .array_type,