@@ -996,7 +996,7 @@ impl<T> (T,) {}
996996// Fake impl that's only really used for docs.
997997#[ cfg( doc) ]
998998#[ stable( feature = "rust1" , since = "1.0.0" ) ]
999- #[ doc( tuple_variadic ) ]
999+ #[ cfg_attr ( not ( bootstrap ) , doc( fake_variadic ) ) ]
10001000/// This trait is implemented on arbitrary-length tuples.
10011001impl < T : Clone > Clone for ( T , ) {
10021002 fn clone ( & self ) -> Self {
@@ -1007,7 +1007,7 @@ impl<T: Clone> Clone for (T,) {
10071007// Fake impl that's only really used for docs.
10081008#[ cfg( doc) ]
10091009#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1010- #[ doc( tuple_variadic ) ]
1010+ #[ cfg_attr ( not ( bootstrap ) , doc( fake_variadic ) ) ]
10111011/// This trait is implemented on arbitrary-length tuples.
10121012impl < T : Copy > Copy for ( T , ) {
10131013 // empty
@@ -1441,11 +1441,16 @@ mod prim_ref {}
14411441/// Note that all of this is not portable to platforms where function pointers and data pointers
14421442/// have different sizes.
14431443///
1444- /// ### Traits
1444+ /// ### Trait implementations
14451445///
1446- /// Function pointers implement the following traits:
1446+ /// In this documentation the shorthand `fn (T₁, T₂, …, Tₙ)` is used to represent non-variadic
1447+ /// function pointers of varying length. Note that this is a convenience notation to avoid
1448+ /// repetitive documentation, not valid Rust syntax.
1449+ ///
1450+ /// Due to a temporary restriction in Rust's type system, these traits are only implemented on
1451+ /// functions that take 12 arguments or less, with the `"Rust"` and `"C"` ABIs. In the future, this
1452+ /// may change:
14471453///
1448- /// * [`Clone`]
14491454/// * [`PartialEq`]
14501455/// * [`Eq`]
14511456/// * [`PartialOrd`]
@@ -1454,15 +1459,50 @@ mod prim_ref {}
14541459/// * [`Pointer`]
14551460/// * [`Debug`]
14561461///
1462+ /// The following traits are implemented for function pointers with any number of arguments and
1463+ /// any ABI. These traits have implementations that are automatically generated by the compiler,
1464+ /// so are not limited by missing language features:
1465+ ///
1466+ /// * [`Clone`]
1467+ /// * [`Copy`]
1468+ /// * [`Send`]
1469+ /// * [`Sync`]
1470+ /// * [`Unpin`]
1471+ /// * [`UnwindSafe`]
1472+ /// * [`RefUnwindSafe`]
1473+ ///
14571474/// [`Hash`]: hash::Hash
14581475/// [`Pointer`]: fmt::Pointer
1476+ /// [`UnwindSafe`]: panic::UnwindSafe
1477+ /// [`RefUnwindSafe`]: panic::RefUnwindSafe
14591478///
1460- /// Due to a temporary restriction in Rust's type system, these traits are only implemented on
1461- /// functions that take 12 arguments or less, with the `"Rust"` and `"C"` ABIs. In the future, this
1462- /// may change.
1463- ///
1464- /// In addition, function pointers of *any* signature, ABI, or safety are [`Copy`], and all *safe*
1465- /// function pointers implement [`Fn`], [`FnMut`], and [`FnOnce`]. This works because these traits
1466- /// are specially known to the compiler.
1479+ /// In addition, all *safe* function pointers implement [`Fn`], [`FnMut`], and [`FnOnce`], because
1480+ /// these traits are specially known to the compiler.
14671481#[ stable( feature = "rust1" , since = "1.0.0" ) ]
14681482mod prim_fn { }
1483+
1484+ // Required to make auto trait impls render.
1485+ // See src/librustdoc/passes/collect_trait_impls.rs:collect_trait_impls
1486+ #[ doc( hidden) ]
1487+ #[ cfg( not( bootstrap) ) ]
1488+ impl < Ret , T > fn ( T ) -> Ret { }
1489+
1490+ // Fake impl that's only really used for docs.
1491+ #[ cfg( doc) ]
1492+ #[ stable( feature = "rust1" , since = "1.0.0" ) ]
1493+ #[ cfg_attr( not( bootstrap) , doc( fake_variadic) ) ]
1494+ /// This trait is implemented on function pointers with any number of arguments.
1495+ impl < Ret , T > Clone for fn ( T ) -> Ret {
1496+ fn clone ( & self ) -> Self {
1497+ loop { }
1498+ }
1499+ }
1500+
1501+ // Fake impl that's only really used for docs.
1502+ #[ cfg( doc) ]
1503+ #[ stable( feature = "rust1" , since = "1.0.0" ) ]
1504+ #[ cfg_attr( not( bootstrap) , doc( fake_variadic) ) ]
1505+ /// This trait is implemented on function pointers with any number of arguments.
1506+ impl < Ret , T > Copy for fn ( T ) -> Ret {
1507+ // empty
1508+ }
0 commit comments