Check variable shadowing in a statement.
(check-shadow-statement stmt vars) → new-vars
If the check is successful, we return a possibly updated set of visible variables. The set is actually updated only by variable declarations.
Since the scope of a loop's initialization block extends to the whole loop, we first check the list of statments of the initialization block, obtaining a possibly updated set of visible variables, which is used to check the update and body blocks of the loop.