[GHC] #13410: GHC HEAD regression: Template variable unbound in rewrite rule
GHC
ghc-devs at haskell.org
Fri Mar 17 20:06:48 UTC 2017
#13410: GHC HEAD regression: Template variable unbound in rewrite rule
-------------------------------------+-------------------------------------
Reporter: RyanGlScott | Owner: (none)
Type: bug | Status: new
Priority: highest | Milestone: 8.2.1
Component: Compiler | Version: 8.1
Resolution: | Keywords: JoinPoints
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):
I reduced the file from ~400 lines to ~150 lines:
{{{#!hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
module Data.Vector.Hybrid.Internal (Vector) where
import Control.Monad (liftM2)
import Data.Functor.Identity (Identity(..))
import GHC.ST (ST, runST)
import Text.Read (ReadPrec, readPrec)
-----
class Monad m => PrimMonad m where
type PrimState m
instance PrimMonad (ST s) where
type PrimState (ST s) = s
class GMVector v a where
gmbasicLength :: v s a -> Int
gmbasicUnsafeSlice :: Int -> Int -> v s a -> v s a
gmbasicUnsafeNew :: PrimMonad m => Int -> m (v (PrimState m) a)
gmbasicUnsafeWrite :: PrimMonad m => v (PrimState m) a -> Int -> a -> m
()
type family GMutable (v :: * -> *) :: * -> * -> *
class GMVector (GMutable v) a => GVector v a where
gbasicUnsafeFreeze :: PrimMonad m => GMutable v (PrimState m) a -> m (v
a)
data Step s a where
Yield :: a -> s -> Step s a
instance Functor (Step s) where
{-# INLINE fmap #-}
fmap f (Yield x s) = Yield (f x) s
data Stream m a = forall s. Stream (s -> m (Step s a)) s
data Chunk v a = Chunk Int (forall m. (PrimMonad m, GVector v a) =>
GMutable v (PrimState m) a -> m ())
data New v a = New { newrun :: forall s. ST s (GMutable v s a) }
type MBundle m v a = Stream m (Chunk v a)
type Bundle v a = MBundle Identity v a
mbfromStream :: Monad m => Stream m a -> MBundle m v a
{-# INLINE mbfromStream #-}
mbfromStream (Stream step t) = Stream step' t
where
step' s = do r <- step s
return $ fmap (\x -> Chunk 1 (\v -> gmbasicUnsafeWrite v
0 x)) r
mbunsafeFromList :: Monad m => [a] -> MBundle m v a
{-# INLINE [1] mbunsafeFromList #-}
mbunsafeFromList xs = mbfromStream (sfromList xs)
blift :: Monad m => Bundle v a -> MBundle m v a
{-# INLINE [1] blift #-}
blift (Stream vstep t) = Stream (return . runIdentity . vstep) t
sfromList :: Monad m => [a] -> Stream m a
{-# INLINE sfromList #-}
sfromList zs = Stream step zs
where
step (x:xs) = return (Yield x xs)
step _ = undefined
sfoldlM :: Monad m => (a -> b -> m a) -> a -> Stream m b -> m a
{-# INLINE [1] sfoldlM #-}
sfoldlM m w (Stream step t) = foldlM_loop w t
where
foldlM_loop z s
= do
r <- step s
case r of
Yield x s' -> do { z' <- m z x; foldlM_loop z' s' }
gmvunstream :: (PrimMonad m, GVector v a)
=> Bundle v a -> m (GMutable v (PrimState m) a)
{-# INLINE [1] gmvunstream #-}
gmvunstream s = gmvmunstreamUnknown (blift s)
gmvmunstreamUnknown :: (PrimMonad m, GVector v a)
=> MBundle m v a -> m (GMutable v (PrimState m) a)
{-# INLINE gmvmunstreamUnknown #-}
gmvmunstreamUnknown s
= do
v <- gmbasicUnsafeNew 0
(_, _) <- sfoldlM copyChunk (v,0) s
return undefined
where
{-# INLINE [0] copyChunk #-}
copyChunk (v,i) (Chunk n f)
= do
let j = i+n
v' <- if gmbasicLength v < j
then gmbasicUnsafeNew undefined
else return v
f (gmbasicUnsafeSlice i n v')
return (v',j)
newunstream :: GVector v a => Bundle v a -> New v a
{-# INLINE [1] newunstream #-}
newunstream s = s `seq` New (gmvunstream s)
gnew :: GVector v a => New v a -> v a
{-# INLINE [1] gnew #-}
gnew m = m `seq` runST (gbasicUnsafeFreeze =<< newrun m)
gunstream :: GVector v a => Bundle v a -> v a
{-# INLINE gunstream #-}
gunstream s = gnew (newunstream s)
gfromList :: GVector v a => [a] -> v a
{-# INLINE gfromList #-}
gfromList = gunstream . mbunsafeFromList
greadPrec :: (GVector v a, Read a) => ReadPrec (v a)
{-# INLINE greadPrec #-}
greadPrec = do
xs <- readPrec
return (gfromList xs)
-----
data MVector :: (* -> * -> *) -> (* -> * -> *) -> * -> * -> * where
MV :: !(u s a) -> !(v s b) -> MVector u v s (a, b)
instance (GMVector u a, GMVector v b) => GMVector (MVector u v) (a, b)
where
gmbasicLength (MV ks _) = gmbasicLength ks
gmbasicUnsafeSlice s e (MV ks vs) = MV (gmbasicUnsafeSlice s e ks)
(gmbasicUnsafeSlice s e vs)
gmbasicUnsafeNew n = liftM2 MV (gmbasicUnsafeNew n) (gmbasicUnsafeNew n)
-- Removing this INLINE pragma makes it compile
{-# INLINE gmbasicUnsafeNew #-}
gmbasicUnsafeWrite (MV ks vs) n (k,v) = do
gmbasicUnsafeWrite ks n k
gmbasicUnsafeWrite vs n v
data Vector :: (* -> *) -> (* -> *) -> * -> *
type instance GMutable (Vector u v) = MVector (GMutable u) (GMutable v)
instance (GVector u a, GVector v b) => GVector (Vector u v) (a, b) where
gbasicUnsafeFreeze = undefined
instance (GVector u a, GVector v b, Read a, Read b, c ~ (a, b)) => Read
(Vector u v c) where
readPrec = greadPrec
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13410#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list