[project @ 1996-06-05 06:44:31 by partain]
[ghc-hetmet.git] / ghc / compiler / rename / RnMonad.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
3 %
4 \section[RnMonad]{The monad used by the renamer}
5
6 \begin{code}
7 #include "HsVersions.h"
8
9 module RnMonad (
10         RnMonad(..), RnM(..), RnM_Fixes(..), RnDown, SST_R,
11         initRn, thenRn, thenRn_, andRn, returnRn,
12         mapRn, mapAndUnzipRn, mapAndUnzip3Rn,
13
14         addErrRn, addErrIfRn, addWarnRn, addWarnIfRn,
15         failButContinueRn, warnAndContinueRn,
16         setExtraRn, getExtraRn, getRnEnv,
17         getModuleRn, pushSrcLocRn, getSrcLocRn,
18         getSourceRn, getOccurrenceUpRn,
19         getImplicitUpRn, ImplicitEnv(..), emptyImplicitEnv,
20         rnGetUnique, rnGetUniques,
21
22         newLocalNames,
23         lookupValue, lookupConstr, lookupField, lookupClassOp,
24         lookupTyCon, lookupClass, lookupTyConOrClass,
25         extendSS2, extendSS,
26
27         TyVarNamesEnv(..), mkTyVarNamesEnv, domTyVarNamesEnv,
28         lookupTyVarName, nullTyVarNamesEnv, catTyVarNamesEnvs,
29
30         fixIO
31     ) where
32
33 IMP_Ubiq(){-uitous-}
34
35 import SST
36
37 import HsSyn            ( FixityDecl )
38 import RnHsSyn          ( RnName, mkRnName, mkRnUnbound, mkRnImplicit,
39                           mkRnImplicitTyCon, mkRnImplicitClass, 
40                           isRnLocal, isRnWired, isRnTyCon, isRnClass,
41                           isRnTyConOrClass, isRnConstr, isRnField,
42                           isRnClassOp, RenamedFixityDecl(..) )
43 import RnUtils          ( RnEnv(..), extendLocalRnEnv,
44                           lookupRnEnv, lookupGlobalRnEnv, lookupTcRnEnv,
45                           qualNameErr, dupNamesErr
46                         )
47
48 import Bag              ( Bag, emptyBag, isEmptyBag, snocBag )
49 import CmdLineOpts      ( opt_WarnNameShadowing )
50 import ErrUtils         ( addErrLoc, addShortErrLocLine, addShortWarnLocLine,
51                           Error(..), Warning(..)
52                         )
53 import FiniteMap        ( FiniteMap, emptyFM, lookupFM, addToFM, fmToList{-ToDo:rm-} )
54 import Maybes           ( assocMaybe )
55 import Name             ( Module(..), RdrName(..), isQual,
56                           Name, mkLocalName, mkImplicitName,
57                           getOccName, pprNonSym
58                         )
59 import PrelInfo         ( builtinNameInfo, BuiltinNames(..), BuiltinKeys(..) )
60 import PrelMods         ( pRELUDE )
61 import PprStyle{-ToDo:rm-}
62 import Outputable{-ToDo:rm-}
63 import Pretty--ToDo:rm          ( Pretty(..), PrettyRep )
64 import SrcLoc           ( SrcLoc, mkUnknownSrcLoc )
65 import UniqFM           ( UniqFM, emptyUFM )
66 import UniqSet          ( UniqSet(..), mkUniqSet, minusUniqSet )
67 import UniqSupply       ( UniqSupply, getUnique, getUniques, splitUniqSupply )
68 import Unique           ( Unique )
69 import Util
70
71 infixr 9 `thenRn`, `thenRn_`
72 \end{code}
73
74 \begin{code}
75 type RnM s r       = RnMonad () s r
76 type RnM_Fixes s r = RnMonad (UniqFM RenamedFixityDecl) s r
77
78 type RnMonad x s r = RnDown x s -> SST s r
79
80 data RnDown x s
81   = RnDown
82         x
83         Module                          -- Module name
84         SrcLoc                          -- Source location
85         (RnMode s)                      -- Source or Iface
86         RnEnv                           -- Renaming environment
87         (MutableVar s UniqSupply)       -- Unique supply
88         (MutableVar s (Bag Warning,     -- Warnings and Errors
89                        Bag Error))
90
91 data RnMode s
92  = RnSource (MutableVar s (Bag (RnName, RdrName)))
93         -- Renaming source; returning occurences
94
95  | RnIface  BuiltinNames BuiltinKeys
96             (MutableVar s ImplicitEnv)
97         -- Renaming interface; creating and returning implicit names
98         -- ImplicitEnv: one map for Values and one for TyCons/Classes.
99
100 type ImplicitEnv = (FiniteMap RdrName RnName, FiniteMap RdrName RnName)
101 emptyImplicitEnv :: ImplicitEnv
102 emptyImplicitEnv = (emptyFM, emptyFM)
103
104 -- With a builtin polymorphic type for _runSST the type for
105 -- initTc should use  RnM s r  instead of  RnM _RealWorld r 
106
107 initRn :: Bool          -- True => Source; False => Iface
108        -> Module
109        -> RnEnv
110        -> UniqSupply
111        -> RnM _RealWorld r
112        -> (r, Bag Error, Bag Warning)
113
114 initRn source mod env us do_rn
115   = _runSST (
116         newMutVarSST emptyBag                   `thenSST` \ occ_var ->
117         newMutVarSST emptyImplicitEnv           `thenSST` \ imp_var ->
118         newMutVarSST us                         `thenSST` \ us_var ->
119         newMutVarSST (emptyBag,emptyBag)        `thenSST` \ errs_var ->
120         let
121             mode = if source then
122                        RnSource occ_var
123                    else
124                        case builtinNameInfo of { (wiredin_fm, key_fm, _) ->
125                        RnIface wiredin_fm key_fm imp_var }
126
127             rn_down = RnDown () mod mkUnknownSrcLoc mode env us_var errs_var
128         in
129         -- do the buisness
130         do_rn rn_down                           `thenSST` \ res ->
131
132         -- grab errors and return
133         readMutVarSST errs_var                  `thenSST` \ (warns,errs) ->
134         returnSST (res, errs, warns)
135     )
136
137 {-# INLINE thenRn #-}
138 {-# INLINE thenRn_ #-}
139 {-# INLINE returnRn #-}
140 {-# INLINE andRn #-}
141
142 returnRn :: a -> RnMonad x s a
143 thenRn   :: RnMonad x s a -> (a -> RnMonad x s b) -> RnMonad x s b
144 thenRn_  :: RnMonad x s a -> RnMonad x s b -> RnMonad x s b
145 andRn    :: (a -> a -> a) -> RnMonad x s a -> RnMonad x s a -> RnMonad x s a
146 mapRn    :: (a -> RnMonad x s b) -> [a] -> RnMonad x s [b]
147 mapAndUnzipRn :: (a -> RnMonad x s (b,c)) -> [a] -> RnMonad x s ([b],[c])
148
149 returnRn v down  = returnSST v
150 thenRn m k down  = m down `thenSST` \ r -> k r down
151 thenRn_ m k down = m down `thenSST_` k down
152
153 andRn combiner m1 m2 down
154   = m1 down `thenSST` \ res1 ->
155     m2 down `thenSST` \ res2 ->
156     returnSST (combiner res1 res2)
157
158 mapRn f []     = returnRn []
159 mapRn f (x:xs)
160   = f x         `thenRn` \ r ->
161     mapRn f xs  `thenRn` \ rs ->
162     returnRn (r:rs)
163
164 mapAndUnzipRn f [] = returnRn ([],[])
165 mapAndUnzipRn f (x:xs)
166   = f x                 `thenRn` \ (r1,  r2)  ->
167     mapAndUnzipRn f xs  `thenRn` \ (rs1, rs2) ->
168     returnRn (r1:rs1, r2:rs2)
169
170 mapAndUnzip3Rn f [] = returnRn ([],[],[])
171 mapAndUnzip3Rn f (x:xs)
172   = f x                 `thenRn` \ (r1,  r2,  r3)  ->
173     mapAndUnzip3Rn f xs `thenRn` \ (rs1, rs2, rs3) ->
174     returnRn (r1:rs1, r2:rs2, r3:rs3)
175 \end{code}
176
177 For errors and warnings ...
178 \begin{code}
179 failButContinueRn :: a -> Error -> RnMonad x s a
180 failButContinueRn res err (RnDown _ _ _ _ _ _ errs_var)
181   = readMutVarSST  errs_var                             `thenSST`  \ (warns,errs) ->
182     writeMutVarSST errs_var (warns, errs `snocBag` err) `thenSST_` 
183     returnSST res
184
185 warnAndContinueRn :: a -> Warning -> RnMonad x s a
186 warnAndContinueRn res warn (RnDown _ _ _ _ _ _ errs_var)
187   = readMutVarSST  errs_var                              `thenSST`  \ (warns,errs) ->
188     writeMutVarSST errs_var (warns `snocBag` warn, errs) `thenSST_` 
189     returnSST res
190
191 addErrRn :: Error -> RnMonad x s ()
192 addErrRn err = failButContinueRn () err
193
194 addErrIfRn :: Bool -> Error -> RnMonad x s ()
195 addErrIfRn True err  = addErrRn err
196 addErrIfRn False err = returnRn ()
197
198 addWarnRn :: Warning -> RnMonad x s ()
199 addWarnRn warn = warnAndContinueRn () warn
200
201 addWarnIfRn :: Bool -> Warning -> RnMonad x s ()
202 addWarnIfRn True warn  = addWarnRn warn
203 addWarnIfRn False warn = returnRn ()
204 \end{code}
205
206
207 \begin{code}
208 getRnEnv :: RnMonad x s RnEnv
209 getRnEnv (RnDown _ _ _ _ env _ _)
210   = returnSST env
211
212 setExtraRn :: x -> RnMonad x s r -> RnMonad y s r
213 setExtraRn x m (RnDown _ mod locn mode env us errs)
214   = m (RnDown x mod locn mode env us errs)
215
216 getExtraRn :: RnMonad x s x
217 getExtraRn (RnDown x _ _ _ _ _ _)
218   = returnSST x
219
220 getModuleRn :: RnMonad x s Module
221 getModuleRn (RnDown _ mod _ _ _ _ _)
222   = returnSST mod
223
224 pushSrcLocRn :: SrcLoc -> RnMonad x s a -> RnMonad x s a
225 pushSrcLocRn locn m (RnDown x mod _ mode env us errs)
226   = m (RnDown x mod locn mode env us errs)
227
228 getSrcLocRn :: RnMonad x s SrcLoc
229 getSrcLocRn (RnDown _ _ locn _ _ _ _)
230   = returnSST locn
231
232 getSourceRn :: RnMonad x s Bool
233 getSourceRn (RnDown _ _ _ (RnSource _)    _ _ _) = returnSST True
234 getSourceRn (RnDown _ _ _ (RnIface _ _ _) _ _ _) = returnSST False
235
236 getOccurrenceUpRn :: RnMonad x s (Bag (RnName, RdrName))
237 getOccurrenceUpRn (RnDown _ _ _ (RnSource occ_var) _ _ _)
238   = readMutVarSST occ_var
239 getOccurrenceUpRn (RnDown _ _ _ (RnIface _ _ _) _ _ _)
240   = panic "getOccurrenceUpRn:RnIface"
241
242 getImplicitUpRn :: RnMonad x s ImplicitEnv
243 getImplicitUpRn (RnDown _ _ _ (RnIface _ _ imp_var) _ _ _)
244   = readMutVarSST imp_var
245 getImplicitUpRn (RnDown _ _ _(RnSource _) _ _ _)
246   = panic "getImplicitUpRn:RnIface"
247 \end{code}
248
249 \begin{code}
250 rnGetUnique :: RnMonad x s Unique
251 rnGetUnique (RnDown _ _ _ _ _ us_var _)
252   = get_unique us_var
253
254 rnGetUniques :: Int -> RnMonad x s [Unique]
255 rnGetUniques n (RnDown _ _ _ _ _ us_var _)
256   = get_uniques n us_var
257
258
259 get_unique us_var
260   = readMutVarSST us_var                        `thenSST` \ uniq_supply ->
261     let
262       (new_uniq_supply, uniq_s) = splitUniqSupply uniq_supply
263       uniq                      = getUnique uniq_s
264     in
265     writeMutVarSST us_var new_uniq_supply       `thenSST_`
266     returnSST uniq
267
268 get_uniques n us_var
269   = readMutVarSST us_var                        `thenSST` \ uniq_supply ->
270     let
271       (new_uniq_supply, uniq_s) = splitUniqSupply uniq_supply
272       uniqs                     = getUniques n uniq_s
273     in
274     writeMutVarSST us_var new_uniq_supply       `thenSST_`
275     returnSST uniqs
276
277 snoc_bag_var add bag_var
278   = readMutVarSST bag_var       `thenSST` \ bag ->
279     writeMutVarSST bag_var (bag `snocBag` add)
280
281 \end{code}
282
283 *********************************************************
284 *                                                       *
285 \subsection{Making new names}
286 *                                                       *
287 *********************************************************
288
289 @newLocalNames@ takes a bunch of RdrNames, which are defined together
290 in a group (eg a pattern or set of bindings), checks they are
291 unqualified and distinct, and creates new Names for them.
292
293 \begin{code}
294 newLocalNames :: String                 -- Documentation string
295               -> [(RdrName, SrcLoc)]
296               -> RnMonad x s [RnName]
297
298 newLocalNames str names_w_loc
299   = mapRn (addErrRn . qualNameErr str) quals    `thenRn_`
300     mapRn (addErrRn . dupNamesErr str) dups     `thenRn_`
301     mkLocalNames these
302   where
303     quals = filter (isQual.fst) names_w_loc
304     (these, dups) = removeDups cmp_fst names_w_loc
305     cmp_fst (a,_) (b,_) = cmp a b
306 \end{code}
307
308 \begin{code}
309 mkLocalNames :: [(RdrName, SrcLoc)] -> RnMonad x s [RnName]
310 mkLocalNames names_w_locs
311   = rnGetUniques (length names_w_locs)  `thenRn` \ uniqs ->
312     returnRn (zipWithEqual "mkLocalNames" new_local uniqs names_w_locs)
313   where
314     new_local uniq (Unqual str, srcloc)
315       = mkRnName (mkLocalName uniq str False{-emph names-} srcloc)
316 \end{code}
317
318
319 *********************************************************
320 *                                                       *
321 \subsection{Looking up values}
322 *                                                       *
323 *********************************************************
324
325 Action to look up a value depends on the RnMode.
326 \begin{description}
327 \item[RnSource:]
328 Lookup value in RnEnv, recording occurrence for non-local values found.
329 If not found report error and return Unbound name.
330 \item[RnIface:]
331 Lookup value in RnEnv. If not found lookup in implicit name env.
332 If not found create new implicit name, adding it to the implicit env.
333 \end{description}
334
335 \begin{code}
336 lookupValue      :: RdrName -> RnMonad x s RnName
337 lookupConstr     :: RdrName -> RnMonad x s RnName
338 lookupField      :: RdrName -> RnMonad x s RnName
339 lookupClassOp    :: RnName  -> RdrName -> RnMonad x s RnName
340
341 lookupValue rdr
342   = lookup_val rdr lookupRnEnv (\ rn -> True) (unknownNameErr "value")
343
344 lookupConstr rdr
345   = lookup_val rdr lookupGlobalRnEnv isRnConstr (unknownNameErr "constructor")
346
347 lookupField rdr
348   = lookup_val rdr lookupGlobalRnEnv isRnField (unknownNameErr "field")
349
350 lookupClassOp cls rdr
351   = lookup_val rdr lookupGlobalRnEnv (\ rn -> isRnClassOp cls rn) (badClassOpErr cls)
352
353 -- Note: the lookup checks are only performed when renaming source
354
355 lookup_val rdr lookup check do_err down@(RnDown _ _ locn (RnSource occ_var) env _ _)
356   = case lookup env rdr of
357         Just name | check name -> succ name
358                   | otherwise  -> fail
359         Nothing                -> fail
360
361   where
362     succ name = if isRnLocal name || isRnWired name then
363                     returnSST name
364                 else
365                     snoc_bag_var (name,rdr) occ_var `thenSST_`
366                     returnSST name
367     fail = failButContinueRn (mkRnUnbound rdr) (do_err rdr locn) down
368
369 lookup_val rdr lookup check do_err down@(RnDown _ _ locn (RnIface b_names b_key imp_var) env us_var _)
370   = case lookup env rdr of
371         Just name -> returnSST name
372         Nothing   -> lookup_nonexisting_val b_names b_key imp_var us_var rdr
373
374 lookup_nonexisting_val (b_names,_) b_key imp_var us_var rdr
375   = let str_mod = case rdr of { Qual m n -> (n,m); Unqual n -> (n, pRELUDE) }
376     in case (lookupFM b_names str_mod) of
377          Nothing -> lookup_or_create_implicit_val b_key imp_var us_var rdr
378          Just xx -> returnSST xx
379
380 lookup_or_create_implicit_val b_key imp_var us_var rdr
381   = readMutVarSST imp_var `thenSST` \ (implicit_val_fm, implicit_tc_fm) ->
382     case lookupFM implicit_val_fm rdr of
383         Just implicit -> returnSST implicit
384         Nothing ->
385           (let str_mod = case rdr of { Qual m n -> (n,m); Unqual n -> (n, pRELUDE) }
386            in case (lookupFM b_key str_mod) of
387                 Just (u,_) -> returnSST u
388                 _          -> get_unique us_var
389           )                                                     `thenSST` \ uniq -> 
390           let
391               implicit   = mkRnImplicit (mkImplicitName uniq rdr)
392               new_val_fm = addToFM implicit_val_fm rdr implicit
393           in
394           writeMutVarSST imp_var (new_val_fm, implicit_tc_fm)   `thenSST_`
395           returnSST implicit
396 \end{code}
397
398
399 \begin{code}
400 lookupTyCon   :: RdrName -> RnMonad x s RnName
401 lookupClass   :: RdrName -> RnMonad x s RnName
402
403 lookupTyCon rdr
404   = lookup_tc rdr isRnTyCon mkRnImplicitTyCon "type constructor"
405
406 lookupClass rdr
407   = lookup_tc rdr isRnClass mkRnImplicitClass "class"
408
409 lookupTyConOrClass rdr
410   = lookup_tc rdr isRnTyConOrClass
411               (panic "lookupTC:mk_implicit") "class or type constructor"
412
413 lookup_tc rdr check mk_implicit err_str down@(RnDown _ _ locn (RnSource occ_var) env _ _)
414   = case lookupTcRnEnv env rdr of
415        Just name | check name -> succ name
416                  | otherwise  -> fail
417        Nothing                -> fail
418   where
419     succ name = snoc_bag_var (name,rdr) occ_var `thenSST_`
420                 returnSST name
421     fail = failButContinueRn (mkRnUnbound rdr) (unknownNameErr err_str rdr locn) down
422
423 lookup_tc rdr check mk_implicit err_str down@(RnDown _ _ locn (RnIface b_names b_key imp_var) env us_var _)
424   = case lookupTcRnEnv env rdr of
425         Just name | check name -> returnSST name
426                   | otherwise  -> fail
427         Nothing -> lookup_nonexisting_tc check mk_implicit fail b_names b_key imp_var us_var rdr
428   where
429     fail = failButContinueRn (mkRnUnbound rdr) (unknownNameErr err_str rdr locn) down
430
431 lookup_nonexisting_tc check mk_implicit fail (_,b_names) b_key imp_var us_var rdr
432   = let
433         str_mod = case rdr of { Qual m n -> (n,m); Unqual n -> (n, pRELUDE) }
434     in
435     --pprTrace "lookup:" (ppAboves [case str_mod of {(n,m)->ppCat [ppPStr n, ppPStr m]}, ppAboves [ ppCat [ppPStr n, ppPStr m] | ((n,m), _) <- fmToList b_names]]) $
436     case (lookupFM b_names str_mod) of
437       Nothing -> lookup_or_create_implicit_tc check mk_implicit fail b_key imp_var us_var rdr
438       Just xx -> returnSST xx
439
440 lookup_or_create_implicit_tc check mk_implicit fail b_key imp_var us_var rdr
441   = readMutVarSST imp_var `thenSST` \ (implicit_val_fm, implicit_tc_fm) ->
442     case lookupFM implicit_tc_fm rdr of
443         Just implicit | check implicit -> returnSST implicit
444                       | otherwise      -> fail
445         Nothing ->
446           (let str_mod = case rdr of { Qual m n -> (n,m); Unqual n -> (n, pRELUDE) }
447            in case (lookupFM b_key str_mod) of
448                 Just (u,_) -> returnSST u
449                 _          -> get_unique us_var
450           )                                                     `thenSST` \ uniq -> 
451           let
452               implicit  = mk_implicit (mkImplicitName uniq rdr)
453               new_tc_fm = addToFM implicit_tc_fm rdr implicit
454           in
455           writeMutVarSST imp_var (implicit_val_fm, new_tc_fm)   `thenSST_`
456           returnSST implicit
457 \end{code}
458
459
460 @extendSS@ extends the scope; @extendSS2@ also removes the newly bound
461 free vars from the result.
462
463 \begin{code}
464 extendSS :: [RnName]                            -- Newly bound names
465          -> RnMonad x s a
466          -> RnMonad x s a
467
468 extendSS binders m down@(RnDown x mod locn mode env us errs)
469   = (mapRn (addErrRn . shadowedNameWarn locn) dups `thenRn_`
470      m) (RnDown x mod locn mode new_env us errs)
471   where
472     (new_env,dups) = extendLocalRnEnv opt_WarnNameShadowing env binders
473
474 extendSS2 :: [RnName]                           -- Newly bound names
475           -> RnMonad x s (a, UniqSet RnName)
476           -> RnMonad x s (a, UniqSet RnName)
477
478 extendSS2 binders m
479   = extendSS binders m `thenRn` \ (r, fvs) ->
480     returnRn (r, fvs `minusUniqSet` (mkUniqSet binders))
481 \end{code}
482
483 The free var set returned by @(extendSS binders m)@ is that returned
484 by @m@, {\em minus} binders.
485
486
487 *********************************************************
488 *                                                       *
489 \subsection{TyVarNamesEnv}
490 *                                                       *
491 *********************************************************
492
493 \begin{code}
494 type TyVarNamesEnv = [(RdrName, RnName)]
495
496 nullTyVarNamesEnv :: TyVarNamesEnv
497 nullTyVarNamesEnv = []
498
499 catTyVarNamesEnvs :: TyVarNamesEnv -> TyVarNamesEnv -> TyVarNamesEnv
500 catTyVarNamesEnvs e1 e2 = e1 ++ e2
501
502 domTyVarNamesEnv :: TyVarNamesEnv -> [RdrName]
503 domTyVarNamesEnv env = map fst env
504 \end{code}
505
506 @mkTyVarNamesEnv@ checks for duplicates, and complains if so.
507
508 \begin{code}
509 mkTyVarNamesEnv
510         :: SrcLoc
511         -> [RdrName]                            -- The type variables
512         -> RnMonad x s (TyVarNamesEnv,[RnName]) -- Environment and renamed tyvars
513
514 mkTyVarNamesEnv src_loc tyvars
515   = newLocalNames "type variable"
516          (tyvars `zip` repeat src_loc) `thenRn`  \ rn_tyvars ->
517
518          -- rn_tyvars may not be in the same order as tyvars, so we need some
519          -- jiggery pokery to build the right tyvar env, and return the
520          -- renamed tyvars in the original order.
521     let tv_occ_name_pairs       = map tv_occ_name_pair rn_tyvars
522         tv_env                  = map (lookup_occ_name tv_occ_name_pairs) tyvars
523         rn_tyvars_in_orig_order = map snd tv_env
524     in
525     returnRn (tv_env, rn_tyvars_in_orig_order)
526   where
527     tv_occ_name_pair :: RnName -> (RdrName, RnName)
528     tv_occ_name_pair rn_name = (getOccName rn_name, rn_name)
529
530     lookup_occ_name :: [(RdrName, RnName)] -> RdrName -> (RdrName, RnName)
531     lookup_occ_name pairs tyvar_occ
532       = (tyvar_occ, assoc "mkTyVarNamesEnv" pairs tyvar_occ)
533 \end{code}
534
535 \begin{code}
536 lookupTyVarName :: TyVarNamesEnv -> RdrName -> RnMonad x s RnName
537 lookupTyVarName env occ
538   = case (assocMaybe env occ) of
539       Just name -> returnRn name
540       Nothing   -> getSrcLocRn  `thenRn` \ loc ->
541                    failButContinueRn (mkRnUnbound occ)
542                        (unknownNameErr "type variable" occ loc)
543 \end{code}
544
545
546 \begin{code}
547 fixIO :: (a -> IO a) -> IO a
548 fixIO k s = let
549                 result          = k loop s
550                 (Right loop, _) = result
551             in
552             result
553 \end{code}
554
555 *********************************************************
556 *                                                       *
557 \subsection{Errors used in RnMonad}
558 *                                                       *
559 *********************************************************
560
561 \begin{code}
562 unknownNameErr descriptor name locn
563   = addShortErrLocLine locn $ \ sty ->
564     ppBesides [ppStr "undefined ", ppStr descriptor, ppStr ": ", pprNonSym sty name]
565
566 badClassOpErr clas op locn
567   = addErrLoc locn "" $ \ sty ->
568     ppBesides [ppChar '`', pprNonSym sty op, ppStr "' is not an operation of class `",
569               ppr sty clas, ppStr "'"]
570
571 shadowedNameWarn locn shadow
572   = addShortWarnLocLine locn $ \ sty ->
573     ppBesides [ppStr "more than one value with the same name (shadowing): ", ppr sty shadow]
574 \end{code}