From ec6ffaa1e47388a59035277dafbe3d9999a80fca Mon Sep 17 00:00:00 2001 From: kcbanner Date: Thu, 27 Apr 2023 21:42:32 -0400 Subject: [PATCH] sema: improve the error message when coercing to []anyopaque --- src/Sema.zig | 3 ++- .../double_pointer_to_anyopaque_pointer.zig | 7 +++++++ .../compile_errors/pointer_to_anyopaque_slice.zig | 11 +++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 test/cases/compile_errors/pointer_to_anyopaque_slice.zig diff --git a/src/Sema.zig b/src/Sema.zig index 8593edf6cc..71a1215dcd 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -25335,7 +25335,7 @@ fn coerceExtra( // cast from *T and [*]T to *anyopaque // but don't do it if the source type is a double pointer - if (dest_info.pointee_type.tag() == .anyopaque and inst_ty.zigTypeTag() == .Pointer) { + if (dest_info.pointee_type.tag() == .anyopaque and inst_ty.zigTypeTag() == .Pointer) to_anyopaque: { if (!sema.checkPtrAttributes(dest_ty, inst_ty, &in_memory_result)) break :pointer; const elem_ty = inst_ty.elemType2(); if (elem_ty.zigTypeTag() == .Pointer or elem_ty.isPtrLikeOptional()) { @@ -25345,6 +25345,7 @@ fn coerceExtra( } }; break :pointer; } + if (dest_ty.isSlice()) break :to_anyopaque; if (inst_ty.isSlice()) { in_memory_result = .{ .slice_to_anyopaque = .{ .actual = inst_ty, diff --git a/test/cases/compile_errors/double_pointer_to_anyopaque_pointer.zig b/test/cases/compile_errors/double_pointer_to_anyopaque_pointer.zig index c7e54738d1..c695b7393d 100644 --- a/test/cases/compile_errors/double_pointer_to_anyopaque_pointer.zig +++ b/test/cases/compile_errors/double_pointer_to_anyopaque_pointer.zig @@ -15,6 +15,11 @@ pub export fn entry3() void { const ptr: *const anyopaque = x; _ = ptr; } +export fn entry4() void { + var a: []*u32 = undefined; + var b: []anyopaque = undefined; + b = a; +} // error // backend=stage2 @@ -27,3 +32,5 @@ pub export fn entry3() void { // :11:12: note: parameter type declared here // :15:35: error: expected type '*const anyopaque', found '*?*usize' // :15:35: note: cannot implicitly cast double pointer '*?*usize' to anyopaque pointer '*const anyopaque' +// :21:9: error: expected type '[]anyopaque', found '[]*u32' +// :21:9: note: cannot implicitly cast double pointer '[]*u32' to anyopaque pointer '[]anyopaque' diff --git a/test/cases/compile_errors/pointer_to_anyopaque_slice.zig b/test/cases/compile_errors/pointer_to_anyopaque_slice.zig new file mode 100644 index 0000000000..2c7334bedb --- /dev/null +++ b/test/cases/compile_errors/pointer_to_anyopaque_slice.zig @@ -0,0 +1,11 @@ +export fn x() void { + var a: *u32 = undefined; + var b: []anyopaque = undefined; + b = a; +} + +// error +// backend=stage2 +// target=native +// +// :4:9: error: expected type '[]anyopaque', found '*u32'