Commit 5322459a0b

mlugg <mlugg@mlugg.co.uk>
2025-01-13 00:34:42
Sema: fix UB in error reporting
And add test coverage for the compile error in question.
1 parent 27274d4
Changed files (2)
src
test
cases
src/Sema.zig
@@ -23353,7 +23353,7 @@ fn ptrCastFull(
             if (src_info.flags.size == .C) break :check_size;
             if (dest_info.flags.size == .C) break :check_size;
             return sema.failWithOwnedErrorMsg(block, msg: {
-                const msg = try sema.errMsg(src, "cannot implicitly convert {s} pointer to {s} pointer", .{
+                const msg = try sema.errMsg(src, "cannot implicitly convert {s} to {s}", .{
                     pointerSizeString(src_info.flags.size),
                     pointerSizeString(dest_info.flags.size),
                 });
@@ -30145,7 +30145,7 @@ const InMemoryCoercionResult = union(enum) {
                 break;
             },
             .ptr_size => |size| {
-                try sema.errNote(src, msg, "a {s} pointer cannot cast into a {s} pointer", .{ pointerSizeString(size.actual), pointerSizeString(size.wanted) });
+                try sema.errNote(src, msg, "a {s} cannot cast into a {s}", .{ pointerSizeString(size.actual), pointerSizeString(size.wanted) });
                 break;
             },
             .ptr_allowzero => |pair| {
@@ -30224,10 +30224,10 @@ const InMemoryCoercionResult = union(enum) {
 
 fn pointerSizeString(size: std.builtin.Type.Pointer.Size) []const u8 {
     return switch (size) {
-        .One => "single",
-        .Many => "many",
-        .C => "C",
-        .Slice => unreachable,
+        .One => "single pointer",
+        .Many => "many pointer",
+        .C => "C pointer",
+        .Slice => "slice",
     };
 }
 
test/cases/compile_errors/invalid_pointer_cast.zig
@@ -0,0 +1,10 @@
+export fn foo() void {
+    const slice: []const u8 = &.{ 1, 2, 3 };
+    const result: [*]const u8 = @alignCast(slice);
+    _ = result;
+}
+
+// error
+//
+// :3:33: error: cannot implicitly convert slice to many pointer
+// :3:33: note: use 'ptr' field to convert slice to many pointer