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