[GHC] #15549: Core Lint error with EmptyCase (was: Core Lint error with empty closed type family)
GHC
ghc-devs at haskell.org
Tue Aug 21 18:06:06 UTC 2018
#15549: Core Lint error with EmptyCase
-------------------------------------+-------------------------------------
Reporter: RyanGlScott | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone: 8.6.1
Component: Compiler (Type | Version: 8.4.3
checker) | Keywords: TypeFamilies,
Resolution: | TypeInType
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 RyanGlScott):
Never mind, empty closed type families have nothing to do with this.
Here's an even more minimal way to reproduce the Core Lint error:
{{{#!hs
{-# LANGUAGE EmptyCase #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeInType #-}
module Bug where
import Data.Proxy
import Data.Void
data family Sing (a :: k)
data instance Sing (z :: Void)
type family Rep a
class SGeneric a where
sTo :: forall (r :: Rep a). Sing r -> Proxy a
type instance Rep Void = Void
instance SGeneric Void where
sTo x = case x of
}}}
{{{
$ /opt/ghc/8.4.3/bin/ghc Bug.hs -dcore-lint
[1 of 1] Compiling Bug ( Bug.hs, Bug.o )
*** Core Lint errors : in result of Simplifier ***
Bug.hs:19:7: warning:
[in body of lambda with binder x_ayn :: Sing r_azJ]
Kind application error in
coercion ‘(Sing (D:R:RepVoid[0]) <r_azJ>_N)_R’
Function kind = forall k. k -> *
Arg kinds = [(Void, *), (r_azJ, Rep Void)]
Fun: Void
(r_azJ, Rep Void)
Bug.hs:19:7: warning:
[in body of lambda with binder x_ayn :: Sing r_azJ]
Kind application error in coercion ‘D:R:SingVoidz0[0] <r_azJ>_N’
Function kind = Void -> *
Arg kinds = [(r_azJ, Rep Void)]
Fun: Void
(r_azJ, Rep Void)
Bug.hs:19:7: warning:
[in body of lambda with binder x_ayn :: Sing r_azJ]
Kind application error in coercion ‘D:R:SingVoidz0[0] <r_azJ>_N’
Function kind = Void -> *
Arg kinds = [(r_azJ, Rep Void)]
Fun: Void
(r_azJ, Rep Void)
<no location info>: warning:
In the type ‘R:SingVoidz r_azJ’
Kind application error in type ‘R:SingVoidz r_azJ’
Function kind = Void -> *
Arg kinds = [(r_azJ, Rep Void)]
Fun: Void
(r_azJ, Rep Void)
<no location info>: warning:
In the type ‘R:SingVoidz r_azJ’
Kind application error in type ‘R:SingVoidz r_azJ’
Function kind = Void -> *
Arg kinds = [(r_azJ, Rep Void)]
Fun: Void
(r_azJ, Rep Void)
*** Offending Program ***
$csTo_azH :: forall (r :: Rep Void). Sing r -> Proxy Void
[LclId,
Arity=1,
Str=<L,U>x,
Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True,
Guidance=ALWAYS_IF(arity=1,unsat_ok=True,boring_ok=True)}]
$csTo_azH
= \ (@ (r_azJ :: Rep Void)) (x_ayn :: Sing r_azJ) ->
case x_ayn
`cast` ((Sing
(D:R:RepVoid[0]) <r_azJ>_N)_R ; D:R:SingVoidz0[0]
<r_azJ>_N
:: (Sing r_azJ :: *) ~R# (R:SingVoidz r_azJ :: *))
of nt_s14C {
}
}}}
However, `EmptyCase` does appear to play an important role. If I change
the implementation of `sTo` to this:
{{{#!hs
instance SGeneric Void where
sTo x = x `seq` undefined
}}}
Then the Core Lint error goes away, and the generated Core for `sTo`
instead becomes:
{{{
$csTo_r2IT :: forall (r :: Rep Void). Sing r -> Proxy Void
[GblId, Arity=1, Caf=NoCafRefs]
$csTo_r2IT
= \ (@ (r_a1F4 :: Rep Void)) (x_X1DH :: Sing r_a1F4) ->
break<0>(x_X1DH)
case x_X1DH
`cast` ((Sing
(Bug.D:R:RepVoid[0])
(Sym (Coh <r_a1F4>_N
(Bug.D:R:RepVoid[0]))))_R ;
Bug.D:R:SingVoidz0[0] (Sym (Coh (Sym (Coh <r_a1F4>_N
(Bug.D:R:RepVoid[0])))
(Bug.D:R:RepVoid[0])))
:: (Sing r_a1F4 :: *)
~R# (Bug.R:SingVoidz (r_a1F4 |> Bug.D:R:RepVoid[0])
:: *))
of {
}
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15549#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list