pub(super) fn opt_normalize_projection_term<'a, 'b, 'tcx>(
selcx: &'a mut SelectionContext<'b, 'tcx>,
param_env: ParamEnv<'tcx>,
projection_term: AliasTerm<'tcx>,
cause: ObligationCause<'tcx>,
depth: usize,
obligations: &mut Vec<PredicateObligation<'tcx>>,
) -> Result<Option<Term<'tcx>>, InProgress>
Expand description
The guts of normalize
: normalize a specific projection like <T as Trait>::Item
. The result is always a type (and possibly
additional obligations). Returns None
in the case of ambiguity,
which indicates that there are unbound type variables.
This function used to return Option<NormalizedTy<'tcx>>
, which contains a
Ty<'tcx>
and an obligations vector. But that obligation vector was very
often immediately appended to another obligations vector. So now this
function takes an obligations vector and appends to it directly, which is
slightly uglier but avoids the need for an extra short-lived allocation.