Sema: add helpful notes to invalid @ptrCast operations

Closes #14474
This commit is contained in:
Veikka Tuominen 2023-01-27 16:03:51 +02:00
parent b129350cb5
commit a9785fe8ee
3 changed files with 20 additions and 1 deletions

View File

@ -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#}

View File

@ -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);

View File

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