Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Document raw pointer <-> usize casts. #970

Merged
merged 10 commits into from
May 17, 2021
12 changes: 12 additions & 0 deletions src/expressions/operator-expr.md
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,18 @@ Here `*T` means either `*const T` or `*mut T`.
* `char` casts to the value of the code point, then uses a numeric cast if needed.
* `u8` to `char` cast
* Casts to the `char` with the corresponding code point.
* Pointer to address cast
* Casting from a valid raw pointer to `usize` will produce the address that is pointed to.

The pointer's provenance is lost in this conversion.
* Address to pointer cast
* Casting from `usize` to a raw pointer will produce a raw pointer to the same location as the original pointer, if the `usize` was obtained through a pointer to address cast of a valid pointer.

<div class="warning">
Warning:
The two pointers are not equivalent.
Dereferencing the pointer obtained from the address to pointer cast may be <a href="../behavior-considered-undefined.md">undefined behavior</a> if aliasing rules are not followed.
RalfJung marked this conversation as resolved.
Show resolved Hide resolved
</div>

\* if integer-to-float casts with this rounding mode and overflow behavior are
not supported natively by the hardware, these casts will likely be slower than
Expand Down