@@ -9991,7 +9991,7 @@ fn zirElemPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
99919991 indexable_ty.fmt(mod),
99929992 });
99939993 errdefer msg.destroy(sema.gpa);
9994- if (indexable_ty.zigTypeTag (mod) == .Array ) {
9994+ if (indexable_ty.isIndexable (mod)) {
99959995 try sema.errNote(block, src, msg, "consider using '&' here", .{});
99969996 }
99979997 break :msg msg;
@@ -26088,8 +26088,19 @@ fn elemPtrOneLayerOnly(
2608826088 return block.addPtrElemPtr(indexable, elem_index, result_ty);
2608926089 },
2609026090 .One => {
26091- assert(indexable_ty.childType(mod).zigTypeTag(mod) == .Array); // Guaranteed by checkIndexable
26092- return sema.elemPtrArray(block, src, indexable_src, indexable, elem_index_src, elem_index, init, oob_safety);
26091+ const child_ty = indexable_ty.childType(mod);
26092+ switch (child_ty.zigTypeTag(mod)) {
26093+ .Array, .Vector => {
26094+ return sema.elemPtrArray(block, src, indexable_src, indexable, elem_index_src, elem_index, init, oob_safety);
26095+ },
26096+ .Struct => {
26097+ assert(child_ty.isTuple(mod));
26098+ const index_val = try sema.resolveConstValue(block, elem_index_src, elem_index, "tuple field access index must be comptime-known");
26099+ const index = @intCast(u32, index_val.toUnsignedInt(mod));
26100+ return sema.tupleFieldPtr(block, indexable_src, indexable, elem_index_src, index, false);
26101+ },
26102+ else => unreachable, // Guaranteed by checkIndexable
26103+ }
2609326104 },
2609426105 }
2609526106}
@@ -26139,19 +26150,15 @@ fn elemVal(
2613926150 return block.addBinOp(.ptr_elem_val, indexable, elem_index);
2614026151 },
2614126152 .One => {
26142- const array_ty = indexable_ty.childType(mod); // Guaranteed by checkIndexable
26143- assert(array_ty.zigTypeTag(mod) == .Array);
26144-
26145- if (array_ty.sentinel(mod)) |sentinel| {
26146- // index must be defined since it can access out of bounds
26147- if (try sema.resolveDefinedValue(block, elem_index_src, elem_index)) |index_val| {
26148- const index = @intCast(usize, index_val.toUnsignedInt(mod));
26149- if (index == array_ty.arrayLen(mod)) {
26150- return sema.addConstant(array_ty.childType(mod), sentinel);
26151- }
26152- }
26153+ arr_sent: {
26154+ const inner_ty = indexable_ty.childType(mod);
26155+ if (inner_ty.zigTypeTag(mod) != .Array) break :arr_sent;
26156+ const sentinel = inner_ty.sentinel(mod) orelse break :arr_sent;
26157+ const index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index) orelse break :arr_sent;
26158+ const index = try sema.usizeCast(block, src, index_val.toUnsignedInt(mod));
26159+ if (index != inner_ty.arrayLen(mod)) break :arr_sent;
26160+ return sema.addConstant(inner_ty.childType(mod), sentinel);
2615326161 }
26154-
2615526162 const elem_ptr = try sema.elemPtr(block, indexable_src, indexable, elem_index, elem_index_src, false, oob_safety);
2615626163 return sema.analyzeLoad(block, indexable_src, elem_ptr, elem_index_src);
2615726164 },
0 commit comments