Deal with exceptions in dsWhenNoErrs
authorSimon Peyton Jones <simonpj@microsoft.com>
Thu, 4 May 2017 12:33:04 +0000 (13:33 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Thu, 4 May 2017 16:27:08 +0000 (17:27 +0100)
commite77019767fe5327011c6dc8fe089c64884120aab
treee043abc315addd6560cfac01d88699fa11db5685
parent81af480a0fd3b37fff17245c1468638597261bcb
Deal with exceptions in dsWhenNoErrs

Gracious me.  Ever since this patch

  commit 374457809de343f409fbeea0a885877947a133a2
  Author: Jan Stolarek <jan.stolarek@p.lodz.pl>
  Date:   Fri Jul 11 13:54:45 2014 +0200

      Injective type families

TcRnMonad.askNoErrs has been wrong. It looked like this

   askNoErrs :: TcRn a -> TcRn (a, Bool)
   askNoErrs m
    = do { errs_var <- newTcRef emptyMessages
         ; res  <- setErrsVar errs_var m
         ; (warns, errs) <- readTcRef errs_var
         ; addMessages (warns, errs)
         ; return (res, isEmptyBag errs) }

The trouble comes if 'm' throws an exception in the TcRn monad.
Then 'errs_var is never read, so any errors are simply lost.

This mistake was then propgated into DsMonad.dsWhenNoErrs, where
it gave rise to Trac #13642.

Thank to Ryan for narrowing it down so sharply.

I did some refactoring, as usual.
compiler/deSugar/DsMonad.hs
compiler/ghci/RtClosureInspect.hs
compiler/typecheck/TcRnDriver.hs
compiler/typecheck/TcRnMonad.hs
compiler/typecheck/TcSplice.hs
testsuite/tests/th/T13642.hs [new file with mode: 0644]
testsuite/tests/th/T13642.stderr [new file with mode: 0644]
testsuite/tests/th/all.T