Skip to content

Update use keyword docs to describe precise capturing #131890

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

Merged
merged 1 commit into from
Oct 19, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 39 additions & 7 deletions library/std/src/keyword_docs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2146,10 +2146,13 @@ mod unsafe_keyword {}

#[doc(keyword = "use")]
//
/// Import or rename items from other crates or modules.
/// Import or rename items from other crates or modules, or specify precise capturing
/// with `use<..>`.
///
/// Usually a `use` keyword is used to shorten the path required to refer to a module item.
/// The keyword may appear in modules, blocks and even functions, usually at the top.
/// ## Importing items
///
/// The `use` keyword is employed to shorten the path required to refer to a module item.
/// The keyword may appear in modules, blocks, and even functions, typically at the top.
///
/// The most basic usage of the keyword is `use path::to::item;`,
/// though a number of convenient shortcuts are supported:
Expand Down Expand Up @@ -2190,19 +2193,48 @@ mod unsafe_keyword {}
/// // Compiles.
/// let _ = VariantA;
///
/// // Does not compile !
/// // Does not compile!
/// let n = new();
/// ```
///
/// For more information on `use` and paths in general, see the [Reference].
/// For more information on `use` and paths in general, see the [Reference][ref-use-decls].
///
/// The differences about paths and the `use` keyword between the 2015 and 2018 editions
/// can also be found in the [Reference].
/// can also be found in the [Reference][ref-use-decls].
///
/// ## Precise capturing
///
/// The `use<..>` syntax is used within certain `impl Trait` bounds to control which generic
/// parameters are captured. This is important for return-position `impl Trait` (RPIT) types,
/// as it affects borrow checking by controlling which generic parameters can be used in the
/// hidden type.
///
/// For example, the following function demonstrates an error without precise capturing in
/// Rust 2021 and earlier editions:
///
/// ```rust,compile_fail,edition2021
/// fn f(x: &()) -> impl Sized { x }
/// ```
///
/// By using `use<'_>` for precise capturing, it can be resolved:
///
/// ```rust
/// fn f(x: &()) -> impl Sized + use<'_> { x }
/// ```
///
/// This syntax specifies that the elided lifetime be captured and therefore available for
/// use in the hidden type.
///
/// In Rust 2024, opaque types automatically capture all lifetime parameters in scope.
/// `use<..>` syntax serves as an important way of opting-out of that default.
///
/// For more details about precise capturing, see the [Reference][ref-impl-trait].
///
/// [`crate`]: keyword.crate.html
/// [`self`]: keyword.self.html
/// [`super`]: keyword.super.html
/// [Reference]: ../reference/items/use-declarations.html
/// [ref-use-decls]: ../reference/items/use-declarations.html
/// [ref-impl-trait]: ../reference/types/impl-trait.html
mod use_keyword {}

#[doc(keyword = "where")]
Expand Down
Loading