authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-04 22:28:14+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-05 13:22:21+02:00
logf96748ebc19b0c083569e7677f65fe4454c32b57
tree8d77d29226a5033b37c2b2822b9d108189db70a7
parentf92e7bed7b6b83b2cdfe2bfed047e3a7bcdd2116

Sema: coerce elements of array cat

Closes #13347

2 files changed, 21 insertions(+), 2 deletions(-)

src/Sema.zig+10-2
...@@ -11995,10 +11995,18 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -11995,10 +11995,18 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
11995 const element_vals = try sema.arena.alloc(Value, final_len_including_sent);11995 const element_vals = try sema.arena.alloc(Value, final_len_including_sent);
11996 var elem_i: usize = 0;11996 var elem_i: usize = 0;
11997 while (elem_i < lhs_len) : (elem_i += 1) {11997 while (elem_i < lhs_len) : (elem_i += 1) {
11998 element_vals[elem_i] = try lhs_sub_val.elemValue(sema.mod, sema.arena, elem_i);11998 const elem_val = try lhs_sub_val.elemValue(sema.mod, sema.arena, elem_i);
11999 const elem_val_inst = try sema.addConstant(lhs_info.elem_type, elem_val);
12000 const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, .unneeded);
12001 const coereced_elem_val = try sema.resolveConstMaybeUndefVal(block, .unneeded, coerced_elem_val_inst, "");
12002 element_vals[elem_i] = coereced_elem_val;
11999 }12003 }
12000 while (elem_i < result_len) : (elem_i += 1) {12004 while (elem_i < result_len) : (elem_i += 1) {
12001 element_vals[elem_i] = try rhs_sub_val.elemValue(sema.mod, sema.arena, elem_i - lhs_len);12005 const elem_val = try rhs_sub_val.elemValue(sema.mod, sema.arena, elem_i - lhs_len);
12006 const elem_val_inst = try sema.addConstant(lhs_info.elem_type, elem_val);
12007 const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, .unneeded);
12008 const coereced_elem_val = try sema.resolveConstMaybeUndefVal(block, .unneeded, coerced_elem_val_inst, "");
12009 element_vals[elem_i] = coereced_elem_val;
12002 }12010 }
12003 if (res_sent_val) |sent_val| {12011 if (res_sent_val) |sent_val| {
12004 element_vals[result_len] = sent_val;12012 element_vals[result_len] = sent_val;
test/behavior/eval.zig+11
...@@ -1488,3 +1488,14 @@ test "x or true is comptime-known true" {...@@ -1488,3 +1488,14 @@ test "x or true is comptime-known true" {
1488 }1488 }
1489 try expect(T.x == 3);1489 try expect(T.x == 3);
1490}1490}
1491
1492test "non-optional and optional array elements concatenated" {
1493 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1494 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1495 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1496 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1497
1498 const array = [1]u8{'A'} ++ [1]?u8{null};
1499 var index: usize = 0;
1500 try expect(array[index].? == 'A');
1501}