[GHC] #14331: Overzealous free-floating kind check causes deriving clause to be rejected
GHC
ghc-devs at haskell.org
Sun Nov 5 16:39:35 UTC 2017
#14331: Overzealous free-floating kind check causes deriving clause to be rejected
-------------------------------------+-------------------------------------
Reporter: RyanGlScott | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone: 8.4.1
Component: Compiler (Type | Version: 8.2.1
checker) |
Resolution: | Keywords: deriving
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: GHC rejects | Test Case:
valid program | deriving/should_compile/T14331
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by RyanGlScott):
I made an attempt towards fixing this at
https://github.com/RyanGlScott/ghc/tree/rgs/T14331. I didn't get very far.
My first goal was to switch over from the use of the pure unifier to the
monadic one, but that alone proves to be quite difficult. The problem is
that for some strange reason, using the monadic unifier causes several
type variables to be filled in with `Any`, leading to Core Lint errors and
general badness. As one example, if you compile this program:
{{{#!hs
module Bug where
data Pair a b = Pair a b
deriving Eq
}}}
Using my branch with `-dcore-lint` on, you'll be greeted with this:
{{{
$ ghc/inplace/bin/ghc-stage2 --interactive Bug.hs -dcore-lint
GHCi, version 8.3.20171031: http://www.haskell.org/ghc/ :? for help
Loaded GHCi configuration from /home/rgscott/.ghci
[1 of 1] Compiling Bug ( Bug.hs, interpreted )
*** Core Lint errors : in result of Desugar (after optimization) ***
Bug.hs:4:12: warning:
[RHS of $fEqPair :: forall a b.
(Eq Any, Eq Any) =>
Eq (Pair Any Any)]
The type of this binder doesn't match the type of its RHS: $fEqPair
Binder's type: forall a b. (Eq Any, Eq Any) => Eq (Pair Any Any)
Rhs type: forall a b. (Eq b, Eq a) => Eq (Pair a b)
*** Offending Program ***
$c==_a2Cw
:: forall a b. (Eq b, Eq a) => Pair a b -> Pair a b -> Bool
[LclId]
$c==_a2Cw
= \ (@ a_a2Cr)
(@ b_a2Cs)
($dEq_a2Ct :: Eq b_a2Cs)
($dEq_a2Cu :: Eq a_a2Cr)
(ds_d2Dz :: Pair a_a2Cr b_a2Cs)
(ds_d2DA :: Pair a_a2Cr b_a2Cs) ->
case ds_d2Dz of { Pair a1_a2Cn a2_a2Co ->
case ds_d2DA of { Pair b1_a2Cp b2_a2Cq ->
&&
(== @ a_a2Cr $dEq_a2Cu a1_a2Cn b1_a2Cp)
(== @ b_a2Cs $dEq_a2Ct a2_a2Co b2_a2Cq)
}
}
Rec {
$fEqPair [InlPrag=NOUSERINLINE CONLIKE]
:: forall a b. (Eq Any, Eq Any) => Eq (Pair Any Any)
[LclIdX[DFunId],
Unf=DFun: \ (@ a_a2z3[tau:1])
(@ b_a2z4[tau:1])
(v_B1 :: Eq b_a2z4[tau:1])
(v_B2 :: Eq a_a2z3[tau:1]) ->
C:Eq TYPE: Pair a_a2z3[tau:1] b_a2z4[tau:1]
$c==_a2Cw @ a_a2z3[tau:1] @ b_a2z4[tau:1] v_B1 v_B2
$c/=_a2CF @ a_a2z3[tau:1] @ b_a2z4[tau:1] v_B1 v_B2]
$fEqPair
= \ (@ a_a2Cr)
(@ b_a2Cs)
($dEq_a2Ct :: Eq b_a2Cs)
($dEq_a2Cu :: Eq a_a2Cr) ->
C:Eq
@ (Pair a_a2Cr b_a2Cs)
($c==_a2Cw @ a_a2Cr @ b_a2Cs $dEq_a2Ct $dEq_a2Cu)
($c/=_a2CF @ a_a2Cr @ b_a2Cs $dEq_a2Ct $dEq_a2Cu)
$c/=_a2CF [Occ=LoopBreaker]
:: forall a b. (Eq b, Eq a) => Pair a b -> Pair a b -> Bool
[LclId]
$c/=_a2CF
= \ (@ a_a2Cr)
(@ b_a2Cs)
($dEq_a2Ct :: Eq b_a2Cs)
($dEq_a2Cu :: Eq a_a2Cr) ->
$dm/=
@ (Pair a_a2Cr b_a2Cs)
($fEqPair @ a_a2Cr @ b_a2Cs $dEq_a2Ct $dEq_a2Cu)
end Rec }
$trModule :: Module
[LclIdX]
$trModule = Module (TrNameS "main"#) (TrNameS "Bug"#)
$krep_a2Dx [InlPrag=NOUSERINLINE[~]] :: KindRep
[LclId]
$krep_a2Dx = $WKindRepVar (I# 1#)
$krep_a2Dv [InlPrag=NOUSERINLINE[~]] :: KindRep
[LclId]
$krep_a2Dv = $WKindRepVar (I# 0#)
$tcPair :: TyCon
[LclIdX]
$tcPair
= TyCon
13156152634686180623##
12550973000996521707##
$trModule
(TrNameS "Pair"#)
0#
krep$*->*->*
$krep_a2Dy [InlPrag=NOUSERINLINE[~]] :: KindRep
[LclId]
$krep_a2Dy
= KindRepTyConApp
$tcPair
(: @ KindRep $krep_a2Dv (: @ KindRep $krep_a2Dx ([] @ KindRep)))
$krep_a2Dw [InlPrag=NOUSERINLINE[~]] :: KindRep
[LclId]
$krep_a2Dw = KindRepFun $krep_a2Dx $krep_a2Dy
$krep_a2Du [InlPrag=NOUSERINLINE[~]] :: KindRep
[LclId]
$krep_a2Du = KindRepFun $krep_a2Dv $krep_a2Dw
$tc'Pair :: TyCon
[LclIdX]
$tc'Pair
= TyCon
13419949030541524809##
8448108315116356699##
$trModule
(TrNameS "'Pair"#)
2#
$krep_a2Du
*** End of Offense ***
<no location info>: error:
Compilation had errors
*** Exception: ExitFailure 1
}}}
I've tried various combinations of `zonkTcTypes` and `zonkTcTypeToTypes`,
but none of them work, so I'm thoroughly stuck here.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14331#comment:47>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list