[GHC] #16312: Optimization + adding an INLINE pragma triggers Core Lint error (Type of case alternatives not the same as the annotation on case)
GHC
ghc-devs at haskell.org
Wed Feb 13 01:08:48 UTC 2019
#16312: Optimization + adding an INLINE pragma triggers Core Lint error (Type of
case alternatives not the same as the annotation on case)
-------------------------------------+-------------------------------------
Reporter: RyanGlScott | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.6.3
Keywords: | 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:
-------------------------------------+-------------------------------------
Here's a seemingly innocuous program, minimized from the `kan-extensions`
library:
{{{#!hs
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
module Bug where
newtype Curried g h a =
Curried { runCurried :: forall r. g (a -> r) -> h r }
instance Functor g => Functor (Curried g h) where
fmap f (Curried g) = Curried (g . fmap (.f))
instance (Functor g, g ~ h) => Applicative (Curried g h) where
pure a = Curried (fmap ($a))
Curried mf <*> Curried ma = Curried (ma . mf . fmap (.))
{-# INLINE (<*>) #-}
-- The Core Lint error goes away if you remove this INLINE pragma
}}}
However, it triggers a Core Lint error on GHC 8.2.2 through HEAD if you
compile it with `-O` and `-dcore-lint`:
{{{
$ /opt/ghc/8.6.3/bin/ghc -fforce-recomp -dcore-lint Bug.hs -O
[1 of 1] Compiling Bug ( Bug.hs, Bug.o )
*** Core Lint errors : in result of Simplifier ***
<no location info>: warning:
In the expression: (case heq_sel
@ (* -> *)
@ (* -> *)
@ h_a1eC
@ h_a1eC
($d~_a1eE
`cast` (((~) <* -> *>_N co_a1hx
<h_a1eC>_N)_R ; N:~[0]
<*
-> *>_N <h_a1eC>_N <h_a1eC>_N
:: (g_a1eB ~ h_a1eC) ~R# (h_a1eC
~~ h_a1eC)))
of co_X1ij
{ __DEFAULT ->
(\ (@ a_a1fg)
(@ b_a1fh)
(ds_d1yw :: Curried h_a1eC h_a1eC (a_a1fg ->
b_a1fh))
(ds_d1yx :: Curried h_a1eC h_a1eC a_a1fg)
(@ r_a1fn) ->
let {
g_X1zi
:: h_a1eC (b_a1fh -> r_a1fn)
-> h_a1eC ((a_a1fg -> b_a1fh) -> a_a1fg
-> r_a1fn)
[LclId,
Unf=Unf{Src=<vanilla>, TopLvl=False,
Value=False, ConLike=False,
WorkFree=False, Expandable=False,
Guidance=IF_ARGS [] 30 0}]
g_X1zi
= fmap
@ h_a1eC
($dFunctor_a1eD
`cast` ((Functor co_a1hx)_R
:: Functor g_a1eB ~R# Functor
h_a1eC))
@ (b_a1fh -> r_a1fn)
@ ((a_a1fg -> b_a1fh) -> a_a1fg ->
r_a1fn)
(. @ b_a1fh @ r_a1fn @ a_a1fg) } in
\ (x_X1zn :: h_a1eC (b_a1fh -> r_a1fn)) ->
(ds_d1yx
`cast` (N:Curried[0] <h_a1eC>_R <h_a1eC>_R
<a_a1fg>_N
:: Curried h_a1eC h_a1eC a_a1fg
~R# (forall r. h_a1eC (a_a1fg ->
r) -> h_a1eC r)))
@ r_a1fn
((ds_d1yw
`cast` (N:Curried[0] <h_a1eC>_R
<h_a1eC>_R <a_a1fg -> b_a1fh>_N
:: Curried h_a1eC h_a1eC (a_a1fg
-> b_a1fh)
~R# (forall r.
h_a1eC ((a_a1fg ->
b_a1fh) -> r) -> h_a1eC r)))
@ (a_a1fg -> r_a1fn) (g_X1zi x_X1zn)))
`cast` (forall (a :: <*>_N) (b :: <*>_N).
<Curried h_a1eC h_a1eC (a -> b)>_R
->_R <Curried h_a1eC h_a1eC a>_R
->_R Sym (N:Curried[0] <h_a1eC>_R
<h_a1eC>_R <b>_N)
:: (forall a b.
Curried h_a1eC h_a1eC (a -> b)
-> Curried h_a1eC h_a1eC a
-> forall r. h_a1eC (b -> r) -> h_a1eC
r)
~R# (forall a b.
Curried h_a1eC h_a1eC (a -> b)
-> Curried h_a1eC h_a1eC a ->
Curried h_a1eC h_a1eC b))
})
@ b_a1gi
@ b_a1gi
((<$
@ (Curried g_a1eB h_a1eC)
($dFunctor_s1zH
`cast` ((Functor (Curried (Sym co_a1hx)
<h_a1eC>_N)_N)_R
:: Functor (Curried h_a1eC h_a1eC)
~R# Functor (Curried g_a1eB
h_a1eC)))
@ (b_a1gi -> b_a1gi)
@ a_a1gh
(breakpoint @ b_a1gi)
a1_a1z1)
`cast` (Sym (Curried
(Sub (Sym co_a1hx)) <h_a1eC>_R
<b_a1gi -> b_a1gi>_N)_R
:: Curried g_a1eB h_a1eC (b_a1gi ->
b_a1gi)
~R# Curried h_a1eC h_a1eC (b_a1gi ->
b_a1gi)))
(a2_a1z2
`cast` (Sym (Curried (Sub (Sym co_a1hx))
<h_a1eC>_R <b_a1gi>_N)_R
:: Curried g_a1eB h_a1eC b_a1gi ~R#
Curried h_a1eC h_a1eC b_a1gi))
Type of case alternatives not the same as the annotation on case:
Actual type: forall a b.
Curried h_a1eC h_a1eC (a -> b)
-> Curried h_a1eC h_a1eC a -> Curried h_a1eC h_a1eC b
Annotation on case: forall a b.
Curried g_a1eB h_a1eC (a -> b)
-> Curried g_a1eB h_a1eC a -> Curried g_a1eB
h_a1eC b
}}}
The size of the `-dcore-lint` output is enormous, so I'll post it
separately as an attachment.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/16312>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list