mirror of
https://github.com/ziglang/zig.git
synced 2026-02-13 12:59:04 +00:00
stage2: peer resolve *T to [*c]T
This commit is contained in:
parent
c9ee3c1e47
commit
26be5bb8b1
20
src/Sema.zig
20
src/Sema.zig
@ -18280,6 +18280,17 @@ fn resolvePeerTypes(
|
||||
},
|
||||
.Pointer => {
|
||||
if (candidate_ty.ptrSize() == .C) {
|
||||
// *T to [*c]T
|
||||
if (chosen_ty_tag == .Pointer) {
|
||||
const chosen_elem_ty = chosen_ty.childType();
|
||||
const candidate_elem_ty = candidate_ty.childType();
|
||||
if ((try sema.coerceInMemoryAllowed(block, chosen_elem_ty, candidate_elem_ty, false, target, src, src)) == .ok) {
|
||||
chosen = candidate;
|
||||
chosen_i = candidate_i + 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (chosen_ty_tag == .Int or chosen_ty_tag == .ComptimeInt) {
|
||||
chosen = candidate;
|
||||
chosen_i = candidate_i + 1;
|
||||
@ -18290,6 +18301,15 @@ fn resolvePeerTypes(
|
||||
}
|
||||
}
|
||||
|
||||
// [*c]T and *T
|
||||
if (chosen_ty_tag == .Pointer and chosen_ty.ptrSize() == .C) {
|
||||
const chosen_elem_ty = chosen_ty.childType();
|
||||
const candidate_elem_ty = candidate_ty.childType();
|
||||
if ((try sema.coerceInMemoryAllowed(block, chosen_elem_ty, candidate_elem_ty, false, target, src, src)) == .ok) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// *[N]T to [*]T
|
||||
if (candidate_ty.ptrSize() == .Many and
|
||||
chosen_ty_tag == .Pointer and
|
||||
|
||||
@ -128,7 +128,11 @@ fn testDerefPtrOneVal() !void {
|
||||
}
|
||||
|
||||
test "peer type resolution with C pointers" {
|
||||
if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
|
||||
var ptr_one: *u8 = undefined;
|
||||
var ptr_many: [*]u8 = undefined;
|
||||
@ -159,7 +163,11 @@ test "implicit casting between C pointer and optional non-C pointer" {
|
||||
}
|
||||
|
||||
test "implicit cast error unions with non-optional to optional pointer" {
|
||||
if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
@ -376,7 +384,11 @@ test "pointer arithmetic affects the alignment" {
|
||||
}
|
||||
|
||||
test "@ptrToInt on null optional at comptime" {
|
||||
if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
|
||||
{
|
||||
const pointer = @intToPtr(?*u8, 0x000);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user