I'm currently stuck.
CgCase.cgEvalAlts gets invoked with a PrimAlt alt_type (second equation of cgEvalAlts) where the (tyConArgRep tycon) is VoidArg, and so it panics. The scrutinee of the case expression is the return value of putMVar#, which is a State#.
I don't know all that case alternatives code generation magic well enough to extend cgEvalAlts to handle void scrutinees.
It doesn't always happen when putMVar# is used, but I don't know why not.
Below you'll find a cut-down module that only depends on GHC.Prim and GHC.Base to reproduce the problem.


Cheers,

Wolfgang

-- cut here --

{-# OPTIONS -fno-implicit-prelude -fglasgow-exts -O -fasm #-}
module CgEvalAltsPanic where
import GHC.Prim
import GHC.Base

-- from GHC.IOBase
newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))
unIO :: IO a -> (State# RealWorld -> (# State# RealWorld, a #))
unIO (IO a) = a

thenIO :: IO a -> IO b -> IO b
thenIO (IO m) k = IO ( \ s ->
  case m s of
    (# new_s, a #) -> unIO k new_s
  )

-- slightly simplified :-)
data Exception = Foo | Bar

-- from GHC.Conc
data MVar a = MVar (MVar# RealWorld a)

putMVar  :: MVar a -> a -> IO ()
putMVar (MVar mvar#) x = IO $ \ s# ->
    case putMVar# mvar# x s# of
        s2# -> (# s2#, () #)

-- this triggers the problem
bug :: MVar a -> a -> Exception -> IO ()
bug m h_ err = putMVar m h_ `thenIO` case err of
                             Foo -> IO (raiseIO# err)
                             _ -> IO (raiseIO# err)


_______________________________________________ Cvs-ghc mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to