I’m not how that would still hold for UFCS? Are you envisioning that if you call Foo::foo and it is declared with &self that behaves differently than if it were declared self: &Foo? That is not really possible, because it’d have to be encoded in the fn type and so forth. I’m not really a fan of deviating from LTR in the case of method calls. We can make the borrow checker reason more precisely about method calls to solve the nested argument problem in its most common incarnation.
One could imagine saying that a.method(...) evaluates a last, and that might just mean that transforming to Trait::method(a, ...) form isn’t always valid without more complex transformations to preserve execution order. But I find it very surprising that a.foo(..) wouldn’t evaluate a first. I think it’s because the receiver is so primary in method dispatch.
Assignments are rather different, both because things like vec[i] = vec[j] are pretty common and because the evaluation order is evident from the surface syntax, and there IS a certain logic to “evaluate the value you are going to store first, and then find the place you are going to store it into”.