Skip to main content

live_args_for_outlives_clause

Function live_args_for_outlives_clause 

Source
fn live_args_for_outlives_clause<'tcx>(
    tcx: TyCtxt<'tcx>,
    alias_def_id: DefId,
    ty: Ty<'tcx>,
    outlives: Binder<'tcx, TypeOutlivesPredicate<'tcx>>,
) -> Option<FxIndexSet<EarlyBinder<'tcx, GenericArg<'tcx>>>>
Expand description

For a param-env clause for<'v..> <T as Trait>::Assoc<..>: 'bound that applies to ty (an alias with alias_def_id), returns the set of (identity) args that the underlying type could possibly capture, as restricted by this clause.

As an example, let’s imagine we had the following associated type definition:

type Assoc<'a, 'b, 'c: 'a> = (&'a &'c (), &'b ());

the following clause:

for<'x, 'y> T::Assoc<'x, 'x, 'y>: 'x

We know from the clause alone that given some substitution of T:Assoc, we know that it can capture either the first or the second region. However, the bounds on the associated type itself additionally imply that the third region can also be captured, because it outlives the first.

Now, let’s assume we had this clause:

for<'x, 'y> T::Assoc<'x, 'y, 'x>: 'x

Here, we know that 'a and 'c could be captured, but there is no outlives relationship to 'b for either of those, so the underlying type can’t capture any arg containing 'b.

Note: because higher-ranked bounds don’t have implications, there will be some cases (like for<'x, 'y, 'z> T::Assoc<'x, 'y, 'z>: 'x) that won’t be satisfiable today, but the logic here should hold whenever there is.

Returns None if the clause doesn’t apply to ty or gives us no information.