#1265: Template Haskell fail Messages not Getting Through
---------------------------------+------------------------------------------
Reporter: [EMAIL PROTECTED] | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Template Haskell | Version: 6.6
Severity: normal | Keywords:
Difficulty: Unknown | Testcase:
Architecture: Unknown | Os: Unknown
---------------------------------+------------------------------------------
There is (I believe) a mistake in GHC's template Haskell implementation
int the way the fail member is handled. The error messages get eaten and
replaced with a cryptic reference to an "IOEnv failure". For example (at
the "ghci -fth" prompt):
{{{
Prelude> let doit = fail "Code not written yet" ::
Language.Haskell.TH.ExpQ
Loading package template-haskell ... linking ... done.
Prelude> $(doit)
<interactive>:1:2:
Exception when trying to run compile-time code:
user error (IOEnv failure)
Code: doit
In the expression: $[splice]doit
In the definition of `it': it = $[splice]doit
Prelude>
}}}
The problem seems to be that GHC runs the template code in the IOEnv monad
(compiler/typecheck/TcSplite.lhs) whose fail implementation
(compiler/utils/IOEnv.hs) eats its argument and instead raises "userError
"IOEnv failure"".
I put a patch together for this, and will submit it soon (i.e., as soon as
I finish reading the pages on how to do so). With the patch, the above
examples becomes:
{{{
Prelude> let doit = fail "Code not written yet" ::
Language.Haskell.TH.ExpQ
Loading package template-haskell ... linking ... done.
Prelude> $(doit)
<interactive>:1:2: Code not written yet
Prelude>
}}}
This is achieved through changing the fail implementation for the Q monad
to first log the message with report before passing control through the
fail member of the underlying Quasi instance (IOEnv in this case) and
changing the exception handling code around the running of the template
code to gracefully handle exceptions raised in such a manner (i.e., print
out the logged message).
It is a bit hackish, but it was the only way I could see to do this with
out changing the fail implementation for IOEnv (I assume it was written
the way it is for a reason -- possibly to avoid spamming the user with
messages regarding compiler problems -- although it does seems strange) or
introducing an additional function into the Q monad (such as giveUp from
"Notes on Template Haskell Version 2").
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/1265>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs