@@ -9957,7 +9957,7 @@ fn zirElemPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
99579957 indexable_ty.fmt(sema.mod),
99589958 });
99599959 errdefer msg.destroy(sema.gpa);
9960- if (indexable_ty.zigTypeTag() == .Array ) {
9960+ if (indexable_ty.isIndexable() ) {
99619961 try sema.errNote(block, src, msg, "consider using '&' here", .{});
99629962 }
99639963 break :msg msg;
@@ -24979,8 +24979,19 @@ fn elemPtrOneLayerOnly(
2497924979 return block.addPtrElemPtr(indexable, elem_index, result_ty);
2498024980 },
2498124981 .One => {
24982- assert(indexable_ty.childType().zigTypeTag() == .Array); // Guaranteed by checkIndexable
24983- return sema.elemPtrArray(block, src, indexable_src, indexable, elem_index_src, elem_index, init, oob_safety);
24982+ const child_ty = indexable_ty.childType();
24983+ switch (child_ty.zigTypeTag()) {
24984+ .Array, .Vector => {
24985+ return sema.elemPtrArray(block, src, indexable_src, indexable, elem_index_src, elem_index, init, oob_safety);
24986+ },
24987+ .Struct => {
24988+ assert(child_ty.isTuple());
24989+ const index_val = try sema.resolveConstValue(block, elem_index_src, elem_index, "tuple field access index must be comptime-known");
24990+ const index = @intCast(u32, index_val.toUnsignedInt(target));
24991+ return sema.tupleFieldPtr(block, indexable_src, indexable, elem_index_src, index, false);
24992+ },
24993+ else => unreachable, // Guaranteed by checkIndexable
24994+ }
2498424995 },
2498524996 }
2498624997}
@@ -25026,7 +25037,6 @@ fn elemVal(
2502625037 return block.addBinOp(.ptr_elem_val, indexable, elem_index);
2502725038 },
2502825039 .One => {
25029- assert(indexable_ty.childType().zigTypeTag() == .Array); // Guaranteed by checkIndexable
2503025040 const elem_ptr = try sema.elemPtr(block, indexable_src, indexable, elem_index, elem_index_src, false, oob_safety);
2503125041 return sema.analyzeLoad(block, indexable_src, elem_ptr, elem_index_src);
2503225042 },
0 commit comments