Refactor part of the renamer to fix Trac #3901
[ghc-hetmet.git] / compiler / rename / RnPat.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[RnPat]{Renaming of patterns}
5
6 Basically dependency analysis.
7
8 Handles @Match@, @GRHSs@, @HsExpr@, and @Qualifier@ datatypes.  In
9 general, all of these functions return a renamed thing, and a set of
10 free variables.
11
12 \begin{code}
13 module RnPat (-- main entry points
14               rnPat, rnPats, rnBindPat,
15
16               NameMaker, applyNameMaker,     -- a utility for making names:
17               localRecNameMaker, topRecNameMaker,  --   sometimes we want to make local names,
18                                              --   sometimes we want to make top (qualified) names.
19
20               rnHsRecFields1, HsRecFieldContext(..),
21
22               -- Literals
23               rnLit, rnOverLit,     
24
25              -- Pattern Error messages that are also used elsewhere
26              checkTupSize, patSigErr
27              ) where
28
29 -- ENH: thin imports to only what is necessary for patterns
30
31 import {-# SOURCE #-} RnExpr ( rnLExpr )
32 #ifdef GHCI
33 import {-# SOURCE #-} TcSplice ( runQuasiQuotePat )
34 #endif  /* GHCI */
35
36 #include "HsVersions.h"
37
38 import HsSyn            
39 import TcRnMonad
40 import TcHsSyn          ( hsOverLitName )
41 import RnEnv
42 import RnTypes
43 import DynFlags         ( DynFlag(..) )
44 import PrelNames
45 import Constants        ( mAX_TUPLE_SIZE )
46 import Name
47 import NameSet
48 import Module
49 import RdrName
50 import ListSetOps       ( removeDups, minusList )
51 import Outputable
52 import SrcLoc
53 import FastString
54 import Literal          ( inCharRange )
55 import Control.Monad    ( when )
56 \end{code}
57
58
59 %*********************************************************
60 %*                                                      *
61         The CpsRn Monad
62 %*                                                      *
63 %*********************************************************
64
65 Note [CpsRn monad]
66 ~~~~~~~~~~~~~~~~~~
67 The CpsRn monad uses continuation-passing style to support this
68 style of programming:
69
70         do { ...
71            ; ns <- bindNames rs
72            ; ...blah... }
73
74    where rs::[RdrName], ns::[Name]
75
76 The idea is that '...blah...' 
77   a) sees the bindings of ns
78   b) returns the free variables it mentions
79      so that bindNames can report unused ones
80
81 In particular, 
82     mapM rnPatAndThen [p1, p2, p3]
83 has a *left-to-right* scoping: it makes the binders in 
84 p1 scope over p2,p3.
85
86 \begin{code}
87 newtype CpsRn b = CpsRn { unCpsRn :: forall r. (b -> RnM (r, FreeVars))
88                                             -> RnM (r, FreeVars) }
89         -- See Note [CpsRn monad]
90
91 instance Monad CpsRn where
92   return x = CpsRn (\k -> k x)
93   (CpsRn m) >>= mk = CpsRn (\k -> m (\v -> unCpsRn (mk v) k))
94
95 runCps :: CpsRn a -> RnM (a, FreeVars)
96 runCps (CpsRn m) = m (\r -> return (r, emptyFVs))
97
98 liftCps :: RnM a -> CpsRn a
99 liftCps rn_thing = CpsRn (\k -> rn_thing >>= k)
100
101 liftCpsFV :: RnM (a, FreeVars) -> CpsRn a
102 liftCpsFV rn_thing = CpsRn (\k -> do { (v,fvs1) <- rn_thing
103                                      ; (r,fvs2) <- k v
104                                      ; return (r, fvs1 `plusFV` fvs2) })
105
106 wrapSrcSpanCps :: (a -> CpsRn b) -> Located a -> CpsRn (Located b)
107 -- Set the location, and also wrap it around the value returned
108 wrapSrcSpanCps fn (L loc a)
109   = CpsRn (\k -> setSrcSpan loc $ 
110                  unCpsRn (fn a) $ \v -> 
111                  k (L loc v))
112
113 lookupConCps :: Located RdrName -> CpsRn (Located Name)
114 lookupConCps con_rdr 
115   = CpsRn (\k -> do { con_name <- lookupLocatedOccRn con_rdr
116                     ; (r, fvs) <- k con_name
117                     ; return (r, fvs `plusFV` unitFV (unLoc con_name)) })
118 \end{code}
119
120 %*********************************************************
121 %*                                                      *
122         Name makers
123 %*                                                      *
124 %*********************************************************
125
126 Externally abstract type of name makers,
127 which is how you go from a RdrName to a Name
128
129 \begin{code}
130 data NameMaker 
131   = LamMk       -- Lambdas 
132       Bool      -- True <=> report unused bindings
133                 --   (even if True, the warning only comes out 
134                 --    if -fwarn-unused-matches is on)
135
136   | LetMk       -- Let bindings, incl top level
137                 -- Do *not* check for unused bindings
138       (Maybe Module)   -- Just m  => top level of module m
139                        -- Nothing => not top level
140       MiniFixityEnv
141
142 topRecNameMaker :: Module -> MiniFixityEnv -> NameMaker
143 topRecNameMaker mod fix_env = LetMk (Just mod) fix_env
144
145 localRecNameMaker :: MiniFixityEnv -> NameMaker
146 localRecNameMaker fix_env = LetMk Nothing fix_env 
147
148 matchNameMaker :: HsMatchContext a -> NameMaker
149 matchNameMaker ctxt = LamMk report_unused
150   where
151     -- Do not report unused names in interactive contexts
152     -- i.e. when you type 'x <- e' at the GHCi prompt
153     report_unused = case ctxt of
154                       StmtCtxt GhciStmt -> False
155                       _                 -> True
156
157 newName :: NameMaker -> Located RdrName -> CpsRn Name
158 newName (LamMk report_unused) rdr_name
159   = CpsRn (\ thing_inside -> 
160         do { name <- newLocalBndrRn rdr_name
161            ; (res, fvs) <- bindLocalName name (thing_inside name)
162            ; when report_unused $ warnUnusedMatches [name] fvs
163            ; return (res, name `delFV` fvs) })
164
165 newName (LetMk mb_top fix_env) rdr_name
166   = CpsRn (\ thing_inside -> 
167         do { name <- case mb_top of
168                        Nothing  -> newLocalBndrRn rdr_name
169                        Just mod -> newTopSrcBinder mod rdr_name
170            ; bindLocalNamesFV_WithFixities [name] fix_env $
171              thing_inside name })
172                           
173     -- Note: the bindLocalNamesFV_WithFixities is somewhat suspicious 
174     --       because it binds a top-level name as a local name.
175     --       however, this binding seems to work, and it only exists for
176     --       the duration of the patterns and the continuation;
177     --       then the top-level name is added to the global env
178     --       before going on to the RHSes (see RnSource.lhs).
179 \end{code}
180
181
182 %*********************************************************
183 %*                                                      *
184         External entry points
185 %*                                                      *
186 %*********************************************************
187
188 There are various entry points to renaming patterns, depending on
189  (1) whether the names created should be top-level names or local names
190  (2) whether the scope of the names is entirely given in a continuation
191      (e.g., in a case or lambda, but not in a let or at the top-level,
192       because of the way mutually recursive bindings are handled)
193  (3) whether the a type signature in the pattern can bind 
194         lexically-scoped type variables (for unpacking existential 
195         type vars in data constructors)
196  (4) whether we do duplicate and unused variable checking
197  (5) whether there are fixity declarations associated with the names
198      bound by the patterns that need to be brought into scope with them.
199      
200  Rather than burdening the clients of this module with all of these choices,
201  we export the three points in this design space that we actually need:
202
203 \begin{code}
204 -- ----------- Entry point 1: rnPats -------------------
205 -- Binds local names; the scope of the bindings is entirely in the thing_inside
206 --   * allows type sigs to bind type vars
207 --   * local namemaker
208 --   * unused and duplicate checking
209 --   * no fixities
210 rnPats :: HsMatchContext Name -- for error messages
211        -> [LPat RdrName] 
212        -> ([LPat Name] -> RnM (a, FreeVars))
213        -> RnM (a, FreeVars)
214 rnPats ctxt pats thing_inside
215   = do  { envs_before <- getRdrEnvs
216
217           -- (0) bring into scope all of the type variables bound by the patterns
218           -- (1) rename the patterns, bringing into scope all of the term variables
219           -- (2) then do the thing inside.
220         ; bindPatSigTyVarsFV (collectSigTysFromPats pats)     $ 
221           unCpsRn (rnLPatsAndThen (matchNameMaker ctxt) pats) $ \ pats' -> do
222         { -- Check for duplicated and shadowed names 
223                  -- Because we don't bind the vars all at once, we can't
224                  --     check incrementally for duplicates; 
225                  -- Nor can we check incrementally for shadowing, else we'll
226                  --     complain *twice* about duplicates e.g. f (x,x) = ...
227         ; let names = collectPatsBinders pats'
228         ; addErrCtxt doc_pat $ checkDupAndShadowedNames envs_before names
229         ; thing_inside pats' } }
230   where
231     doc_pat = ptext (sLit "In") <+> pprMatchContext ctxt
232
233 rnPat :: HsMatchContext Name -- for error messages
234       -> LPat RdrName 
235       -> (LPat Name -> RnM (a, FreeVars))
236       -> RnM (a, FreeVars)     -- Variables bound by pattern do not 
237                                -- appear in the result FreeVars 
238 rnPat ctxt pat thing_inside 
239   = rnPats ctxt [pat] (\[pat'] -> thing_inside pat')
240
241 applyNameMaker :: NameMaker -> Located RdrName -> RnM Name
242 applyNameMaker mk rdr = do { (n, _fvs) <- runCps (newName mk rdr); return n }
243
244 -- ----------- Entry point 2: rnBindPat -------------------
245 -- Binds local names; in a recursive scope that involves other bound vars
246 --      e.g let { (x, Just y) = e1; ... } in ...
247 --   * does NOT allows type sig to bind type vars
248 --   * local namemaker
249 --   * no unused and duplicate checking
250 --   * fixities might be coming in
251 rnBindPat :: NameMaker
252           -> LPat RdrName
253           -> RnM (LPat Name, FreeVars)
254    -- Returned FreeVars are the free variables of the pattern,
255    -- of course excluding variables bound by this pattern 
256
257 rnBindPat name_maker pat = runCps (rnLPatAndThen name_maker pat)
258 \end{code}
259
260
261 %*********************************************************
262 %*                                                      *
263         The main event
264 %*                                                      *
265 %*********************************************************
266
267 \begin{code}
268 -- ----------- Entry point 3: rnLPatAndThen -------------------
269 -- General version: parametrized by how you make new names
270
271 rnLPatsAndThen :: NameMaker -> [LPat RdrName] -> CpsRn [LPat Name]
272 rnLPatsAndThen mk = mapM (rnLPatAndThen mk)
273   -- Despite the map, the monad ensures that each pattern binds
274   -- variables that may be mentioned in subsequent patterns in the list
275
276 --------------------
277 -- The workhorse
278 rnLPatAndThen :: NameMaker -> LPat RdrName -> CpsRn (LPat Name)
279 rnLPatAndThen nm lpat = wrapSrcSpanCps (rnPatAndThen nm) lpat
280
281 rnPatAndThen :: NameMaker -> Pat RdrName -> CpsRn (Pat Name)
282 rnPatAndThen _  (WildPat _)   = return (WildPat placeHolderType)
283 rnPatAndThen mk (ParPat pat)  = do { pat' <- rnLPatAndThen mk pat; return (ParPat pat') }
284 rnPatAndThen mk (LazyPat pat) = do { pat' <- rnLPatAndThen mk pat; return (LazyPat pat') }
285 rnPatAndThen mk (BangPat pat) = do { pat' <- rnLPatAndThen mk pat; return (BangPat pat') }
286 rnPatAndThen mk (VarPat rdr)  = do { loc <- liftCps getSrcSpanM
287                                    ; name <- newName mk (L loc rdr)
288                                    ; return (VarPat name) }
289      -- we need to bind pattern variables for view pattern expressions
290      -- (e.g. in the pattern (x, x -> y) x needs to be bound in the rhs of the tuple)
291                                      
292 rnPatAndThen mk (SigPatIn pat ty)
293   = do { patsigs <- liftCps (doptM Opt_ScopedTypeVariables)
294        ; if patsigs
295          then do { pat' <- rnLPatAndThen mk pat
296                  ; ty' <- liftCpsFV (rnHsTypeFVs tvdoc ty)
297                  ; return (SigPatIn pat' ty') }
298          else do { liftCps (addErr (patSigErr ty))
299                  ; rnPatAndThen mk (unLoc pat) } }
300   where
301     tvdoc = text "In a pattern type-signature"
302        
303 rnPatAndThen mk (LitPat lit)
304   | HsString s <- lit
305   = do { ovlStr <- liftCps (doptM Opt_OverloadedStrings)
306        ; if ovlStr 
307          then rnPatAndThen mk (mkNPat (mkHsIsString s placeHolderType) Nothing)
308          else normal_lit }
309   | otherwise = normal_lit
310   where
311     normal_lit = do { liftCps (rnLit lit); return (LitPat lit) }
312
313 rnPatAndThen _ (NPat lit mb_neg _eq)
314   = do { lit'    <- liftCpsFV $ rnOverLit lit
315        ; mb_neg' <- liftCpsFV $ case mb_neg of
316                       Nothing -> return (Nothing, emptyFVs)
317                       Just _  -> do { (neg, fvs) <- lookupSyntaxName negateName
318                                     ; return (Just neg, fvs) }
319        ; eq' <- liftCpsFV $ lookupSyntaxName eqName
320        ; return (NPat lit' mb_neg' eq') }
321
322 rnPatAndThen mk (NPlusKPat rdr lit _ _)
323   = do { new_name <- newName mk rdr
324        ; lit'  <- liftCpsFV $ rnOverLit lit
325        ; minus <- liftCpsFV $ lookupSyntaxName minusName
326        ; ge    <- liftCpsFV $ lookupSyntaxName geName
327        ; return (NPlusKPat (L (nameSrcSpan new_name) new_name) lit' ge minus) }
328                 -- The Report says that n+k patterns must be in Integral
329
330 rnPatAndThen mk (AsPat rdr pat)
331   = do { new_name <- newName mk rdr
332        ; pat' <- rnLPatAndThen mk pat
333        ; return (AsPat (L (nameSrcSpan new_name) new_name) pat') }
334
335 rnPatAndThen mk p@(ViewPat expr pat ty)
336   = do { liftCps $ do { vp_flag <- doptM Opt_ViewPatterns
337                       ; checkErr vp_flag (badViewPat p) }
338          -- Because of the way we're arranging the recursive calls,
339          -- this will be in the right context 
340        ; expr' <- liftCpsFV $ rnLExpr expr 
341        ; pat' <- rnLPatAndThen mk pat
342        ; return (ViewPat expr' pat' ty) }
343
344 rnPatAndThen mk (ConPatIn con stuff)
345    -- rnConPatAndThen takes care of reconstructing the pattern
346   = rnConPatAndThen mk con stuff
347
348 rnPatAndThen mk (ListPat pats _)
349   = do { pats' <- rnLPatsAndThen mk pats
350        ; return (ListPat pats' placeHolderType) }
351
352 rnPatAndThen mk (PArrPat pats _)
353   = do { pats' <- rnLPatsAndThen mk pats
354        ; return (PArrPat pats' placeHolderType) }
355
356 rnPatAndThen mk (TuplePat pats boxed _)
357   = do { liftCps $ checkTupSize (length pats)
358        ; pats' <- rnLPatsAndThen mk pats
359        ; return (TuplePat pats' boxed placeHolderType) }
360
361 rnPatAndThen _ (TypePat ty)
362   = do { ty' <- liftCpsFV $ rnHsTypeFVs (text "In a type pattern") ty
363        ; return (TypePat ty') }
364
365 #ifndef GHCI
366 rnPatAndThen _ p@(QuasiQuotePat {}) 
367   = pprPanic "Can't do QuasiQuotePat without GHCi" (ppr p)
368 #else
369 rnPatAndThen mk (QuasiQuotePat qq)
370   = do { pat <- liftCps $ runQuasiQuotePat qq
371        ; L _ pat' <- rnLPatAndThen mk pat
372        ; return pat' }
373 #endif  /* GHCI */
374
375 rnPatAndThen _ pat = pprPanic "rnLPatAndThen" (ppr pat)
376
377
378 --------------------
379 rnConPatAndThen :: NameMaker
380                 -> Located RdrName          -- the constructor
381                 -> HsConPatDetails RdrName 
382                 -> CpsRn (Pat Name)
383
384 rnConPatAndThen mk con (PrefixCon pats)
385   = do  { con' <- lookupConCps con
386         ; pats' <- rnLPatsAndThen mk pats
387         ; return (ConPatIn con' (PrefixCon pats')) }
388
389 rnConPatAndThen mk con (InfixCon pat1 pat2)
390   = do  { con' <- lookupConCps con
391         ; pat1' <- rnLPatAndThen mk pat1
392         ; pat2' <- rnLPatAndThen mk pat2
393         ; fixity <- liftCps $ lookupFixityRn (unLoc con')
394         ; liftCps $ mkConOpPatRn con' fixity pat1' pat2' }
395
396 rnConPatAndThen mk con (RecCon rpats)
397   = do  { con' <- lookupConCps con
398         ; rpats' <- rnHsRecPatsAndThen mk con' rpats
399         ; return (ConPatIn con' (RecCon rpats')) }
400
401 --------------------
402 rnHsRecPatsAndThen :: NameMaker
403                    -> Located Name      -- Constructor
404                    -> HsRecFields RdrName (LPat RdrName)
405                    -> CpsRn (HsRecFields Name (LPat Name))
406 rnHsRecPatsAndThen mk (L _ con) hs_rec_fields@(HsRecFields { rec_dotdot = dd })
407   = do { flds <- liftCpsFV $ rnHsRecFields1 (HsRecFieldPat con) VarPat hs_rec_fields
408        ; flds' <- mapM rn_field (flds `zip` [1..])
409        ; return (HsRecFields { rec_flds = flds', rec_dotdot = dd }) }
410   where 
411     rn_field (fld, n') = do { arg' <- rnLPatAndThen (nested_mk dd mk n') 
412                                                     (hsRecFieldArg fld)
413                             ; return (fld { hsRecFieldArg = arg' }) }
414
415         -- Suppress unused-match reporting for fields introduced by ".."
416     nested_mk Nothing  mk                    _  = mk
417     nested_mk (Just _) mk@(LetMk {})         _  = mk
418     nested_mk (Just n) (LamMk report_unused) n' = LamMk (report_unused && (n' <= n))
419 \end{code}
420
421
422 %************************************************************************
423 %*                                                                      *
424         Record fields
425 %*                                                                      *
426 %************************************************************************
427
428 \begin{code}
429 data HsRecFieldContext 
430   = HsRecFieldCon Name
431   | HsRecFieldPat Name
432   | HsRecFieldUpd
433
434 rnHsRecFields1 
435     :: HsRecFieldContext
436     -> (RdrName -> arg) -- When punning, use this to build a new field
437     -> HsRecFields RdrName (Located arg)
438     -> RnM ([HsRecField Name (Located arg)], FreeVars)
439
440 -- This supprisingly complicated pass
441 --   a) looks up the field name (possibly using disambiguation)
442 --   b) fills in puns and dot-dot stuff
443 -- When we we've finished, we've renamed the LHS, but not the RHS,
444 -- of each x=e binding
445
446 rnHsRecFields1 ctxt mk_arg (HsRecFields { rec_flds = flds, rec_dotdot = dotdot })
447   = do { pun_ok      <- doptM Opt_RecordPuns
448        ; disambig_ok <- doptM Opt_DisambiguateRecordFields
449        ; parent <- check_disambiguation disambig_ok mb_con
450        ; flds1 <- mapM (rn_fld pun_ok parent) flds
451        ; mapM_ (addErr . dupFieldErr ctxt) dup_flds
452        ; flds2 <- rn_dotdot dotdot mb_con flds1
453        ; return (flds2, mkFVs (getFieldIds flds2)) }
454   where
455     mb_con = case ctxt of
456                 HsRecFieldUpd     -> Nothing
457                 HsRecFieldCon con -> Just con
458                 HsRecFieldPat con -> Just con
459     doc = case mb_con of
460             Nothing  -> ptext (sLit "constructor field name")
461             Just con -> ptext (sLit "field of constructor") <+> quotes (ppr con)
462
463     name_to_arg (L loc n) = L loc (mk_arg (mkRdrUnqual (nameOccName n)))
464
465     rn_fld pun_ok parent (HsRecField { hsRecFieldId = fld
466                                      , hsRecFieldArg = arg
467                                      , hsRecPun = pun })
468       = do { fld' <- wrapLocM (lookupSubBndr parent doc) fld
469            ; arg' <- if pun 
470                      then do { checkErr pun_ok (badPun fld)
471                              ; return (name_to_arg fld') }
472                      else return arg
473            ; return (HsRecField { hsRecFieldId = fld'
474                                 , hsRecFieldArg = arg'
475                                 , hsRecPun = pun }) }
476
477     rn_dotdot Nothing _mb_con flds     -- No ".." at all
478       = return flds
479     rn_dotdot (Just {}) Nothing flds   -- ".." on record update
480       = do { addErr (badDotDot ctxt); return flds }
481     rn_dotdot (Just n) (Just con) flds -- ".." on record con/pat
482       = ASSERT( n == length flds )
483         do { loc <- getSrcSpanM -- Rather approximate
484            ; dd_flag <- doptM Opt_RecordWildCards
485            ; checkErr dd_flag (needFlagDotDot ctxt)
486
487            ; con_fields <- lookupConstructorFields con
488            ; let present_flds = getFieldIds flds
489                  absent_flds  = con_fields `minusList` present_flds
490                  extras = [ HsRecField
491                               { hsRecFieldId = L loc f
492                               , hsRecFieldArg = name_to_arg (L loc f)
493                               , hsRecPun = False }
494                           | f <- absent_flds ]
495
496            ; return (flds ++ extras) }
497
498     check_disambiguation :: Bool -> Maybe Name -> RnM Parent
499     -- When disambiguation is on, return the parent *type constructor*
500     -- That is, the parent of the data constructor.  That's the parent
501     -- to use for looking up record fields.
502     check_disambiguation disambig_ok mb_con
503       | disambig_ok, Just con <- mb_con
504       = do { env <- getGlobalRdrEnv
505            ; return (case lookupGRE_Name env con of
506                        [gre] -> gre_par gre
507                        gres  -> WARN( True, ppr con <+> ppr gres ) NoParent) }
508       | otherwise = return NoParent
509  
510     dup_flds :: [[RdrName]]
511         -- Each list represents a RdrName that occurred more than once
512         -- (the list contains all occurrences)
513         -- Each list in dup_fields is non-empty
514     (_, dup_flds) = removeDups compare (getFieldIds flds)
515
516 getFieldIds :: [HsRecField id arg] -> [id]
517 getFieldIds flds = map (unLoc . hsRecFieldId) flds
518
519 needFlagDotDot :: HsRecFieldContext -> SDoc
520 needFlagDotDot ctxt = vcat [ptext (sLit "Illegal `..' in record") <+> pprRFC ctxt,
521                             ptext (sLit "Use -XRecordWildCards to permit this")]
522
523 badDotDot :: HsRecFieldContext -> SDoc
524 badDotDot ctxt = ptext (sLit "You cannot use `..' in a record") <+> pprRFC ctxt
525
526 badPun :: Located RdrName -> SDoc
527 badPun fld = vcat [ptext (sLit "Illegal use of punning for field") <+> quotes (ppr fld),
528                    ptext (sLit "Use -XNamedFieldPuns to permit this")]
529
530 dupFieldErr :: HsRecFieldContext -> [RdrName] -> SDoc
531 dupFieldErr ctxt dups
532   = hsep [ptext (sLit "duplicate field name"), 
533           quotes (ppr (head dups)),
534           ptext (sLit "in record"), pprRFC ctxt]
535
536 pprRFC :: HsRecFieldContext -> SDoc
537 pprRFC (HsRecFieldCon {}) = ptext (sLit "construction")
538 pprRFC (HsRecFieldPat {}) = ptext (sLit "pattern")
539 pprRFC (HsRecFieldUpd {}) = ptext (sLit "update")
540 \end{code}
541
542
543 %************************************************************************
544 %*                                                                      *
545 \subsubsection{Literals}
546 %*                                                                      *
547 %************************************************************************
548
549 When literals occur we have to make sure
550 that the types and classes they involve
551 are made available.
552
553 \begin{code}
554 rnLit :: HsLit -> RnM ()
555 rnLit (HsChar c) = checkErr (inCharRange c) (bogusCharError c)
556 rnLit _ = return ()
557
558 rnOverLit :: HsOverLit t -> RnM (HsOverLit Name, FreeVars)
559 rnOverLit lit@(OverLit {ol_val=val})
560   = do  { let std_name = hsOverLitName val
561         ; (from_thing_name, fvs) <- lookupSyntaxName std_name
562         ; let rebindable = case from_thing_name of
563                                 HsVar v -> v /= std_name
564                                 _       -> panic "rnOverLit"
565         ; return (lit { ol_witness = from_thing_name
566                       , ol_rebindable = rebindable }, fvs) }
567 \end{code}
568
569 %************************************************************************
570 %*                                                                      *
571 \subsubsection{Errors}
572 %*                                                                      *
573 %************************************************************************
574
575 \begin{code}
576 checkTupSize :: Int -> RnM ()
577 checkTupSize tup_size
578   | tup_size <= mAX_TUPLE_SIZE 
579   = return ()
580   | otherwise                  
581   = addErr (sep [ptext (sLit "A") <+> int tup_size <> ptext (sLit "-tuple is too large for GHC"),
582                  nest 2 (parens (ptext (sLit "max size is") <+> int mAX_TUPLE_SIZE)),
583                  nest 2 (ptext (sLit "Workaround: use nested tuples or define a data type"))])
584
585 patSigErr :: Outputable a => a -> SDoc
586 patSigErr ty
587   =  (ptext (sLit "Illegal signature in pattern:") <+> ppr ty)
588         $$ nest 4 (ptext (sLit "Use -XScopedTypeVariables to permit it"))
589
590 bogusCharError :: Char -> SDoc
591 bogusCharError c
592   = ptext (sLit "character literal out of range: '\\") <> char c  <> char '\''
593
594 badViewPat :: Pat RdrName -> SDoc
595 badViewPat pat = vcat [ptext (sLit "Illegal view pattern: ") <+> ppr pat,
596                        ptext (sLit "Use -XViewPatterns to enable view patterns")]
597 \end{code}