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:
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'