Commit a9785fe8ee

Veikka Tuominen <git@vexu.eu>
2023-01-27 15:03:51
Sema: add helpful notes to invalid `@ptrCast` operations
Closes #14474
1 parent b129350
Changed files (3)
doc/langref.html.in
@@ -8799,6 +8799,15 @@ pub const PrefetchOptions = struct {
       {#link|Optional Pointers#} are allowed. Casting an optional pointer which is {#link|null#}
       to a non-optional pointer invokes safety-checked {#link|Undefined Behavior#}.
       </p>
+      <p>
+      {#syntax#}@ptrCast{#endsyntax#} cannot be used for:
+      </p>
+      <ul>
+          <li>Removing {#syntax#}const{#endsyntax#} or {#syntax#}volatile{#endsyntax#} qualifier. TODO add a {#syntax#}@qualCast{#endsyntax#} builtin.</li>
+          <li>Changing pointer address space, use {#link|@addrSpaceCast#}</li>
+          <li>Increasing pointer alignment, use {#link|@alignCast#}</li>
+          <li>Casting a non-slice pointer to a slice, use slicing syntax {#syntax#}ptr[start..end]{#endsyntax#}</li>
+      </ul>
       {#header_close#}
 
       {#header_open|@ptrToInt#}
src/Sema.zig
@@ -19535,7 +19535,14 @@ fn zirPtrCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
         return sema.fail(block, src, "cast discards volatile qualifier", .{});
     }
     if (operand_info.@"addrspace" != dest_info.@"addrspace") {
-        return sema.fail(block, src, "cast changes pointer address space", .{});
+        const msg = msg: {
+            const msg = try sema.errMsg(block, src, "cast changes pointer address space", .{});
+            errdefer msg.destroy(sema.gpa);
+
+            try sema.errNote(block, src, msg, "consider using '@addrSpaceCast'", .{});
+            break :msg msg;
+        };
+        return sema.failWithOwnedErrorMsg(msg);
     }
 
     const dest_is_slice = dest_ty.isSlice();
@@ -19590,6 +19597,8 @@ fn zirPtrCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
             try sema.errNote(block, dest_ty_src, msg, "'{}' has alignment '{d}'", .{
                 dest_ty.fmt(sema.mod), dest_align,
             });
+
+            try sema.errNote(block, src, msg, "consider using '@alignCast'", .{});
             break :msg msg;
         };
         return sema.failWithOwnedErrorMsg(msg);
test/cases/compile_errors/increase_pointer_alignment_in_ptrCast.zig
@@ -11,3 +11,4 @@ export fn entry() u32 {
 // :3:17: error: cast increases pointer alignment
 // :3:32: note: '*u8' has alignment '1'
 // :3:26: note: '*u32' has alignment '4'
+// :3:17: note: consider using '@alignCast'