motiejus/zig

fork of https://codeberg.org/ziglang/zig
git clone https://git.jakstys.lt/motiejus/zig.git
Log | Tree | Refs | README | LICENSE

commit 295b8ca467da36cd1066395e7f50b6245f456573 (tree)
parent 61236c2aa1610e0ce470bd64ba930a6430ad6de2
Author: kcbanner <kcbanner@gmail.com>
Date:   Mon, 24 Apr 2023 02:20:44 -0400

sema: add error for coercing a slice to an anyopaque pointer

Diffstat:
Msrc/Sema.zig | 15+++++++++++++++
Atest/cases/compile_errors/slice_to_anyopaque_pointer.zig | 13+++++++++++++
2 files changed, 28 insertions(+), 0 deletions(-)

diff --git a/src/Sema.zig b/src/Sema.zig @@ -25093,6 +25093,13 @@ fn coerceExtra( } }; break :pointer; } + if (inst_ty.isSlice()) { + in_memory_result = .{ .slice_to_anyopaque = .{ + .actual = inst_ty, + .wanted = dest_ty, + } }; + break :pointer; + } return sema.coerceCompatiblePtrs(block, dest_ty, inst, inst_src); } @@ -25603,6 +25610,7 @@ const InMemoryCoercionResult = union(enum) { ptr_bit_range: BitRange, ptr_alignment: IntPair, double_ptr_to_anyopaque: Pair, + slice_to_anyopaque: Pair, const Pair = struct { actual: Type, @@ -25901,6 +25909,13 @@ const InMemoryCoercionResult = union(enum) { }); break; }, + .slice_to_anyopaque => |pair| { + try sema.errNote(block, src, msg, "cannot implicitly cast slice '{}' to anyopaque pointer '{}'", .{ + pair.actual.fmt(sema.mod), pair.wanted.fmt(sema.mod), + }); + try sema.errNote(block, src, msg, "consider using '.ptr'", .{}); + break; + }, }; } }; diff --git a/test/cases/compile_errors/slice_to_anyopaque_pointer.zig b/test/cases/compile_errors/slice_to_anyopaque_pointer.zig @@ -0,0 +1,13 @@ +export fn entry() void { + const slice: []const u8 = "foo"; + const x = @as(*const anyopaque, slice); + _ = x; +} + +// error +// backend=stage2 +// target=native +// +// :3:37: error: expected type '*const anyopaque', found '[]const u8' +// :3:37: note: cannot implicitly cast slice '[]const u8' to anyopaque pointer '*const anyopaque' +// :3:37: note: consider using '.ptr'