diff --git a/src/Sema.zig b/src/Sema.zig index f30b8fd16c..af240d43d1 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -17109,6 +17109,35 @@ fn resolvePeerTypes( } } + // *[N]T to [*]T + if (candidate_ty.ptrSize() == .Many and + chosen_ty_tag == .Pointer and + chosen_ty.ptrSize() == .One and + chosen_ty.childType().zigTypeTag() == .Array) + { + chosen = candidate; + chosen_i = candidate_i + 1; + + convert_to_slice = false; + + if (chosen_ty.childType().isConstPtr() and !candidate_ty.childType().isConstPtr()) + make_the_slice_const = true; + + continue; + } + + // *[N]T to [*]T (prev is many pointer) + if (candidate_ty.ptrSize() == .One and + candidate_ty.childType().zigTypeTag() == .Array and + chosen_ty_tag == .Pointer and + chosen_ty.ptrSize() == .Many) + { + if (candidate_ty.childType().isConstPtr() and !chosen_ty.childType().isConstPtr()) + make_the_slice_const = true; + + continue; + } + // *[N]T to []T (prev is slice) // *[N]T to E![]T if ((chosen_ty.isSlice() or (chosen_ty_tag == .ErrorUnion and chosen_ty.errorUnionPayload().isSlice())) and diff --git a/test/behavior/cast.zig b/test/behavior/cast.zig index 141cba35df..3d5b5bd4fb 100644 --- a/test/behavior/cast.zig +++ b/test/behavior/cast.zig @@ -643,6 +643,18 @@ test "peer cast *[0]T to []const T" { try expect(mem.eql(u8, "abcde", y)); } +test "peer cast *[N]T to [*]T" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + + var array = [4:99]i32{ 1, 2, 3, 4 }; + var dest: [*]i32 = undefined; + try expect(@TypeOf(&array, dest) == [*]i32); + try expect(@TypeOf(dest, &array) == [*]i32); +} + test "peer resolution of string literals" { if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO