diff options
| author | Ralf Jung <post@ralfj.de> | 2022-05-23 19:09:23 +0200 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2022-05-23 19:09:23 +0200 |
| commit | 5137d15f91d5778a0d037e5bc4f1f70d9b013aa7 (patch) | |
| tree | a0c5af697c81250417797d63371015a533b0938e /library/std/src/primitive_docs.rs | |
| parent | cec6dfcd67b2841e44248a070fd33895330bdfcf (diff) | |
| download | rust-5137d15f91d5778a0d037e5bc4f1f70d9b013aa7.tar.gz rust-5137d15f91d5778a0d037e5bc4f1f70d9b013aa7.zip | |
sync primitive_docs
Diffstat (limited to 'library/std/src/primitive_docs.rs')
| -rw-r--r-- | library/std/src/primitive_docs.rs | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/library/std/src/primitive_docs.rs b/library/std/src/primitive_docs.rs index ac4e668112b..147312b9720 100644 --- a/library/std/src/primitive_docs.rs +++ b/library/std/src/primitive_docs.rs @@ -1338,6 +1338,32 @@ mod prim_ref {} /// is a reference to the function-specific ZST. `&bar` is basically never what you /// want when `bar` is a function. /// +/// ### Casting to and from integers +/// +/// You cast function pointers directly to integers: +/// +/// ```rust +/// let fnptr: fn(i32) -> i32 = |x| x+2; +/// let fnptr_addr = fnptr as usize; +/// ``` +/// +/// However, a direct cast back is not possible. You need to use `transmute`: +/// +/// ```rust +/// # let fnptr: fn(i32) -> i32 = |x| x+2; +/// # let fnptr_addr = fnptr as usize; +/// let fnptr = fnptr_addr as *const (); +/// let fnptr: fn(i32) -> i32 = unsafe { std::mem::transmute(fnptr) }; +/// assert_eq!(fnptr(40), 42); +/// ``` +/// +/// Crucially, we `as`-cast to a raw pointer before `transmute`ing to a function pointer. +/// This avoids an integer-to-pointer `transmute`, which can be problematic. +/// Transmuting between raw pointers and function pointers (i.e., two pointer types) is fine. +/// +/// Note that all of this is not portable to platforms where function pointers and data pointers +/// have different sizes. +/// /// ### Traits /// /// Function pointers implement the following traits: |
