| ... | ... | @@ -6189,16 +6189,22 @@ fn zirArrayMul(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr |
| 6189 | 6189 | try Type.Tag.array.create(anon_decl.arena(), .{ .len = final_len, .elem_type = mulinfo.elem_type }); |
| 6190 | 6190 | const buf = try anon_decl.arena().alloc(Value, final_len); |
| 6191 | 6191 | |
| 6192 | | // the actual loop |
| 6193 | | var i: u64 = 0; |
| 6194 | | while (i < tomulby) : (i += 1) { |
| 6195 | | var j: u64 = 0; |
| 6196 | | while (j < mulinfo.len) : (j += 1) { |
| 6197 | | const val = try lhs_sub_val.elemValue(sema.arena, j); |
| 6198 | | buf[mulinfo.len * i + j] = try val.copy(anon_decl.arena()); |
| 6192 | // handles the optimisation where arr.len == 0 : [_]T { X } ** N |
| 6193 | const val = if (mulinfo.len == 1) blk: { |
| 6194 | const copied_val = try (try lhs_sub_val.elemValue(sema.arena, 0)).copy(anon_decl.arena()); |
| 6195 | break :blk try Value.Tag.repeated.create(anon_decl.arena(), copied_val); |
| 6196 | } else blk: { |
| 6197 | // the actual loop |
| 6198 | var i: u64 = 0; |
| 6199 | while (i < tomulby) : (i += 1) { |
| 6200 | var j: u64 = 0; |
| 6201 | while (j < mulinfo.len) : (j += 1) { |
| 6202 | const val = try lhs_sub_val.elemValue(sema.arena, j); |
| 6203 | buf[mulinfo.len * i + j] = try val.copy(anon_decl.arena()); |
| 6204 | } |
| 6199 | 6205 | } |
| 6200 | | } |
| 6201 | | const val = try Value.Tag.array.create(anon_decl.arena(), buf); |
| 6206 | break :blk try Value.Tag.array.create(anon_decl.arena(), buf); |
| 6207 | }; |
| 6202 | 6208 | if (lhs_ty.zigTypeTag() == .Pointer) { |
| 6203 | 6209 | return sema.analyzeDeclRef(try anon_decl.finish(final_ty, val)); |
| 6204 | 6210 | } else { |