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(...@@ -14014,6 +14014,23 @@ fn coerce(
14014 const addr = try sema.coerce(block, ptr_size_ty, inst, inst_src);14014 const addr = try sema.coerce(block, ptr_size_ty, inst, inst_src);
14015 return sema.coerceCompatiblePtrs(block, dest_ty, addr, inst_src);14015 return sema.coerceCompatiblePtrs(block, dest_ty, addr, inst_src);
14016 },14016 },
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 },
14017 else => {},14034 else => {},
14018 }14035 }
14019 }14036 }
test/behavior/cast.zig+12-1
...@@ -316,7 +316,8 @@ test "cast from ?[*]T to ??[*]T" {...@@ -316,7 +316,8 @@ test "cast from ?[*]T to ??[*]T" {
316}316}
317317
318test "peer type unsigned int to signed" {318test "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
321 var w: u31 = 5;322 var w: u31 = 5;
322 var x: u8 = 7;323 var x: u8 = 7;
...@@ -325,3 +326,13 @@ test "peer type unsigned int to signed" {...@@ -325,3 +326,13 @@ test "peer type unsigned int to signed" {
325 comptime try expect(@TypeOf(a) == i32);326 comptime try expect(@TypeOf(a) == i32);
326 try expect(a == 7);327 try expect(a == 7);
327}328}
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}