authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-12-29 23:34:46+00:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-12-31 09:55:03+00:00
log7e82398cfe94f99ea82270894f125d8547d5f1ad
treec37b2418157c45adb1111207f3dae1522ed3a0a7
parentd6120cf6a9a1d946f6754aa7de49c31b1fc8398e
signaturelock-open Commit is signed but in an unrecognized format.

Sema: remove some incorrect calls to `requireRuntimeBlock`

Most calls to `requireRuntimeBlock` in Sema are not correct. This function doesn't deal with all of them, but it does deal with ones which have, in combination with the past few commits, introduced real-world regressions. Related: #22353

1 files changed, 21 insertions(+), 55 deletions(-)

src/Sema.zig+21-55
...@@ -14626,7 +14626,7 @@ fn zirShl(...@@ -14626,7 +14626,7 @@ fn zirShl(
14626 }),14626 }),
14627 } },14627 } },
14628 });14628 });
14629 const ov_bit = try sema.tupleFieldValByIndex(block, src, op_ov, 1, op_ov_tuple_ty);14629 const ov_bit = try sema.tupleFieldValByIndex(block, op_ov, 1, op_ov_tuple_ty);
14630 const any_ov_bit = if (lhs_ty.zigTypeTag(zcu) == .vector)14630 const any_ov_bit = if (lhs_ty.zigTypeTag(zcu) == .vector)
14631 try block.addInst(.{14631 try block.addInst(.{
14632 .tag = if (block.float_mode == .optimized) .reduce_optimized else .reduce,14632 .tag = if (block.float_mode == .optimized) .reduce_optimized else .reduce,
...@@ -14641,7 +14641,7 @@ fn zirShl(...@@ -14641,7 +14641,7 @@ fn zirShl(
14641 const no_ov = try block.addBinOp(.cmp_eq, any_ov_bit, zero_ov);14641 const no_ov = try block.addBinOp(.cmp_eq, any_ov_bit, zero_ov);
1464214642
14643 try sema.addSafetyCheck(block, src, no_ov, .shl_overflow);14643 try sema.addSafetyCheck(block, src, no_ov, .shl_overflow);
14644 return sema.tupleFieldValByIndex(block, src, op_ov, 0, op_ov_tuple_ty);14644 return sema.tupleFieldValByIndex(block, op_ov, 0, op_ov_tuple_ty);
14645 }14645 }
14646 }14646 }
14647 return block.addBinOp(air_tag, lhs, new_rhs);14647 return block.addBinOp(air_tag, lhs, new_rhs);
...@@ -14969,20 +14969,12 @@ fn analyzeTupleCat(...@@ -14969,20 +14969,12 @@ fn analyzeTupleCat(
14969 const element_refs = try sema.arena.alloc(Air.Inst.Ref, final_len);14969 const element_refs = try sema.arena.alloc(Air.Inst.Ref, final_len);
14970 var i: u32 = 0;14970 var i: u32 = 0;
14971 while (i < lhs_len) : (i += 1) {14971 while (i < lhs_len) : (i += 1) {
14972 const operand_src = block.src(.{ .array_cat_lhs = .{14972 element_refs[i] = try sema.tupleFieldValByIndex(block, lhs, i, lhs_ty);
14973 .array_cat_offset = src_node,
14974 .elem_index = i,
14975 } });
14976 element_refs[i] = try sema.tupleFieldValByIndex(block, operand_src, lhs, i, lhs_ty);
14977 }14973 }
14978 i = 0;14974 i = 0;
14979 while (i < rhs_len) : (i += 1) {14975 while (i < rhs_len) : (i += 1) {
14980 const operand_src = block.src(.{ .array_cat_rhs = .{
14981 .array_cat_offset = src_node,
14982 .elem_index = i,
14983 } });
14984 element_refs[i + lhs_len] =14976 element_refs[i + lhs_len] =
14985 try sema.tupleFieldValByIndex(block, operand_src, rhs, i, rhs_ty);14977 try sema.tupleFieldValByIndex(block, rhs, i, rhs_ty);
14986 }14978 }
1498714979
14988 return block.addAggregateInit(Type.fromInterned(tuple_ty), element_refs);14980 return block.addAggregateInit(Type.fromInterned(tuple_ty), element_refs);
...@@ -15400,11 +15392,7 @@ fn analyzeTupleMul(...@@ -15400,11 +15392,7 @@ fn analyzeTupleMul(
15400 const element_refs = try sema.arena.alloc(Air.Inst.Ref, final_len);15392 const element_refs = try sema.arena.alloc(Air.Inst.Ref, final_len);
15401 var i: u32 = 0;15393 var i: u32 = 0;
15402 while (i < tuple_len) : (i += 1) {15394 while (i < tuple_len) : (i += 1) {
15403 const operand_src = block.src(.{ .array_cat_lhs = .{15395 element_refs[i] = try sema.tupleFieldValByIndex(block, operand, @intCast(i), operand_ty);
15404 .array_cat_offset = src_node,
15405 .elem_index = i,
15406 } });
15407 element_refs[i] = try sema.tupleFieldValByIndex(block, operand_src, operand, @intCast(i), operand_ty);
15408 }15396 }
15409 i = 1;15397 i = 1;
15410 while (i < factor) : (i += 1) {15398 while (i < factor) : (i += 1) {
...@@ -17502,7 +17490,7 @@ fn analyzeArithmetic(...@@ -17502,7 +17490,7 @@ fn analyzeArithmetic(
17502 }),17490 }),
17503 } },17491 } },
17504 });17492 });
17505 const ov_bit = try sema.tupleFieldValByIndex(block, src, op_ov, 1, op_ov_tuple_ty);17493 const ov_bit = try sema.tupleFieldValByIndex(block, op_ov, 1, op_ov_tuple_ty);
17506 const any_ov_bit = if (resolved_type.zigTypeTag(zcu) == .vector)17494 const any_ov_bit = if (resolved_type.zigTypeTag(zcu) == .vector)
17507 try block.addInst(.{17495 try block.addInst(.{
17508 .tag = if (block.float_mode == .optimized) .reduce_optimized else .reduce,17496 .tag = if (block.float_mode == .optimized) .reduce_optimized else .reduce,
...@@ -17517,7 +17505,7 @@ fn analyzeArithmetic(...@@ -17517,7 +17505,7 @@ fn analyzeArithmetic(
17517 const no_ov = try block.addBinOp(.cmp_eq, any_ov_bit, zero_ov);17505 const no_ov = try block.addBinOp(.cmp_eq, any_ov_bit, zero_ov);
1751817506
17519 try sema.addSafetyCheck(block, src, no_ov, .integer_overflow);17507 try sema.addSafetyCheck(block, src, no_ov, .integer_overflow);
17520 return sema.tupleFieldValByIndex(block, src, op_ov, 0, op_ov_tuple_ty);17508 return sema.tupleFieldValByIndex(block, op_ov, 0, op_ov_tuple_ty);
17521 }17509 }
17522 }17510 }
17523 }17511 }
...@@ -25725,7 +25713,7 @@ fn zirBuiltinCall(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError...@@ -25725,7 +25713,7 @@ fn zirBuiltinCall(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
2572525713
25726 const resolved_args: []Air.Inst.Ref = try sema.arena.alloc(Air.Inst.Ref, args_ty.structFieldCount(zcu));25714 const resolved_args: []Air.Inst.Ref = try sema.arena.alloc(Air.Inst.Ref, args_ty.structFieldCount(zcu));
25727 for (resolved_args, 0..) |*resolved, i| {25715 for (resolved_args, 0..) |*resolved, i| {
25728 resolved.* = try sema.tupleFieldValByIndex(block, args_src, args, @intCast(i), args_ty);25716 resolved.* = try sema.tupleFieldValByIndex(block, args, @intCast(i), args_ty);
25729 }25717 }
2573025718
25731 const callee_ty = sema.typeOf(func);25719 const callee_ty = sema.typeOf(func);
...@@ -28113,7 +28101,7 @@ fn fieldVal(...@@ -28113,7 +28101,7 @@ fn fieldVal(
28113 const field_ptr = try sema.structFieldPtr(block, src, object, field_name, field_name_src, inner_ty, false);28101 const field_ptr = try sema.structFieldPtr(block, src, object, field_name, field_name_src, inner_ty, false);
28114 return sema.analyzeLoad(block, src, field_ptr, object_src);28102 return sema.analyzeLoad(block, src, field_ptr, object_src);
28115 } else {28103 } else {
28116 return sema.structFieldVal(block, src, object, field_name, field_name_src, inner_ty);28104 return sema.structFieldVal(block, object, field_name, field_name_src, inner_ty);
28117 },28105 },
28118 .@"union" => if (is_pointer_to) {28106 .@"union" => if (is_pointer_to) {
28119 // Avoid loading the entire union by fetching a pointer and loading that28107 // Avoid loading the entire union by fetching a pointer and loading that
...@@ -28733,14 +28721,12 @@ fn structFieldPtrByIndex(...@@ -28733,14 +28721,12 @@ fn structFieldPtrByIndex(
28733 return Air.internedToRef(val);28721 return Air.internedToRef(val);
28734 }28722 }
2873528723
28736 try sema.requireRuntimeBlock(block, src, null);
28737 return block.addStructFieldPtr(struct_ptr, field_index, ptr_field_ty);28724 return block.addStructFieldPtr(struct_ptr, field_index, ptr_field_ty);
28738}28725}
2873928726
28740fn structFieldVal(28727fn structFieldVal(
28741 sema: *Sema,28728 sema: *Sema,
28742 block: *Block,28729 block: *Block,
28743 src: LazySrcLoc,
28744 struct_byval: Air.Inst.Ref,28730 struct_byval: Air.Inst.Ref,
28745 field_name: InternPool.NullTerminatedString,28731 field_name: InternPool.NullTerminatedString,
28746 field_name_src: LazySrcLoc,28732 field_name_src: LazySrcLoc,
...@@ -28776,12 +28762,11 @@ fn structFieldVal(...@@ -28776,12 +28762,11 @@ fn structFieldVal(
28776 return Air.internedToRef((try struct_val.fieldValue(pt, field_index)).toIntern());28762 return Air.internedToRef((try struct_val.fieldValue(pt, field_index)).toIntern());
28777 }28763 }
2877828764
28779 try sema.requireRuntimeBlock(block, src, null);
28780 try field_ty.resolveLayout(pt);28765 try field_ty.resolveLayout(pt);
28781 return block.addStructFieldVal(struct_byval, field_index, field_ty);28766 return block.addStructFieldVal(struct_byval, field_index, field_ty);
28782 },28767 },
28783 .tuple_type => {28768 .tuple_type => {
28784 return sema.tupleFieldVal(block, src, struct_byval, field_name, field_name_src, struct_ty);28769 return sema.tupleFieldVal(block, struct_byval, field_name, field_name_src, struct_ty);
28785 },28770 },
28786 else => unreachable,28771 else => unreachable,
28787 }28772 }
...@@ -28790,7 +28775,6 @@ fn structFieldVal(...@@ -28790,7 +28775,6 @@ fn structFieldVal(
28790fn tupleFieldVal(28775fn tupleFieldVal(
28791 sema: *Sema,28776 sema: *Sema,
28792 block: *Block,28777 block: *Block,
28793 src: LazySrcLoc,
28794 tuple_byval: Air.Inst.Ref,28778 tuple_byval: Air.Inst.Ref,
28795 field_name: InternPool.NullTerminatedString,28779 field_name: InternPool.NullTerminatedString,
28796 field_name_src: LazySrcLoc,28780 field_name_src: LazySrcLoc,
...@@ -28802,7 +28786,7 @@ fn tupleFieldVal(...@@ -28802,7 +28786,7 @@ fn tupleFieldVal(
28802 return pt.intRef(Type.usize, tuple_ty.structFieldCount(zcu));28786 return pt.intRef(Type.usize, tuple_ty.structFieldCount(zcu));
28803 }28787 }
28804 const field_index = try sema.tupleFieldIndex(block, tuple_ty, field_name, field_name_src);28788 const field_index = try sema.tupleFieldIndex(block, tuple_ty, field_name, field_name_src);
28805 return sema.tupleFieldValByIndex(block, src, tuple_byval, field_index, tuple_ty);28789 return sema.tupleFieldValByIndex(block, tuple_byval, field_index, tuple_ty);
28806}28790}
2880728791
28808/// Asserts that `field_name` is not "len".28792/// Asserts that `field_name` is not "len".
...@@ -28831,7 +28815,6 @@ fn tupleFieldIndex(...@@ -28831,7 +28815,6 @@ fn tupleFieldIndex(
28831fn tupleFieldValByIndex(28815fn tupleFieldValByIndex(
28832 sema: *Sema,28816 sema: *Sema,
28833 block: *Block,28817 block: *Block,
28834 src: LazySrcLoc,
28835 tuple_byval: Air.Inst.Ref,28818 tuple_byval: Air.Inst.Ref,
28836 field_index: u32,28819 field_index: u32,
28837 tuple_ty: Type,28820 tuple_ty: Type,
...@@ -28861,7 +28844,6 @@ fn tupleFieldValByIndex(...@@ -28861,7 +28844,6 @@ fn tupleFieldValByIndex(
28861 };28844 };
28862 }28845 }
2886328846
28864 try sema.requireRuntimeBlock(block, src, null);
28865 try field_ty.resolveLayout(pt);28847 try field_ty.resolveLayout(pt);
28866 return block.addStructFieldVal(tuple_byval, field_index, field_ty);28848 return block.addStructFieldVal(tuple_byval, field_index, field_ty);
28867}28849}
...@@ -28959,7 +28941,6 @@ fn unionFieldPtr(...@@ -28959,7 +28941,6 @@ fn unionFieldPtr(
28959 return Air.internedToRef(field_ptr_val.toIntern());28941 return Air.internedToRef(field_ptr_val.toIntern());
28960 }28942 }
2896128943
28962 try sema.requireRuntimeBlock(block, src, null);
28963 if (!initializing and union_obj.flagsUnordered(ip).layout == .auto and block.wantSafety() and28944 if (!initializing and union_obj.flagsUnordered(ip).layout == .auto and block.wantSafety() and
28964 union_ty.unionTagTypeSafety(zcu) != null and union_obj.field_types.len > 1)28945 union_ty.unionTagTypeSafety(zcu) != null and union_obj.field_types.len > 1)
28965 {28946 {
...@@ -29036,7 +29017,6 @@ fn unionFieldVal(...@@ -29036,7 +29017,6 @@ fn unionFieldVal(
29036 }29017 }
29037 }29018 }
2903829019
29039 try sema.requireRuntimeBlock(block, src, null);
29040 if (union_obj.flagsUnordered(ip).layout == .auto and block.wantSafety() and29020 if (union_obj.flagsUnordered(ip).layout == .auto and block.wantSafety() and
29041 union_ty.unionTagTypeSafety(zcu) != null and union_obj.field_types.len > 1)29021 union_ty.unionTagTypeSafety(zcu) != null and union_obj.field_types.len > 1)
29042 {29022 {
...@@ -29115,16 +29095,15 @@ fn elemPtrOneLayerOnly(...@@ -29115,16 +29095,15 @@ fn elemPtrOneLayerOnly(
29115 .Many, .C => {29095 .Many, .C => {
29116 const maybe_ptr_val = try sema.resolveDefinedValue(block, indexable_src, indexable);29096 const maybe_ptr_val = try sema.resolveDefinedValue(block, indexable_src, indexable);
29117 const maybe_index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index);29097 const maybe_index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index);
29118 const runtime_src = rs: {29098 ct: {
29119 const ptr_val = maybe_ptr_val orelse break :rs indexable_src;29099 const ptr_val = maybe_ptr_val orelse break :ct;
29120 const index_val = maybe_index_val orelse break :rs elem_index_src;29100 const index_val = maybe_index_val orelse break :ct;
29121 const index: usize = @intCast(try index_val.toUnsignedIntSema(pt));29101 const index: usize = @intCast(try index_val.toUnsignedIntSema(pt));
29122 const elem_ptr = try ptr_val.ptrElem(index, pt);29102 const elem_ptr = try ptr_val.ptrElem(index, pt);
29123 return Air.internedToRef(elem_ptr.toIntern());29103 return Air.internedToRef(elem_ptr.toIntern());
29124 };29104 }
29125 const result_ty = try indexable_ty.elemPtrType(null, pt);29105 const result_ty = try indexable_ty.elemPtrType(null, pt);
2912629106
29127 try sema.requireRuntimeBlock(block, src, runtime_src);
29128 return block.addPtrElemPtr(indexable, elem_index, result_ty);29107 return block.addPtrElemPtr(indexable, elem_index, result_ty);
29129 },29108 },
29130 .One => {29109 .One => {
...@@ -29172,22 +29151,19 @@ fn elemVal(...@@ -29172,22 +29151,19 @@ fn elemVal(
29172 const maybe_indexable_val = try sema.resolveDefinedValue(block, indexable_src, indexable);29151 const maybe_indexable_val = try sema.resolveDefinedValue(block, indexable_src, indexable);
29173 const maybe_index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index);29152 const maybe_index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index);
2917429153
29175 const runtime_src = rs: {29154 ct: {
29176 const indexable_val = maybe_indexable_val orelse break :rs indexable_src;29155 const indexable_val = maybe_indexable_val orelse break :ct;
29177 const index_val = maybe_index_val orelse break :rs elem_index_src;29156 const index_val = maybe_index_val orelse break :ct;
29178 const index: usize = @intCast(try index_val.toUnsignedIntSema(pt));29157 const index: usize = @intCast(try index_val.toUnsignedIntSema(pt));
29179 const elem_ty = indexable_ty.elemType2(zcu);29158 const elem_ty = indexable_ty.elemType2(zcu);
29180 const many_ptr_ty = try pt.manyConstPtrType(elem_ty);29159 const many_ptr_ty = try pt.manyConstPtrType(elem_ty);
29181 const many_ptr_val = try pt.getCoerced(indexable_val, many_ptr_ty);29160 const many_ptr_val = try pt.getCoerced(indexable_val, many_ptr_ty);
29182 const elem_ptr_ty = try pt.singleConstPtrType(elem_ty);29161 const elem_ptr_ty = try pt.singleConstPtrType(elem_ty);
29183 const elem_ptr_val = try many_ptr_val.ptrElem(index, pt);29162 const elem_ptr_val = try many_ptr_val.ptrElem(index, pt);
29184 if (try sema.pointerDeref(block, indexable_src, elem_ptr_val, elem_ptr_ty)) |elem_val| {29163 const elem_val = try sema.pointerDeref(block, indexable_src, elem_ptr_val, elem_ptr_ty) orelse break :ct;
29185 return Air.internedToRef((try pt.getCoerced(elem_val, elem_ty)).toIntern());29164 return Air.internedToRef((try pt.getCoerced(elem_val, elem_ty)).toIntern());
29186 }29165 }
29187 break :rs indexable_src;
29188 };
2918929166
29190 try sema.requireRuntimeBlock(block, src, runtime_src);
29191 return block.addBinOp(.ptr_elem_val, indexable, elem_index);29167 return block.addBinOp(.ptr_elem_val, indexable, elem_index);
29192 },29168 },
29193 .One => {29169 .One => {
...@@ -29300,7 +29276,6 @@ fn tupleFieldPtr(...@@ -29300,7 +29276,6 @@ fn tupleFieldPtr(
29300 try sema.validateRuntimeElemAccess(block, field_index_src, field_ty, tuple_ty, tuple_ptr_src);29276 try sema.validateRuntimeElemAccess(block, field_index_src, field_ty, tuple_ty, tuple_ptr_src);
29301 }29277 }
2930229278
29303 try sema.requireRuntimeBlock(block, tuple_ptr_src, null);
29304 return block.addStructFieldPtr(tuple_ptr, field_index, ptr_field_ty);29279 return block.addStructFieldPtr(tuple_ptr, field_index, ptr_field_ty);
29305}29280}
2930629281
...@@ -29343,7 +29318,6 @@ fn tupleField(...@@ -29343,7 +29318,6 @@ fn tupleField(
2934329318
29344 try sema.validateRuntimeElemAccess(block, field_index_src, field_ty, tuple_ty, tuple_src);29319 try sema.validateRuntimeElemAccess(block, field_index_src, field_ty, tuple_ty, tuple_src);
2934529320
29346 try sema.requireRuntimeBlock(block, tuple_src, null);
29347 try field_ty.resolveLayout(pt);29321 try field_ty.resolveLayout(pt);
29348 return block.addStructFieldVal(tuple, field_index, field_ty);29322 return block.addStructFieldVal(tuple, field_index, field_ty);
29349}29323}
...@@ -29399,7 +29373,6 @@ fn elemValArray(...@@ -29399,7 +29373,6 @@ fn elemValArray(
2939929373
29400 try sema.validateRuntimeElemAccess(block, elem_index_src, elem_ty, array_ty, array_src);29374 try sema.validateRuntimeElemAccess(block, elem_index_src, elem_ty, array_ty, array_src);
2940129375
29402 const runtime_src = if (maybe_undef_array_val != null) elem_index_src else array_src;
29403 if (oob_safety and block.wantSafety()) {29376 if (oob_safety and block.wantSafety()) {
29404 // Runtime check is only needed if unable to comptime check.29377 // Runtime check is only needed if unable to comptime check.
29405 if (maybe_index_val == null) {29378 if (maybe_index_val == null) {
...@@ -29412,7 +29385,6 @@ fn elemValArray(...@@ -29412,7 +29385,6 @@ fn elemValArray(
29412 if (try sema.typeHasOnePossibleValue(elem_ty)) |elem_val|29385 if (try sema.typeHasOnePossibleValue(elem_ty)) |elem_val|
29413 return Air.internedToRef(elem_val.toIntern());29386 return Air.internedToRef(elem_val.toIntern());
2941429387
29415 try sema.requireRuntimeBlock(block, src, runtime_src);
29416 return block.addBinOp(.array_elem_val, array, elem_index);29388 return block.addBinOp(.array_elem_val, array, elem_index);
29417}29389}
2941829390
...@@ -29466,9 +29438,6 @@ fn elemPtrArray(...@@ -29466,9 +29438,6 @@ fn elemPtrArray(
29466 try sema.validateRuntimeElemAccess(block, elem_index_src, array_ty.elemType2(zcu), array_ty, array_ptr_src);29438 try sema.validateRuntimeElemAccess(block, elem_index_src, array_ty.elemType2(zcu), array_ty, array_ptr_src);
29467 }29439 }
2946829440
29469 const runtime_src = if (maybe_undef_array_ptr_val != null) elem_index_src else array_ptr_src;
29470 try sema.requireRuntimeBlock(block, src, runtime_src);
29471
29472 // Runtime check is only needed if unable to comptime check.29441 // Runtime check is only needed if unable to comptime check.
29473 if (oob_safety and block.wantSafety() and offset == null) {29442 if (oob_safety and block.wantSafety() and offset == null) {
29474 const len_inst = try pt.intRef(Type.usize, array_len);29443 const len_inst = try pt.intRef(Type.usize, array_len);
...@@ -29525,7 +29494,6 @@ fn elemValSlice(...@@ -29525,7 +29494,6 @@ fn elemValSlice(
2952529494
29526 try sema.validateRuntimeElemAccess(block, elem_index_src, elem_ty, slice_ty, slice_src);29495 try sema.validateRuntimeElemAccess(block, elem_index_src, elem_ty, slice_ty, slice_src);
2952729496
29528 try sema.requireRuntimeBlock(block, src, runtime_src);
29529 if (oob_safety and block.wantSafety()) {29497 if (oob_safety and block.wantSafety()) {
29530 const len_inst = if (maybe_slice_val) |slice_val|29498 const len_inst = if (maybe_slice_val) |slice_val|
29531 try pt.intRef(Type.usize, try slice_val.sliceLen(pt))29499 try pt.intRef(Type.usize, try slice_val.sliceLen(pt))
...@@ -29582,8 +29550,6 @@ fn elemPtrSlice(...@@ -29582,8 +29550,6 @@ fn elemPtrSlice(
2958229550
29583 try sema.validateRuntimeElemAccess(block, elem_index_src, elem_ptr_ty, slice_ty, slice_src);29551 try sema.validateRuntimeElemAccess(block, elem_index_src, elem_ptr_ty, slice_ty, slice_src);
2958429552
29585 const runtime_src = if (maybe_undef_slice_val != null) elem_index_src else slice_src;
29586 try sema.requireRuntimeBlock(block, src, runtime_src);
29587 if (oob_safety and block.wantSafety()) {29553 if (oob_safety and block.wantSafety()) {
29588 const len_inst = len: {29554 const len_inst = len: {
29589 if (maybe_undef_slice_val) |slice_val|29555 if (maybe_undef_slice_val) |slice_val|