Bons exemplos Lavieri, entendi o que quis dizer.
Como o dionat4n disse, o compilador tem que ser inteligente até certo ponto, e mais, tem que ser inteligente com todos os tipos códigos que poderem ser compilados nele.
Eu diria que os desenvolvedores que fizeram o compilador até pensaram em testar todas as saídas possíveis de uma determinado caminho do programa, mas provavelmente não colocaram na versão final por causa do custo-benefício dele: o processo de compilação ficaria muito mais lerdo.
Quanto ao escopo, ainda tenho a mesma opinião. Ele precisa ser checado antes de outras checagens mais avançadas(e custosas). É mais fácil, é mais barato, e em todas as vezes gera um código correto. Então não adianta executar a análise de fluxo de execução se o programa não passou no teste de escopo primeiro.
Bem, se o compilador não é tão inteligente, por sorte temos outros programas que fazem esse tipo de análise mais avançado e custoso. Dê uma olhada no FindBugs, PMD, JLint.