This approach makes sure that errors caused by undef are not in
the way of other options such as latedef. The code pushes all
warning about undefined variables into an array and at the
end of processing checks if any of those variables were defined
later in the code and can be legally used due to hoisting.
P.S. The only thing is that it can mess up the maxerr option but
we need to refactor it anyway.