| ... | ... | @@ -13560,13 +13560,23 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13560 | 13560 | |
| 13561 | 13561 | const lhs_len = try sema.usizeCast(block, lhs_src, lhs_info.len); |
| 13562 | 13562 | const rhs_len = try sema.usizeCast(block, rhs_src, rhs_info.len); |
| 13563 | | const result_len = std.math.add(usize, lhs_len, rhs_len) catch |err| switch (err) { |
| 13564 | | error.Overflow => return sema.fail( |
| 13563 | const result_len, const result_len_with_sent = blk: { |
| 13564 | if (std.math.add(usize, lhs_len, rhs_len)) |result_len| { |
| 13565 | const sent_len = @intFromBool(res_sent_val != null); |
| 13566 | if (std.math.add(usize, result_len, sent_len)) |with_sent| { |
| 13567 | break :blk .{ result_len, with_sent }; |
| 13568 | } else |err| switch (err) { |
| 13569 | error.Overflow => {}, |
| 13570 | } |
| 13571 | } else |err| switch (err) { |
| 13572 | error.Overflow => {}, |
| 13573 | } |
| 13574 | return sema.fail( |
| 13565 | 13575 | block, |
| 13566 | 13576 | src, |
| 13567 | 13577 | "concatenating arrays of length {d} and {d} produces an array too large for this compiler implementation to handle", |
| 13568 | 13578 | .{ lhs_len, rhs_len }, |
| 13569 | | ), |
| 13579 | ); |
| 13570 | 13580 | }; |
| 13571 | 13581 | |
| 13572 | 13582 | const result_ty = try pt.arrayType(.{ |
| ... | ... | @@ -13604,7 +13614,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13604 | 13614 | else |
| 13605 | 13615 | rhs_val; |
| 13606 | 13616 | |
| 13607 | | const element_vals = try sema.arena.alloc(InternPool.Index, result_len); |
| 13617 | const element_vals = try sema.arena.alloc(InternPool.Index, result_len_with_sent); |
| 13608 | 13618 | var elem_i: u32 = 0; |
| 13609 | 13619 | while (elem_i < lhs_len) : (elem_i += 1) { |
| 13610 | 13620 | const lhs_elem_i = elem_i; |
| ... | ... | @@ -13632,6 +13642,9 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13632 | 13642 | const coerced_elem_val = sema.resolveValue(coerced_elem_val_inst).?; |
| 13633 | 13643 | element_vals[elem_i] = coerced_elem_val.toIntern(); |
| 13634 | 13644 | } |
| 13645 | if (res_sent_val) |v| { |
| 13646 | element_vals[result_len] = v.toIntern(); |
| 13647 | } |
| 13635 | 13648 | return sema.addConstantMaybeRef( |
| 13636 | 13649 | try pt.aggregateValue(result_ty, element_vals), |
| 13637 | 13650 | ptr_addrspace != null, |