Improve the function pointer docs
* Reduce duplicate impls; show only the `fn (T)` and include a sentence saying that there exists up to twelve of them. * Show `Copy` and `Clone`. * Show auto traits like `Send` and `Sync`, and blanket impls like `Any`.
This commit is contained in:
parent
1169832f2f
commit
5271e32c46
12 changed files with 222 additions and 69 deletions
|
@ -1441,11 +1441,16 @@ mod prim_ref {}
|
|||
/// Note that all of this is not portable to platforms where function pointers and data pointers
|
||||
/// have different sizes.
|
||||
///
|
||||
/// ### Traits
|
||||
/// ### Trait implementations
|
||||
///
|
||||
/// Function pointers implement the following traits:
|
||||
/// In this documentation the shorthand `fn (T₁, T₂, …, Tₙ)` is used to represent non-variadic
|
||||
/// function pointers of varying length. Note that this is a convenience notation to avoid
|
||||
/// repetitive documentation, not valid Rust syntax.
|
||||
///
|
||||
/// Due to a temporary restriction in Rust's type system, these traits are only implemented on
|
||||
/// functions that take 12 arguments or less, with the `"Rust"` and `"C"` ABIs. In the future, this
|
||||
/// may change:
|
||||
///
|
||||
/// * [`Clone`]
|
||||
/// * [`PartialEq`]
|
||||
/// * [`Eq`]
|
||||
/// * [`PartialOrd`]
|
||||
|
@ -1454,15 +1459,50 @@ mod prim_ref {}
|
|||
/// * [`Pointer`]
|
||||
/// * [`Debug`]
|
||||
///
|
||||
/// The following traits are implemented for function pointers with any number of arguments and
|
||||
/// any ABI. These traits have implementations that are automatically generated by the compiler,
|
||||
/// so are not limited by missing language features:
|
||||
///
|
||||
/// * [`Clone`]
|
||||
/// * [`Copy`]
|
||||
/// * [`Send`]
|
||||
/// * [`Sync`]
|
||||
/// * [`Unpin`]
|
||||
/// * [`UnwindSafe`]
|
||||
/// * [`RefUnwindSafe`]
|
||||
///
|
||||
/// [`Hash`]: hash::Hash
|
||||
/// [`Pointer`]: fmt::Pointer
|
||||
/// [`UnwindSafe`]: panic::UnwindSafe
|
||||
/// [`RefUnwindSafe`]: panic::RefUnwindSafe
|
||||
///
|
||||
/// Due to a temporary restriction in Rust's type system, these traits are only implemented on
|
||||
/// functions that take 12 arguments or less, with the `"Rust"` and `"C"` ABIs. In the future, this
|
||||
/// may change.
|
||||
///
|
||||
/// In addition, function pointers of *any* signature, ABI, or safety are [`Copy`], and all *safe*
|
||||
/// function pointers implement [`Fn`], [`FnMut`], and [`FnOnce`]. This works because these traits
|
||||
/// are specially known to the compiler.
|
||||
/// In addition, all *safe* function pointers implement [`Fn`], [`FnMut`], and [`FnOnce`], because
|
||||
/// these traits are specially known to the compiler.
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
mod prim_fn {}
|
||||
|
||||
// Required to make auto trait impls render.
|
||||
// See src/librustdoc/passes/collect_trait_impls.rs:collect_trait_impls
|
||||
#[doc(hidden)]
|
||||
#[cfg(not(bootstrap))]
|
||||
impl<Ret, T> fn(T) -> Ret {}
|
||||
|
||||
// Fake impl that's only really used for docs.
|
||||
#[cfg(doc)]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[cfg_attr(not(bootstrap), doc(fake_variadic))]
|
||||
/// This trait is implemented on function pointers with any number of arguments.
|
||||
impl<Ret, T> Clone for fn(T) -> Ret {
|
||||
fn clone(&self) -> Self {
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
|
||||
// Fake impl that's only really used for docs.
|
||||
#[cfg(doc)]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[cfg_attr(not(bootstrap), doc(fake_variadic))]
|
||||
/// This trait is implemented on function pointers with any number of arguments.
|
||||
impl<Ret, T> Copy for fn(T) -> Ret {
|
||||
// empty
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue