rustc_trait_selection::traits::project

Function normalize_to_error

source
fn normalize_to_error<'a, 'tcx>(
    selcx: &SelectionContext<'a, 'tcx>,
    param_env: ParamEnv<'tcx>,
    projection_term: AliasTerm<'tcx>,
    cause: ObligationCause<'tcx>,
    depth: usize,
) -> NormalizedTerm<'tcx>
Expand description

If we are projecting <T as Trait>::Item, but T: Trait does not hold. In various error cases, we cannot generate a valid normalized projection. Therefore, we create an inference variable return an associated obligation that, when fulfilled, will lead to an error.

Note that we used to return Error here, but that was quite dubious – the premise was that an error would eventually be reported, when the obligation was processed. But in general once you see an Error you are supposed to be able to assume that an error has been reported, so that you can take whatever heuristic paths you want to take. To make things worse, it was possible for cycles to arise, where you basically had a setup like <MyType<$0> as Trait>::Foo == $0. Here, normalizing <MyType<$0> as Trait>::Foo> to [type error] would lead to an obligation of <MyType<[type error]> as Trait>::Foo. We are supposed to report an error for this obligation, but we legitimately should not, because it contains [type error]. Yuck! (See issue #29857 for one case where this arose.)