Support for -fwarn-unused-do-bind and -fwarn-wrong-do-bind, as per #3263
[ghc-hetmet.git] / compiler / utils / Panic.lhs
index ffd3b67..4f78aab 100644 (file)
@@ -11,19 +11,17 @@ some unnecessary loops in the module dependency graph.
 \begin{code}
 module Panic  
    ( 
-     GhcException(..), showGhcException, ghcError, progName, 
+     GhcException(..), showGhcException, throwGhcException, handleGhcException,
+     ghcError, progName,
      pgmError,
 
      panic, panicFastInt, assertPanic, trace,
      
-     Exception.Exception(..), showException, try, tryJust, tryMost, tryUser,
-     catchJust, ioErrors, throwTo,
+     Exception.Exception(..), showException, try, tryMost, throwTo,
 
      installSignalHandlers, interruptTargetThread
    ) where
 
--- XXX This define is a bit of a hack, and should be done more nicely
-#define FAST_STRING_NOT_NEEDED 1
 #include "HsVersions.h"
 
 import Config
@@ -33,17 +31,15 @@ import FastTypes
 import System.Posix.Signals
 #endif /* mingw32_HOST_OS */
 
-#if defined(mingw32_HOST_OS) && __GLASGOW_HASKELL__ >= 603
+#if defined(mingw32_HOST_OS)
 import GHC.ConsoleHandler
 #endif
 
-import Control.Exception
+import Exception
 import Control.Concurrent ( MVar, ThreadId, withMVar, newMVar )
 import Data.Dynamic
-import qualified Control.Exception as Exception
 import Debug.Trace     ( trace )
 import System.IO.Unsafe        ( unsafePerformIO )
-import System.IO.Error ( isUserError )
 import System.Exit
 import System.Environment
 \end{code}
@@ -52,7 +48,7 @@ GHC's own exception type.
 
 \begin{code}
 ghcError :: GhcException -> a
-ghcError e = Exception.throwDyn e
+ghcError e = Exception.throw e
 
 -- error messages all take the form
 --
@@ -74,18 +70,17 @@ data GhcException
   | ProgramError String                -- error in the user's code, probably
   deriving Eq
 
+instance Exception GhcException
+
 progName :: String
 progName = unsafePerformIO (getProgName)
 {-# NOINLINE progName #-}
 
 short_usage :: String
 short_usage = "Usage: For basic information, try the `--help' option."
-   
-showException :: Exception.Exception -> String
--- Show expected dynamic exceptions specially
-showException (Exception.DynException d) | Just e <- fromDynamic d 
-                                        = show (e::GhcException)
-showException other_exn                         = show other_exn
+
+showException :: Exception e => e -> String
+showException = show
 
 instance Show GhcException where
   showsPrec _ e@(ProgramError _) = showGhcException e
@@ -118,26 +113,25 @@ showGhcException (Panic s)
                 ++ s ++ "\n\n"
                 ++ "Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug\n")
 
-myMkTyConApp :: TyCon -> [TypeRep] -> TypeRep
-#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ < 603
-myMkTyConApp = mkAppTy
-#else 
-myMkTyConApp = mkTyConApp
-#endif
+throwGhcException :: GhcException -> a
+throwGhcException = Exception.throw
+
+handleGhcException :: ExceptionMonad m => (GhcException -> m a) -> m a -> m a
+handleGhcException = ghandle
 
 ghcExceptionTc :: TyCon
 ghcExceptionTc = mkTyCon "GhcException"
 {-# NOINLINE ghcExceptionTc #-}
 instance Typeable GhcException where
-  typeOf _ = myMkTyConApp ghcExceptionTc []
+  typeOf _ = mkTyConApp ghcExceptionTc []
 \end{code}
 
 Panics and asserts.
 
 \begin{code}
 panic, pgmError :: String -> a
-panic    x = Exception.throwDyn (Panic x)
-pgmError x = Exception.throwDyn (ProgramError x)
+panic    x = throwGhcException (Panic x)
+pgmError x = throwGhcException (ProgramError x)
 
 --  #-versions because panic can't return an unboxed int, and that's
 -- what TAG_ is with GHC at the moment.  Ugh. (Simon)
@@ -157,27 +151,26 @@ assertPanic file line =
 -- exceptions.  Used when we want soft failures when reading interface
 -- files, for example.
 
-tryMost :: IO a -> IO (Either Exception.Exception a)
-tryMost action = do r <- try action; filter r
-  where
-   filter (Left e@(Exception.DynException d))
-           | Just ghc_ex <- fromDynamic d
-               = case ghc_ex of
-                   Interrupted -> Exception.throw e
-                   Panic _     -> Exception.throw e
-                   _other      -> return (Left e)
-   filter other 
-     = return other
-
--- | tryUser is like try, but catches only UserErrors.
--- These are the ones that are thrown by the TcRn monad 
--- to signal an error in the program being compiled
-tryUser :: IO a -> IO (Either Exception.Exception a)
-tryUser action = tryJust tc_errors action
-  where 
-       tc_errors e@(Exception.IOException ioe) | isUserError ioe = Just e
-       tc_errors _other = Nothing
-\end{code}     
+-- XXX I'm not entirely sure if this is catching what we really want to catch
+tryMost :: IO a -> IO (Either SomeException a)
+tryMost action = do r <- try action
+                    case r of
+                        Left se ->
+                            case fromException se of
+                                -- Some GhcException's we rethrow,
+                                Just Interrupted -> throwIO se
+                                Just (Panic _)   -> throwIO se
+                                -- others we return
+                                Just _           -> return (Left se)
+                                Nothing ->
+                                    case fromException se of
+                                        -- All IOExceptions are returned
+                                        Just (_ :: IOException) ->
+                                            return (Left se)
+                                        -- Anything else is rethrown
+                                        Nothing -> throwIO se
+                        Right v -> return (Right v)
+\end{code}
 
 Standard signal handlers for catching ^C, which just throw an
 exception in the target thread.  The current target thread is
@@ -188,7 +181,7 @@ installSignalHandlers.
 installSignalHandlers :: IO ()
 installSignalHandlers = do
   let
-      interrupt_exn = Exception.DynException (toDyn Interrupted)
+      interrupt_exn = (toException Interrupted)
 
       interrupt = do
        withMVar interruptTargetThread $ \targets ->
@@ -197,10 +190,10 @@ installSignalHandlers = do
           (thread:_) -> throwTo thread interrupt_exn
   --
 #if !defined(mingw32_HOST_OS)
-  installHandler sigQUIT (Catch interrupt) Nothing 
-  installHandler sigINT  (Catch interrupt) Nothing
+  _ <- installHandler sigQUIT (Catch interrupt) Nothing 
+  _ <- installHandler sigINT  (Catch interrupt) Nothing
   return ()
-#elif __GLASGOW_HASKELL__ >= 603
+#else
   -- GHC 6.3+ has support for console events on Windows
   -- NOTE: running GHCi under a bash shell for some reason requires
   -- you to press Ctrl-Break rather than Ctrl-C to provoke
@@ -212,8 +205,6 @@ installSignalHandlers = do
 
   installHandler (Catch sig_handler)
   return ()
-#else
-  return () -- nothing
 #endif
 
 {-# NOINLINE interruptTargetThread #-}