| ... | @@ -24406,10 +24406,12 @@ fn zirMemset(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void | ... | @@ -24406,10 +24406,12 @@ fn zirMemset(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void |
| 24406 | }); | 24406 | }); |
| 24407 | }; | 24407 | }; |
| 24408 | | 24408 | |
| 24409 | const runtime_src = if (try sema.resolveDefinedValue(block, dest_src, dest_ptr)) |ptr_val| rs: { | 24409 | const elem = try sema.coerce(block, dest_elem_ty, uncoerced_elem, value_src); |
| | 24410 | |
| | 24411 | const runtime_src = rs: { |
| | 24412 | const ptr_val = try sema.resolveDefinedValue(block, dest_src, dest_ptr) orelse break :rs dest_src; |
| 24410 | const len_air_ref = try sema.fieldVal(block, src, dest_ptr, try ip.getOrPutString(gpa, "len"), dest_src); | 24413 | const len_air_ref = try sema.fieldVal(block, src, dest_ptr, try ip.getOrPutString(gpa, "len"), dest_src); |
| 24411 | const len_val = (try sema.resolveDefinedValue(block, dest_src, len_air_ref)) orelse | 24414 | const len_val = (try sema.resolveDefinedValue(block, dest_src, len_air_ref)) orelse break :rs dest_src; |
| 24412 | break :rs dest_src; | | |
| 24413 | const len_u64 = (try len_val.getUnsignedIntAdvanced(mod, sema)).?; | 24415 | const len_u64 = (try len_val.getUnsignedIntAdvanced(mod, sema)).?; |
| 24414 | const len = try sema.usizeCast(block, dest_src, len_u64); | 24416 | const len = try sema.usizeCast(block, dest_src, len_u64); |
| 24415 | if (len == 0) { | 24417 | if (len == 0) { |
| ... | @@ -24418,33 +24420,25 @@ fn zirMemset(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void | ... | @@ -24418,33 +24420,25 @@ fn zirMemset(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void |
| 24418 | } | 24420 | } |
| 24419 | | 24421 | |
| 24420 | if (!ptr_val.isComptimeMutablePtr(mod)) break :rs dest_src; | 24422 | if (!ptr_val.isComptimeMutablePtr(mod)) break :rs dest_src; |
| 24421 | if (try sema.resolveMaybeUndefVal(uncoerced_elem)) |_| { | 24423 | const elem_val = try sema.resolveMaybeUndefVal(elem) orelse break :rs value_src; |
| 24422 | for (0..len) |i| { | 24424 | const array_ty = try mod.arrayType(.{ |
| 24423 | const elem_index = try mod.intRef(Type.usize, i); | 24425 | .child = dest_elem_ty.toIntern(), |
| 24424 | const elem_ptr = try sema.elemPtrOneLayerOnly( | 24426 | .len = len_u64, |
| 24425 | block, | 24427 | }); |
| 24426 | src, | 24428 | const array_val = (try mod.intern(.{ .aggregate = .{ |
| 24427 | dest_ptr, | 24429 | .ty = array_ty.toIntern(), |
| 24428 | elem_index, | 24430 | .storage = .{ .repeated_elem = elem_val.toIntern() }, |
| 24429 | src, | 24431 | } })).toValue(); |
| 24430 | true, // init | 24432 | const array_ptr_ty = ty: { |
| 24431 | false, // oob_safety | 24433 | var info = dest_ptr_ty.ptrInfo(mod); |
| 24432 | ); | 24434 | info.flags.size = .One; |
| 24433 | try sema.storePtr2( | 24435 | info.child = array_ty.toIntern(); |
| 24434 | block, | 24436 | break :ty try mod.ptrType(info); |
| 24435 | src, | 24437 | }; |
| 24436 | elem_ptr, | 24438 | const raw_ptr_val = if (dest_ptr_ty.isSlice(mod)) ptr_val.slicePtr(mod) else ptr_val; |
| 24437 | dest_src, | 24439 | const array_ptr_val = try mod.getCoerced(raw_ptr_val, array_ptr_ty); |
| 24438 | uncoerced_elem, | 24440 | return sema.storePtrVal(block, src, array_ptr_val, array_val, array_ty); |
| 24439 | value_src, | 24441 | }; |
| 24440 | .store, | | |
| 24441 | ); | | |
| 24442 | } | | |
| 24443 | return; | | |
| 24444 | } else break :rs value_src; | | |
| 24445 | } else dest_src; | | |
| 24446 | | | |
| 24447 | const elem = try sema.coerce(block, dest_elem_ty, uncoerced_elem, value_src); | | |
| 24448 | | 24442 | |
| 24449 | try sema.requireRuntimeBlock(block, src, runtime_src); | 24443 | try sema.requireRuntimeBlock(block, src, runtime_src); |
| 24450 | _ = try block.addInst(.{ | 24444 | _ = try block.addInst(.{ |