The signature of a method impl may be a subtype of the one expected from the trait decl, as in
the example below. For correctness, we must be able to map from the method generics declared in
the trait to the actual method generics. Because this would require type inference, we instead
simply return the declared signature. This will cause issues if it is possible to use such a
more-specific implementation with its more-specific type, but we have a few other issues with
lifetime-generic function pointers anyway so this is unlikely to cause problems.
Closures and inline consts have special type params that are used as inference variables. After
analysis, they can be computed from the rest of the args (modulo some erased regions). This
computes the identity args for this def_id with the inference ars properly inferred.
Convert a type annotation into data we can use, by fetching the types that rustc inferred and
gathering the predicates that still need to be checked at borrowck time.
The data of a user annotation: for each used projection we get the type of the corresponding
place, and we record outlives predicates that must hold. The first vec matches the input list
of projections, the second is free-form.