Under the new flow, `bare_fn_ty` here is always equal to `candidate.method_ty.fty`. Moreover, the construction of `fty` at the top of the function is unnecessary; it is only used here (where it is not needed) and in `enforce_object_limitations()`, where it appears it is not needed. I'd rather we just strip it out. The logic of this function is complex enough that unnecessary variables is rather distracting.

Perhaps add this comment:

// This method performs two sets of substitutions, one after the other:
// 1. Substitute values for any type/lifetime parameters from the impl and method declaration into the method type.
// This is the function type before it is called; it may still include late bound region variables.
// 2. Instantiate any late bound lifetime parameters in the method itself with fresh region variables.