Ensure nested binders have Internal Names
authorSimon Peyton Jones <simonpj@microsoft.com>
Wed, 4 Jan 2017 17:47:13 +0000 (17:47 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Thu, 5 Jan 2017 08:51:46 +0000 (08:51 +0000)
commitbaf9ebe55a51827c0511b3a670e60b9bb3617ab5
treea43f640a064859e302a09b5ecb87d3f59ba47f12
parentc909e6ec333667878b17f127f75204a14256340f
Ensure nested binders have Internal Names

This is a long-standing bug.  A nested (non-top-level) binder
in Core should not have an External Name, like M.x. But

- Lint was not checking this invariant

- The desugarer could generate programs that failed the
  invariant.  An example is in
  tests/deSugar/should_compile/T13043, which had
     let !_ = M.scState in ...
  This desugared to
     let ds = case M.scSate of M.scState { DEFAULT -> () }
     in case ds of () -> ...

  We were wrongly re-using that scrutinee as a case binder.
  And Trac #13043 showed that could ultimately lead to two
  top-level bindings with the same closure name.  Alas!

- The desugarer had one other place (in DsUtils.mkCoreAppDs)
  that could generate bogus code

This patch fixes all three bugs, and adds a regression test.
compiler/coreSyn/CoreLint.hs
compiler/deSugar/DsUtils.hs
compiler/deSugar/Match.hs
testsuite/tests/deSugar/should_compile/T13043.hs [new file with mode: 0644]
testsuite/tests/deSugar/should_compile/all.T