A nice interface for working with the infcx. The basic idea is to
infcx.at(cause, param_env), which sets the “cause” of the
operation as well as the surrounding parameter environment. Then
you can do something like
.sub(a, b) or
.eq(a, b) to create a
subtype or equality relationship respectively. The first argument
is always the “expected” output from the POV of diagnostics.
Canonicalization is the key to constructing a query in the
middle of type inference. Ordinarily, it is not possible to store
types from type inference in query keys, because they contain
references to inference variables whose lifetimes are too short
and so forth. Canonicalizing a value T1 using
produces two things:
Error Reporting Code for the inference engine
This module handles the relationships between “free regions”, i.e., lifetime parameters.
Ordinarily, free regions are unrelated to one another, but they can be related via implied
or explicit bounds. In that case, we track the bounds using the
and use that to decide when one free region outlives another, and so forth.
This code is kind of an alternate way of doing subtyping,
supertyping, and type equating, distinct from the
code but very similar in its effect and design. Eventually the two
ought to be merged. This code is intended for use in NLL and chalk.
Various code related to computing outlives relations.