authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-01-25 14:53:41-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-01-25 14:53:41-07:00
logef7eff393912cae322fbc755536bc060c0166b94
treea9c6d4ca180644cb85a048673c7583708d6e4b69
parentf2835c6a286c9e6bb033cbf04a2ed3463e206bf3

Sema: coercion of pointers to C pointers


2 files changed, 29 insertions(+), 1 deletions(-)

src/Sema.zig+17
......@@ -14014,6 +14014,23 @@ fn coerce(
1401414014 const addr = try sema.coerce(block, ptr_size_ty, inst, inst_src);
1401514015 return sema.coerceCompatiblePtrs(block, dest_ty, addr, inst_src);
1401614016 },
14017 .Pointer => p: {
14018 const inst_info = inst_ty.ptrInfo().data;
14019 if (inst_info.size == .Slice) break :p;
14020 switch (try sema.coerceInMemoryAllowed(
14021 block,
14022 dest_info.pointee_type,
14023 inst_info.pointee_type,
14024 dest_info.mutable,
14025 target,
14026 dest_ty_src,
14027 inst_src,
14028 )) {
14029 .ok => {},
14030 .no_match => break :p,
14031 }
14032 return sema.coerceCompatiblePtrs(block, dest_ty, inst, inst_src);
14033 },
1401714034 else => {},
1401814035 }
1401914036 }
test/behavior/cast.zig+12-1
......@@ -316,7 +316,8 @@ test "cast from ?[*]T to ??[*]T" {
316316}
317317
318318test "peer type unsigned int to signed" {
319 if (builtin.zig_backend == .stage2_x86_64 or builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
319 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
320 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
320321
321322 var w: u31 = 5;
322323 var x: u8 = 7;
......@@ -325,3 +326,13 @@ test "peer type unsigned int to signed" {
325326 comptime try expect(@TypeOf(a) == i32);
326327 try expect(a == 7);
327328}
329
330test "expected [*c]const u8, found [*:0]const u8" {
331 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
332 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
333
334 var a: [*:0]const u8 = "hello";
335 var b: [*c]const u8 = a;
336 var c: [*:0]const u8 = b;
337 try expect(std.mem.eql(u8, c[0..5], "hello"));
338}