One of those non-obvious obvious things.. It's often hard to do in one pass because of a global->local information flow. At least a pass "leaving holes" is necessary, i.e. a lazy approach. That is, unless you're using a lazy language, in which case some magic might be possible performing in one pass what ordinary morals need to do in two.