authorgravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2023-04-27 21:42:32-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-04-30 16:40:06-07:00
logec6ffaa1e47388a59035277dafbe3d9999a80fca
tree1680beba27c825cb980bce9b53a545e727b75627
parent1b432072b5ae6a70a00464b48b7ebf8610293fc3

sema: improve the error message when coercing to []anyopaque


3 files changed, 20 insertions(+), 1 deletions(-)

src/Sema.zig+2-1
......@@ -25335,7 +25335,7 @@ fn coerceExtra(
2533525335
2533625336 // cast from *T and [*]T to *anyopaque
2533725337 // but don't do it if the source type is a double pointer
25338 if (dest_info.pointee_type.tag() == .anyopaque and inst_ty.zigTypeTag() == .Pointer) {
25338 if (dest_info.pointee_type.tag() == .anyopaque and inst_ty.zigTypeTag() == .Pointer) to_anyopaque: {
2533925339 if (!sema.checkPtrAttributes(dest_ty, inst_ty, &in_memory_result)) break :pointer;
2534025340 const elem_ty = inst_ty.elemType2();
2534125341 if (elem_ty.zigTypeTag() == .Pointer or elem_ty.isPtrLikeOptional()) {
......@@ -25345,6 +25345,7 @@ fn coerceExtra(
2534525345 } };
2534625346 break :pointer;
2534725347 }
25348 if (dest_ty.isSlice()) break :to_anyopaque;
2534825349 if (inst_ty.isSlice()) {
2534925350 in_memory_result = .{ .slice_to_anyopaque = .{
2535025351 .actual = inst_ty,
test/cases/compile_errors/double_pointer_to_anyopaque_pointer.zig+7
......@@ -15,6 +15,11 @@ pub export fn entry3() void {
1515 const ptr: *const anyopaque = x;
1616 _ = ptr;
1717}
18export fn entry4() void {
19 var a: []*u32 = undefined;
20 var b: []anyopaque = undefined;
21 b = a;
22}
1823
1924// error
2025// backend=stage2
......@@ -27,3 +32,5 @@ pub export fn entry3() void {
2732// :11:12: note: parameter type declared here
2833// :15:35: error: expected type '*const anyopaque', found '*?*usize'
2934// :15:35: note: cannot implicitly cast double pointer '*?*usize' to anyopaque pointer '*const anyopaque'
35// :21:9: error: expected type '[]anyopaque', found '[]*u32'
36// :21:9: note: cannot implicitly cast double pointer '[]*u32' to anyopaque pointer '[]anyopaque'
test/cases/compile_errors/pointer_to_anyopaque_slice.zig created+11
......@@ -0,0 +1,11 @@
1export fn x() void {
2 var a: *u32 = undefined;
3 var b: []anyopaque = undefined;
4 b = a;
5}
6
7// error
8// backend=stage2
9// target=native
10//
11// :4:9: error: expected type '[]anyopaque', found '*u32'