parent
83163df624
commit
bba248984f
|
|
@ -135,10 +135,10 @@ appropriate trait: `Fn` trait for immutable borrow, `FnMut` for mutable borrow,
|
||||||
and `FnOnce` for move semantics.
|
and `FnOnce` for move semantics.
|
||||||
|
|
||||||
Most of the code related to the closure is in the
|
Most of the code related to the closure is in the
|
||||||
[`compiler/rustc_typeck/src/check/upvar.rs`][upvar] file and the data structures are
|
[`compiler/rustc_hir_typeck/src/upvar.rs`][upvar] file and the data structures are
|
||||||
declared in the file [`compiler/rustc_middle/src/ty/mod.rs`][ty].
|
declared in the file [`compiler/rustc_middle/src/ty/mod.rs`][ty].
|
||||||
|
|
||||||
[upvar]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_typeck/check/upvar/index.html
|
[upvar]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir_typeck/upvar/index.html
|
||||||
[ty]:https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/index.html
|
[ty]:https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/index.html
|
||||||
|
|
||||||
Before we go any further, let's discuss how we can examine the flow of control through the rustc
|
Before we go any further, let's discuss how we can examine the flow of control through the rustc
|
||||||
|
|
@ -146,12 +146,12 @@ codebase. For closures specifically, set the `RUST_LOG` env variable as below an
|
||||||
output in a file:
|
output in a file:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
> RUST_LOG=rustc_typeck::check::upvar rustc +stage1 -Z dump-mir=all \
|
> RUST_LOG=rustc_hir_typeck::upvar rustc +stage1 -Z dump-mir=all \
|
||||||
<.rs file to compile> 2> <file where the output will be dumped>
|
<.rs file to compile> 2> <file where the output will be dumped>
|
||||||
```
|
```
|
||||||
|
|
||||||
This uses the stage1 compiler and enables `debug!` logging for the
|
This uses the stage1 compiler and enables `debug!` logging for the
|
||||||
`rustc_typeck::check::upvar` module.
|
`rustc_hir_typeck::upvar` module.
|
||||||
|
|
||||||
The other option is to step through the code using lldb or gdb.
|
The other option is to step through the code using lldb or gdb.
|
||||||
|
|
||||||
|
|
@ -164,7 +164,7 @@ Let's start with [`upvar.rs`][upvar]. This file has something called
|
||||||
the [`euv::ExprUseVisitor`] which walks the source of the closure and
|
the [`euv::ExprUseVisitor`] which walks the source of the closure and
|
||||||
invokes a callback for each upvar that is borrowed, mutated, or moved.
|
invokes a callback for each upvar that is borrowed, mutated, or moved.
|
||||||
|
|
||||||
[`euv::ExprUseVisitor`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_typeck/expr_use_visitor/struct.ExprUseVisitor.html
|
[`euv::ExprUseVisitor`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir_typeck/expr_use_visitor/struct.ExprUseVisitor.html
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
@ -210,6 +210,6 @@ self.tables
|
||||||
.extend(delegate.adjust_upvar_captures);
|
.extend(delegate.adjust_upvar_captures);
|
||||||
```
|
```
|
||||||
|
|
||||||
[`Delegate`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_typeck/expr_use_visitor/trait.Delegate.html
|
[`Delegate`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir_typeck/expr_use_visitor/trait.Delegate.html
|
||||||
[ibk]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_typeck/check/upvar/struct.InferBorrowKind.html
|
[ibk]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir_typeck/upvar/struct.InferBorrowKind.html
|
||||||
[cmt]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_typeck/mem_categorization/index.html
|
[cmt]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir_typeck/mem_categorization/index.html
|
||||||
|
|
|
||||||
|
|
@ -125,7 +125,7 @@ You may have a couple of followup questions…
|
||||||
`MyStruct`: `Adt(Foo, &[Param(0), Param(1)])`.
|
`MyStruct`: `Adt(Foo, &[Param(0), Param(1)])`.
|
||||||
|
|
||||||
**`subst`** How do we actually do the substitutions? There is a function for that too! You use
|
**`subst`** How do we actually do the substitutions? There is a function for that too! You use
|
||||||
[`subst`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/subst/trait.Subst.html) to
|
[`subst`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/subst/struct.EarlyBinder.html#method.subst) to
|
||||||
replace a `SubstRef` with another list of types.
|
replace a `SubstRef` with another list of types.
|
||||||
|
|
||||||
[Here is an example of actually using `subst` in the compiler][substex]. The exact details are not
|
[Here is an example of actually using `subst` in the compiler][substex]. The exact details are not
|
||||||
|
|
@ -134,7 +134,7 @@ a real `ty::Ty`. You can see that we first get some substitutions (`substs`). T
|
||||||
`type_of` to get a type and call `ty.subst(substs)` to get a new version of `ty` with
|
`type_of` to get a type and call `ty.subst(substs)` to get a new version of `ty` with
|
||||||
the substitutions made.
|
the substitutions made.
|
||||||
|
|
||||||
[substex]: https://github.com/rust-lang/rust/blob/597f432489f12a3f33419daa039ccef11a12c4fd/src/librustc_typeck/astconv.rs#L942-L953
|
[substex]: https://github.com/rust-lang/rust/blob/0940040c0486a536be4f8685c7dd9a078f9e87c2/compiler/rustc_hir_analysis/src/astconv/mod.rs#L1231-L1242
|
||||||
|
|
||||||
**Note on indices:** It is possible for the indices in `Param` to not match with what we expect. For
|
**Note on indices:** It is possible for the indices in `Param` to not match with what we expect. For
|
||||||
example, the index could be out of bounds or it could be the index of a lifetime when we were
|
example, the index could be out of bounds or it could be the index of a lifetime when we were
|
||||||
|
|
|
||||||
|
|
@ -32,8 +32,8 @@ inference variables or other information.
|
||||||
|
|
||||||
[fully-qualified syntax]: https://doc.rust-lang.org/nightly/book/ch19-03-advanced-traits.html#fully-qualified-syntax-for-disambiguation-calling-methods-with-the-same-name
|
[fully-qualified syntax]: https://doc.rust-lang.org/nightly/book/ch19-03-advanced-traits.html#fully-qualified-syntax-for-disambiguation-calling-methods-with-the-same-name
|
||||||
[UFCS]: https://github.com/rust-lang/rfcs/blob/master/text/0132-ufcs.md
|
[UFCS]: https://github.com/rust-lang/rfcs/blob/master/text/0132-ufcs.md
|
||||||
[probe]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_typeck/check/method/probe/
|
[probe]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir_typeck/method/probe/
|
||||||
[confirm]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_typeck/check/method/confirm/
|
[confirm]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir_typeck/method/confirm/
|
||||||
|
|
||||||
## The Probe phase
|
## The Probe phase
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ Actually resolving this goes through several layers of indirection:
|
||||||
|
|
||||||
1. In `compiler/rustc_middle/src/middle/weak_lang_items.rs`, `panic_impl` is
|
1. In `compiler/rustc_middle/src/middle/weak_lang_items.rs`, `panic_impl` is
|
||||||
declared as 'weak lang item', with the symbol `rust_begin_unwind`. This is
|
declared as 'weak lang item', with the symbol `rust_begin_unwind`. This is
|
||||||
used in `rustc_typeck/src/collect.rs` to set the actual symbol name to
|
used in `rustc_hir_analysis/src/collect.rs` to set the actual symbol name to
|
||||||
`rust_begin_unwind`.
|
`rust_begin_unwind`.
|
||||||
|
|
||||||
Note that `panic_impl` is declared in an `extern "Rust"` block,
|
Note that `panic_impl` is declared in an `extern "Rust"` block,
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ expected type. The [`astconv` module][astconv] is where the code responsible for
|
||||||
but also in other parts of the compiler that want to ask questions like "what argument types does
|
but also in other parts of the compiler that want to ask questions like "what argument types does
|
||||||
this function expect?"
|
this function expect?"
|
||||||
|
|
||||||
[astconv]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_typeck/astconv/index.html
|
[astconv]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir_analysis/astconv/index.html
|
||||||
|
|
||||||
**How semantics drive the two instances of `Ty`**
|
**How semantics drive the two instances of `Ty`**
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue