[GHC] #14765: Levity polymorphism panic
GHC
ghc-devs at haskell.org
Fri Feb 9 00:11:37 UTC 2018
#14765: Levity polymorphism panic
-------------------------------------+-------------------------------------
Reporter: dfeuer | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone: 8.6.1
Component: Compiler | Version: 8.5
Resolution: | Keywords:
| LevityPolymorphism
Operating System: Unknown/Multiple | Architecture:
Type of failure: Compile-time | Unknown/Multiple
crash or panic | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by simonpj):
Richard, this is a continuation of #12709. During desugaring we have
{{{
f a b
}}}
Turns out that there's a levity-polymophism error in `(f a)`, so
(bizarrely)
`dsWhneNoErrs` returns `()`. Then the desugarer tries to apply that to
`b`,
and that fails because `()` isn't a function type.
Hhe cure (for #12709) was ugly enough; now we find that it doesn't
acutally work! Replacing
an expression by `()` doesn't make sense -- the types are wrong. I can
see two
solutions (there may be others):
* Instead of returning `()` return `undefined @ty` where `ty` is the
needed type.
But the whole `dsWhenNoErrs` machinery is very heavy; it calls `tryM`
(which in
turn allcoates fresh IO refes for errors etc) on every single application
node.
The cure is worse than the disease.
So instead
* We could define desugarer-only version of `mkCoreApp`, which doesn't
blow up
on levity-polymorphic args. (Maybe it builds an ordinary App, say.)
It's
a bit of code to duplicate but not much, and it's easy to understand.
(Alternatively we could make `isUnliftedType` return False for a levity-
poly type. That would be even simpler.)
What do you think?
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14765#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list