diff --git a/src/closure.md b/src/closure.md index 3a7a10f5c..3b535040e 100644 --- a/src/closure.md +++ b/src/closure.md @@ -5,7 +5,7 @@ effectively "desugared" into structs that contain the values they use (or references to the values they use) from their creator's stack frame. rustc has the job of figuring out which values a closure uses and how, so it can decide whether to capture a given variable by shared reference, mutable reference, or -by move. rustc also has to figure out which the closure traits ([`Fn`][fn], +by move. rustc also has to figure out which of the closure traits ([`Fn`][fn], [`FnMut`][fn_mut], or [`FnOnce`][fn_once]) a closure is capable of implementing. @@ -120,7 +120,7 @@ for this purpose. [upvars]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/query/queries/struct.upvars_mentioned.html -Other than lazy invocation, one other thing that the distinguishes a closure from a +Other than lazy invocation, one other thing that distinguishes a closure from a normal function is that it can use the upvars. It borrows these upvars from its surrounding context; therefore the compiler has to determine the upvar's borrow type. The compiler starts with assigning an immutable borrow type and lowers the restriction (that is, changes it from @@ -181,15 +181,16 @@ shared borrow and another one for a mutable borrow. It will also tell us what wa The callbacks are defined by implementing the [`Delegate`] trait. The [`InferBorrowKind`][ibk] type implements `Delegate` and keeps a map that -records for each upvar which mode of borrow was required. The modes of borrow -can be `ByValue` (moved) or `ByRef` (borrowed). For `ByRef` borrows, it can be -`shared`, `shallow`, `unique` or `mut` as defined in the -[`compiler/rustc_middle/src/mir/mod.rs`][mir_mod]. +records for each upvar which mode of capture was required. The modes of capture +can be `ByValue` (moved) or `ByRef` (borrowed). For `ByRef` borrows, the possible +[`BorrowKind`]s are `ImmBorrow`, `UniqueImmBorrow`, `MutBorrow` as defined in the +[`compiler/rustc_middle/src/ty/mod.rs`][middle_ty]. -[mir_mod]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/index.html +[`BorrowKind`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/enum.BorrowKind.html +[middle_ty]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/index.html `Delegate` defines a few different methods (the different callbacks): -**consume**: for *move* of a variable, **borrow** for a *borrow* of some kind +**consume** for *move* of a variable, **borrow** for a *borrow* of some kind (shared or mutable), and **mutate** when we see an *assignment* of something. All of these callbacks have a common argument *cmt* which stands for Category, diff --git a/src/compiler-src.md b/src/compiler-src.md index 843000a07..5183a7c85 100644 --- a/src/compiler-src.md +++ b/src/compiler-src.md @@ -78,7 +78,7 @@ something like this: You can see the exact dependencies by reading the `Cargo.toml` for the various crates, just like a normal Rust crate. -One final thing: [`src/llvm-project`] is a submodule for our fork of LLVM +One final thing: [`src/llvm-project`] is a submodule for our fork of LLVM. During bootstrapping, LLVM is built and the [`src/librustc_llvm`] and [`src/rustllvm`] crates contain rust wrappers around LLVM (which is written in C++), so that the compiler can interface with it.