zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit f96748ebc19b0c083569e7677f65fe4454c32b57 (tree)
parent f92e7bed7b6b83b2cdfe2bfed047e3a7bcdd2116
Author: Veikka Tuominen <git@vexu.eu>
Date:   Fri,  4 Nov 2022 22:28:14 +0200

Sema: coerce elements of array cat

Closes #13347

Diffstat:
Msrc/Sema.zig | 12++++++++++--
Mtest/behavior/eval.zig | 11+++++++++++
2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/Sema.zig b/src/Sema.zig @@ -11995,10 +11995,18 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai const element_vals = try sema.arena.alloc(Value, final_len_including_sent); var elem_i: usize = 0; while (elem_i < lhs_len) : (elem_i += 1) { - element_vals[elem_i] = try lhs_sub_val.elemValue(sema.mod, sema.arena, elem_i); + const elem_val = try lhs_sub_val.elemValue(sema.mod, sema.arena, elem_i); + const elem_val_inst = try sema.addConstant(lhs_info.elem_type, elem_val); + const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, .unneeded); + const coereced_elem_val = try sema.resolveConstMaybeUndefVal(block, .unneeded, coerced_elem_val_inst, ""); + element_vals[elem_i] = coereced_elem_val; } while (elem_i < result_len) : (elem_i += 1) { - element_vals[elem_i] = try rhs_sub_val.elemValue(sema.mod, sema.arena, elem_i - lhs_len); + const elem_val = try rhs_sub_val.elemValue(sema.mod, sema.arena, elem_i - lhs_len); + const elem_val_inst = try sema.addConstant(lhs_info.elem_type, elem_val); + const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, .unneeded); + const coereced_elem_val = try sema.resolveConstMaybeUndefVal(block, .unneeded, coerced_elem_val_inst, ""); + element_vals[elem_i] = coereced_elem_val; } if (res_sent_val) |sent_val| { element_vals[result_len] = sent_val; diff --git a/test/behavior/eval.zig b/test/behavior/eval.zig @@ -1488,3 +1488,14 @@ test "x or true is comptime-known true" { } try expect(T.x == 3); } + +test "non-optional and optional array elements concatenated" { + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + + const array = [1]u8{'A'} ++ [1]?u8{null}; + var index: usize = 0; + try expect(array[index].? == 'A'); +}