X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Futils%2FPanic.lhs;h=e4c8cdaae9ed60be6d8773bf99fe7c727cecff6a;hb=5ca4a0134475bbc790af6ce7d7517a97e877bff6;hp=3210b00d25d43ecc1fbcb7a284dd7f598f741542;hpb=7752abc1008b633fdc7a0b9f283ceca40747b609;p=ghc-hetmet.git diff --git a/ghc/compiler/utils/Panic.lhs b/ghc/compiler/utils/Panic.lhs index 3210b00..e4c8cda 100644 --- a/ghc/compiler/utils/Panic.lhs +++ b/ghc/compiler/utils/Panic.lhs @@ -12,9 +12,11 @@ some unnecessary loops in the module dependency graph. module Panic ( GhcException(..), ghcError, progName, - panic, panic#, assertPanic, trace + panic, panic#, assertPanic, trace, + showGhcException ) where +import Config import FastTypes import Dynamic @@ -31,12 +33,24 @@ GHC's own exception type. ghcError :: GhcException -> a ghcError e = throwDyn e +-- error messages all take the form +-- +-- : +-- +-- If the location is on the command line, or in GHC itself, then +-- ="ghc". All of the error types below correspond to +-- a of "ghc", except for ProgramError (where the string is +-- assumed to contain a location already, so we don't print one). + data GhcException - = PhaseFailed String ExitCode - | Interrupted + = PhaseFailed String -- name of phase + ExitCode -- an external phase (eg. cpp) failed + | Interrupted -- someone pressed ^C | UsageError String -- prints the short usage msg after the error + | CmdLineError String -- cmdline prob, but doesn't print usage | Panic String -- the `impossible' happened - | OtherError String -- just prints the error message + | InstallationError String -- an installation problem + | ProgramError String -- error in the user's code, probably deriving Eq progName = unsafePerformIO (getProgName) @@ -45,21 +59,35 @@ progName = unsafePerformIO (getProgName) short_usage = "Usage: For basic information, try the `--help' option." instance Show GhcException where - showsPrec _ e = showString progName . showString ": " . showBarf e + showsPrec _ e@(ProgramError _) = showGhcException e + showsPrec _ e = showString progName . showString ": " . showGhcException e -showBarf (UsageError str) +showGhcException (UsageError str) = showString str . showChar '\n' . showString short_usage -showBarf (OtherError str) +showGhcException (PhaseFailed phase code) + = showString "phase `" . showString phase . + showString "' failed (exitcode = " . shows int_code . + showString ")" + where + int_code = + case code of + ExitSuccess -> (0::Int) + ExitFailure x -> x +showGhcException (CmdLineError str) + = showString str +showGhcException (ProgramError str) + = showString str +showGhcException (InstallationError str) = showString str -showBarf (PhaseFailed phase code) - = showString phase . showString " failed, code = " . shows code -showBarf (Interrupted) +showGhcException (Interrupted) = showString "interrupted" -showBarf (Panic s) - = showString ("panic! (the `impossible' happened):\n\t" +showGhcException (Panic s) + = showString ("panic! (the `impossible' happened, GHC version " + ++ cProjectVersion ++ "):\n\t" ++ s ++ "\n\n" ++ "Please report it as a compiler bug " - ++ "to glasgow-haskell-bugs@haskell.org.\n\n") + ++ "to glasgow-haskell-bugs@haskell.org,\n" + ++ "or http://sourceforge.net/projects/ghc/.\n\n") ghcExceptionTc = mkTyCon "GhcException" {-# NOINLINE ghcExceptionTc #-}