Fix the implementation of lazyId
authorSimon Peyton Jones <simonpj@microsoft.com>
Tue, 8 Mar 2016 15:27:54 +0000 (15:27 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Wed, 9 Mar 2016 13:16:13 +0000 (13:16 +0000)
commit4c3a0a4a7b999251cbbee00befbfe32b86e556e2
treeca43b5f05619b9d38424765a34d1af1640905dc3
parent1c76e1686bd4291556ae9357151f256c805b4b5d
Fix the implementation of lazyId

'lazy' was doing part of its job, but not all!  In particular,
an application
  f (lazy e)
where f is strict, was still being compiled using call-by-value in
CorePrep.  This defeated the purpose of defining catch as
   catch a b = catch# (lazy a) b
See Trac #11555, and Neil Mitchell's test case in comment:14

This patch makes 'lazy' behave properly. I updated Note [lazyId magic]
in MkId, but all the action is in CorePrep.

I can't say I really like this, but it does the job.
compiler/basicTypes/MkId.hs
compiler/coreSyn/CorePrep.hs