Skip to content

Commit 32c79ce

Browse files
Coerce array types
1 parent 5540178 commit 32c79ce

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

src/analysis.zig

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6595,8 +6595,16 @@ fn resolvePeerTypesInner(analyser: *Analyser, peer_tys: []?Type) !?Type {
65956595
}
65966596

65976597
const peer_elem_ty = arr_info.elem_ty.*;
6598-
if (!peer_elem_ty.eql(cur_elem_ty)) {
6599-
// TODO: check if coercible
6598+
if (!peer_elem_ty.eql(cur_elem_ty)) coerce: {
6599+
if (try analyser.coerceInMemoryAllowed(cur_elem_ty, peer_elem_ty, false)) {
6600+
break :coerce;
6601+
}
6602+
6603+
if (try analyser.coerceInMemoryAllowed(peer_elem_ty, cur_elem_ty, false)) {
6604+
elem_ty = peer_elem_ty;
6605+
break :coerce;
6606+
}
6607+
66006608
return null;
66016609
}
66026610

tests/analysis/peer_type_resolution.zig

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,14 @@ pub fn main() !void {
246246
_ = noreturn_1;
247247
// ^^^^^^^^^^ (S)()
248248

249+
const array_coerce_0 = if (runtime_bool) [2]error{A}{ error.A, error.A } else [2]error{ A, B }{ error.A, error.B };
250+
_ = array_coerce_0;
251+
// ^^^^^^^^^^^^^^ ([2]error{A,B})()
252+
253+
const array_coerce_1 = if (runtime_bool) [2]error{ A, B }{ error.A, error.B } else [2]error{A}{ error.A, error.A };
254+
_ = array_coerce_1;
255+
// ^^^^^^^^^^^^^^ ([2]error{A,B})()
256+
249257
const FnCoerce = struct {
250258
fn errorsA() [2]error{A} {
251259
return .{ error.A, error.A };

0 commit comments

Comments
 (0)