Skip to content

Commit d30f5be

Browse files
arielb1pietroalbini
authored andcommitted
add some comments to method::probe::Candidate
1 parent d820e21 commit d30f5be

File tree

1 file changed

+31
-0
lines changed
  • src/librustc_typeck/check/method

1 file changed

+31
-0
lines changed

src/librustc_typeck/check/method/probe.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,37 @@ impl<'a, 'gcx, 'tcx> Deref for ProbeContext<'a, 'gcx, 'tcx> {
8585

8686
#[derive(Debug)]
8787
struct Candidate<'tcx> {
88+
// Candidates are (I'm not quite sure, but they are mostly) basically
89+
// some metadata on top of a `ty::AssociatedItem` (without substs).
90+
//
91+
// However, method probing wants to be able to evaluate the predicates
92+
// for a function with the substs applied - for example, if a function
93+
// has `where Self: Sized`, we don't want to consider it unless `Self`
94+
// is actually `Sized`, and similarly, return-type suggestions want
95+
// to consider the "actual" return type.
96+
//
97+
// The way this is handled is through `xform_self_ty`. It contains
98+
// the receiver type of this candidate, but `xform_self_ty`,
99+
// `xform_ret_ty` and `kind` (which contains the predicates) have the
100+
// generic parameters of this candidate substituted with the *same set*
101+
// of inference variables, which acts as some weird sort of "query".
102+
//
103+
// When we check out a candidate, we require `xform_self_ty` to be
104+
// a subtype of the passed-in self-type, and this equates the type
105+
// variables in the rest of the fields.
106+
//
107+
// For example, if we have this candidate:
108+
// ```
109+
// trait Foo {
110+
// fn foo(&self) where Self: Sized;
111+
// }
112+
// ```
113+
//
114+
// Then `xform_self_ty` will be `&'erased ?X` and `kind` will contain
115+
// the predicate `?X: Sized`, so if we are evaluating `Foo` for a
116+
// the receiver `&T`, we'll do the subtyping which will make `?X`
117+
// get the right value, then when we evaluate the predicate we'll check
118+
// if `T: Sized`.
88119
xform_self_ty: Ty<'tcx>,
89120
xform_ret_ty: Option<Ty<'tcx>>,
90121
item: ty::AssociatedItem,

0 commit comments

Comments
 (0)