From 295b8ca467da36cd1066395e7f50b6245f456573 Mon Sep 17 00:00:00 2001 From: kcbanner Date: Mon, 24 Apr 2023 02:20:44 -0400 Subject: [PATCH] sema: add error for coercing a slice to an anyopaque pointer --- src/Sema.zig | 15 +++++++++++++++ .../compile_errors/slice_to_anyopaque_pointer.zig | 13 +++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 test/cases/compile_errors/slice_to_anyopaque_pointer.zig diff --git a/src/Sema.zig b/src/Sema.zig index ed36417876..199bdc43ab 100644 --- 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 new file mode 100644 index 0000000000..d9ed634ef5 --- /dev/null +++ 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'