|
1 |
| -/////////////////////////////////////////////////////////////////////////// |
2 |
| -// # Type combining |
3 |
| -// |
4 |
| -// There are four type combiners: equate, sub, lub, and glb. Each |
5 |
| -// implements the trait `Combine` and contains methods for combining |
6 |
| -// two instances of various things and yielding a new instance. These |
7 |
| -// combiner methods always yield a `Result<T>`. There is a lot of |
8 |
| -// common code for these operations, implemented as default methods on |
9 |
| -// the `Combine` trait. |
10 |
| -// |
11 |
| -// Each operation may have side-effects on the inference context, |
12 |
| -// though these can be unrolled using snapshots. On success, the |
13 |
| -// LUB/GLB operations return the appropriate bound. The Eq and Sub |
14 |
| -// operations generally return the first operand. |
15 |
| -// |
16 |
| -// ## Contravariance |
17 |
| -// |
18 |
| -// When you are relating two things which have a contravariant |
19 |
| -// relationship, you should use `contratys()` or `contraregions()`, |
20 |
| -// rather than inversing the order of arguments! This is necessary |
21 |
| -// because the order of arguments is not relevant for LUB and GLB. It |
22 |
| -// is also useful to track which value is the "expected" value in |
23 |
| -// terms of error reporting. |
| 1 | +//! There are four type combiners: [Equate], [Sub], [Lub], and [Glb]. |
| 2 | +//! Each implements the trait [TypeRelation] and contains methods for |
| 3 | +//! combining two instances of various things and yielding a new instance. |
| 4 | +//! These combiner methods always yield a `Result<T>`. To relate two |
| 5 | +//! types, you can use `infcx.at(cause, param_env)` which then allows |
| 6 | +//! you to use the relevant methods of [At](super::at::At). |
| 7 | +//! |
| 8 | +//! Combiners mostly do their specific behavior and then hand off the |
| 9 | +//! bulk of the work to [InferCtxt::super_combine_tys] and |
| 10 | +//! [InferCtxt::super_combine_consts]. |
| 11 | +//! |
| 12 | +//! Combining two types may have side-effects on the inference contexts |
| 13 | +//! which can be undone by using snapshots. You probably want to use |
| 14 | +//! either [InferCtxt::commit_if_ok] or [InferCtxt::probe]. |
| 15 | +//! |
| 16 | +//! On success, the LUB/GLB operations return the appropriate bound. The |
| 17 | +//! return value of `Equate` or `Sub` shouldn't really be used. |
| 18 | +//! |
| 19 | +//! ## Contravariance |
| 20 | +//! |
| 21 | +//! We explicitly track which argument is expected using |
| 22 | +//! [TypeRelation::a_is_expected], so when dealing with contravariance |
| 23 | +//! this should be correctly updated. |
24 | 24 |
|
25 | 25 | use super::equate::Equate;
|
26 | 26 | use super::glb::Glb;
|
|
0 commit comments