mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 05:44:20 +00:00
Sema: correct sentinel check on implicit cast from array ptr
Closes #12938
This commit is contained in:
parent
3de5c3b503
commit
581df942e1
2 changed files with 54 additions and 13 deletions
44
src/Sema.zig
44
src/Sema.zig
|
|
@ -23014,9 +23014,37 @@ fn coerceExtra(
|
|||
const dest_is_mut = dest_info.mutable;
|
||||
|
||||
const dst_elem_type = dest_info.pointee_type;
|
||||
switch (try sema.coerceInMemoryAllowed(block, dst_elem_type, array_elem_type, dest_is_mut, target, dest_ty_src, inst_src)) {
|
||||
const elem_res = try sema.coerceInMemoryAllowed(block, dst_elem_type, array_elem_type, dest_is_mut, target, dest_ty_src, inst_src);
|
||||
switch (elem_res) {
|
||||
.ok => {},
|
||||
else => break :src_array_ptr,
|
||||
else => {
|
||||
in_memory_result = .{ .ptr_child = .{
|
||||
.child = try elem_res.dupe(sema.arena),
|
||||
.actual = array_elem_type,
|
||||
.wanted = dst_elem_type,
|
||||
} };
|
||||
break :src_array_ptr;
|
||||
},
|
||||
}
|
||||
|
||||
if (dest_info.sentinel) |dest_sent| {
|
||||
if (array_ty.sentinel()) |inst_sent| {
|
||||
if (!dest_sent.eql(inst_sent, dst_elem_type, sema.mod)) {
|
||||
in_memory_result = .{ .ptr_sentinel = .{
|
||||
.actual = inst_sent,
|
||||
.wanted = dest_sent,
|
||||
.ty = dst_elem_type,
|
||||
} };
|
||||
break :src_array_ptr;
|
||||
}
|
||||
} else {
|
||||
in_memory_result = .{ .ptr_sentinel = .{
|
||||
.actual = Value.initTag(.unreachable_value),
|
||||
.wanted = dest_sent,
|
||||
.ty = dst_elem_type,
|
||||
} };
|
||||
break :src_array_ptr;
|
||||
}
|
||||
}
|
||||
|
||||
switch (dest_info.size) {
|
||||
|
|
@ -23030,17 +23058,7 @@ fn coerceExtra(
|
|||
},
|
||||
.Many => {
|
||||
// *[N]T to [*]T
|
||||
// *[N:s]T to [*:s]T
|
||||
// *[N:s]T to [*]T
|
||||
if (dest_info.sentinel) |dst_sentinel| {
|
||||
if (array_ty.sentinel()) |src_sentinel| {
|
||||
if (src_sentinel.eql(dst_sentinel, dst_elem_type, sema.mod)) {
|
||||
return sema.coerceCompatiblePtrs(block, dest_ty, inst, inst_src);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return sema.coerceCompatiblePtrs(block, dest_ty, inst, inst_src);
|
||||
}
|
||||
return sema.coerceCompatiblePtrs(block, dest_ty, inst, inst_src);
|
||||
},
|
||||
.One => {},
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
fn foo() [:0xff]const u8 {
|
||||
return "bark";
|
||||
}
|
||||
fn bar() [:0]const u16 {
|
||||
return "bark";
|
||||
}
|
||||
pub export fn entry() void {
|
||||
_ = foo();
|
||||
}
|
||||
pub export fn entry1() void {
|
||||
_ = bar();
|
||||
}
|
||||
|
||||
// error
|
||||
// backend=stage2
|
||||
// target=native
|
||||
//
|
||||
// :2:12: error: expected type '[:255]const u8', found '*const [4:0]u8'
|
||||
// :2:12: note: pointer sentinel '0' cannot cast into pointer sentinel '255'
|
||||
// :1:10: note: function return type declared here
|
||||
// :5:12: error: expected type '[:0]const u16', found '*const [4:0]u8'
|
||||
// :5:12: note: pointer type child 'u8' cannot cast into pointer type child 'u16'
|
||||
// :4:10: note: function return type declared here
|
||||
Loading…
Add table
Reference in a new issue