[project @ 2002-05-09 10:43:26 by simonmar]
[ghc-base.git] / GHC / Err.lhs
1 \begin{code}
2 {-# OPTIONS -fno-implicit-prelude #-}
3 -----------------------------------------------------------------------------
4 -- |
5 -- Module      :  GHC.Err
6 -- Copyright   :  (c) The University of Glasgow, 1994-2002
7 -- License     :  see libraries/base/LICENSE
8 -- 
9 -- Maintainer  :  cvs-ghc@haskell.org
10 -- Stability   :  internal
11 -- Portability :  non-portable (GHC extensions)
12 --
13 -- The "GHC.Err" module defines the code for the wired-in error functions,
14 -- which have a special type in the compiler (with \"open tyvars\").
15 -- 
16 -- We cannot define these functions in a module where they might be used
17 -- (e.g., "GHC.Base"), because the magical wired-in type will get confused
18 -- with what the typechecker figures out.
19 -- 
20 -----------------------------------------------------------------------------
21
22 module GHC.Err 
23        (
24          irrefutPatError
25        , noMethodBindingError
26        , nonExhaustiveGuardsError
27        , patError
28        , recSelError
29        , recConError
30        , runtimeError              -- :: Addr#  -> a    -- Addr# points to UTF8 encoded C string
31
32        , absentErr, parError       -- :: a
33        , seqError                  -- :: a
34
35        , error                     -- :: String -> a
36        , assertError               -- :: String -> Bool -> a -> a
37        
38        , undefined                 -- :: a
39        ) where
40
41 #ifndef __HADDOCK__
42 import GHC.Base
43 import GHC.List     ( span )
44 import GHC.Exception
45 #endif
46 \end{code}
47
48 %*********************************************************
49 %*                                                      *
50 \subsection{Error-ish functions}
51 %*                                                      *
52 %*********************************************************
53
54 \begin{code}
55 -- error stops execution and displays an error message
56 error :: String -> a
57 error s = throw (ErrorCall s)
58
59 -- It is expected that compilers will recognize this and insert error
60 -- messages which are more appropriate to the context in which undefined 
61 -- appears. 
62
63 undefined :: a
64 undefined =  error "Prelude.undefined"
65 \end{code}
66
67 %*********************************************************
68 %*                                                       *
69 \subsection{Compiler generated errors + local utils}
70 %*                                                       *
71 %*********************************************************
72
73 Used for compiler-generated error message;
74 encoding saves bytes of string junk.
75
76 \begin{code}
77 absentErr, parError, seqError :: a
78
79 absentErr = error "Oops! The program has entered an `absent' argument!\n"
80 parError  = error "Oops! Entered GHCerr.parError (a GHC bug -- please report it!)\n"
81 seqError  = error "Oops! Entered seqError (a GHC bug -- please report it!)\n"
82 \end{code}
83
84 \begin{code}
85 recSelError, recConError, irrefutPatError, runtimeError,
86              nonExhaustiveGuardsError, patError, noMethodBindingError
87         :: Addr# -> a   -- All take a UTF8-encoded C string
88
89 recSelError              s = throw (RecSelError (unpackCStringUtf8# s)) -- No location info unfortunately
90 runtimeError             s = error (unpackCStringUtf8# s)               -- No location info unfortunately
91
92 nonExhaustiveGuardsError s = throw (PatternMatchFail (untangle s "Non-exhaustive guards in"))
93 irrefutPatError          s = throw (PatternMatchFail (untangle s "Irrefutable pattern failed for pattern"))
94 recConError              s = throw (RecConError      (untangle s "Missing field in record construction"))
95 noMethodBindingError     s = throw (NoMethodError    (untangle s "No instance nor default method for class operation"))
96 patError                 s = throw (PatternMatchFail (untangle s "Non-exhaustive patterns in"))
97
98 assertError :: Addr# -> Bool -> a -> a
99 assertError str pred v 
100   | pred      = v
101   | otherwise = throw (AssertionFailed (untangle str "Assertion failed"))
102 \end{code}
103
104
105 (untangle coded message) expects "coded" to be of the form 
106
107         "location|details"
108
109 It prints
110
111         location message details
112
113 \begin{code}
114 untangle :: Addr# -> String -> String
115 untangle coded message
116   =  location
117   ++ ": " 
118   ++ message
119   ++ details
120   ++ "\n"
121   where
122     coded_str = unpackCStringUtf8# coded
123
124     (location, details)
125       = case (span not_bar coded_str) of { (loc, rest) ->
126         case rest of
127           ('|':det) -> (loc, ' ' : det)
128           _         -> (loc, "")
129         }
130     not_bar c = c /= '|'
131 \end{code}