add some type inference links, and fix/improve some stuff (#654)

This commit is contained in:
Tshepang Lekhonkhobe 2020-04-01 10:52:31 +02:00 committed by GitHub
parent 3c82384ac8
commit 8edc4bc160
1 changed files with 16 additions and 8 deletions

View File

@ -149,7 +149,7 @@ To allow for this, the inference context supports a `snapshot` method.
When you call it, it will start recording changes that occur from the When you call it, it will start recording changes that occur from the
operations you perform. When you are done, you can either invoke operations you perform. When you are done, you can either invoke
`rollback_to`, which will undo those changes, or else `confirm`, which `rollback_to`, which will undo those changes, or else `confirm`, which
will make the permanent. Snapshots can be nested as long as you follow will make them permanent. Snapshots can be nested as long as you follow
a stack-like discipline. a stack-like discipline.
Rather than use snapshots directly, it is often helpful to use the Rather than use snapshots directly, it is often helpful to use the
@ -200,7 +200,7 @@ idea:
``` ```
(There are various other kinds of constraints, such as "verifys"; see (There are various other kinds of constraints, such as "verifys"; see
the `region_constraints` module for details.) the [`region_constraints`] module for details.)
There is one case where we do some amount of eager unification. If you have an There is one case where we do some amount of eager unification. If you have an
equality constraint between two regions equality constraint between two regions
@ -210,10 +210,13 @@ equality constraint between two regions
``` ```
we will record that fact in a unification table. You can then use we will record that fact in a unification table. You can then use
`opportunistic_resolve_var` to convert `'b` to `'a` (or vice [`opportunistic_resolve_var`] to convert `'b` to `'a` (or vice
versa). This is sometimes needed to ensure termination of fixed-point versa). This is sometimes needed to ensure termination of fixed-point
algorithms. algorithms.
[`region_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_infer/infer/region_constraints/index.html
[`opportunistic_resolve_var`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_infer/infer/region_constraints/struct.RegionConstraintCollector.html#method.opportunistic_resolve_var
## Extracting region constraints ## Extracting region constraints
Ultimately, region constraints are only solved at the very end of Ultimately, region constraints are only solved at the very end of
@ -222,22 +225,27 @@ ways to solve region constraints right now: lexical and
non-lexical. Eventually there will only be one. non-lexical. Eventually there will only be one.
To solve **lexical** region constraints, you invoke To solve **lexical** region constraints, you invoke
`resolve_regions_and_report_errors`. This "closes" the region [`resolve_regions_and_report_errors`]. This "closes" the region
constraint process and invoke the `lexical_region_resolve` code. Once constraint process and invokes the [`lexical_region_resolve`] code. Once
this is done, any further attempt to equate or create a subtyping this is done, any further attempt to equate or create a subtyping
relationship will yield an ICE. relationship will yield an ICE.
Non-lexical region constraints are not handled within the inference Non-lexical region constraints are not handled within the inference
context. Instead, the NLL solver (actually, the MIR type-checker) context. Instead, the NLL solver (actually, the MIR type-checker)
invokes `take_and_reset_region_constraints` periodically. This invokes [`take_and_reset_region_constraints`] periodically. This
extracts all of the outlives constraints from the region solver, but extracts all of the outlives constraints from the region solver, but
leaves the set of variables intact. This is used to get *just* the leaves the set of variables intact. This is used to get *just* the
region constraints that resulted from some particular point in the region constraints that resulted from some particular point in the
program, since the NLL solver needs to know not just *what* regions program, since the NLL solver needs to know not just *what* regions
were subregions but *where*. Finally, the NLL solver invokes were subregions, but also *where*. Finally, the NLL solver invokes
`take_region_var_origins`, which "closes" the region constraint [`take_region_var_origins`], which "closes" the region constraint
process in the same way as normal solving. process in the same way as normal solving.
[`resolve_regions_and_report_errors`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_infer/infer/struct.InferCtxt.html#method.resolve_regions_and_report_errors
[`lexical_region_resolve`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_infer/infer/lexical_region_resolve/index.html
[`take_and_reset_region_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_infer/infer/struct.InferCtxt.html#method.take_and_reset_region_constraints
[`take_region_var_origins`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_infer/infer/struct.InferCtxt.html#method.take_region_var_origins
## Lexical region resolution ## Lexical region resolution
Lexical region resolution is done by initially assigning each region Lexical region resolution is done by initially assigning each region