RnPat.lhs 24.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
%
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%
\section[RnPat]{Renaming of patterns}

Basically dependency analysis.

Handles @Match@, @GRHSs@, @HsExpr@, and @Qualifier@ datatypes.  In
general, all of these functions return a renamed thing, and a set of
free variables.

\begin{code}
Ian Lynagh's avatar
Ian Lynagh committed
13 14 15 16 17 18 19
{-# OPTIONS -fno-warn-tabs #-}
-- The above warning supression flag is a temporary kludge.
-- While working on this module you are encouraged to remove it and
-- detab the module (please do the detabbing in a separate patch). See
--     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#TabsvsSpaces
-- for details

20
{-# LANGUAGE ScopedTypeVariables #-}
21
module RnPat (-- main entry points
22
              rnPat, rnPats, rnBindPat,
23 24 25 26 27

              NameMaker, applyNameMaker,     -- a utility for making names:
              localRecNameMaker, topRecNameMaker,  --   sometimes we want to make local names,
                                             --   sometimes we want to make top (qualified) names.

28
              rnHsRecFields1, HsRecFieldContext(..),
29 30 31 32 33 34 35 36 37 38

	      -- Literals
	      rnLit, rnOverLit,     

             -- Pattern Error messages that are also used elsewhere
             checkTupSize, patSigErr
             ) where

-- ENH: thin imports to only what is necessary for patterns

Ian Lynagh's avatar
Ian Lynagh committed
39
import {-# SOURCE #-} RnExpr ( rnLExpr )
40
#ifdef GHCI
Ian Lynagh's avatar
Ian Lynagh committed
41
import {-# SOURCE #-} TcSplice ( runQuasiQuotePat )
42
#endif 	/* GHCI */
43 44 45 46 47

#include "HsVersions.h"

import HsSyn            
import TcRnMonad
48
import TcHsSyn		( hsOverLitName )
49
import RnEnv
Ian Lynagh's avatar
Ian Lynagh committed
50
import RnTypes
51
import DynFlags
Ian Lynagh's avatar
Ian Lynagh committed
52 53
import PrelNames
import Name
54
import NameSet
Ian Lynagh's avatar
Ian Lynagh committed
55
import RdrName
56
import BasicTypes
57
import Util
58
import ListSetOps	( removeDups )
59
import Outputable
Ian Lynagh's avatar
Ian Lynagh committed
60
import SrcLoc
61
import FastString
62
import Literal		( inCharRange )
63
import Control.Monad	( when )
64 65 66
\end{code}


Thomas Schilling's avatar
Thomas Schilling committed
67 68
%*********************************************************
%*							*
69
	The CpsRn Monad
Thomas Schilling's avatar
Thomas Schilling committed
70 71
%*							*
%*********************************************************
72

73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
Note [CpsRn monad]
~~~~~~~~~~~~~~~~~~
The CpsRn monad uses continuation-passing style to support this
style of programming:

	do { ...
           ; ns <- bindNames rs
           ; ...blah... }

   where rs::[RdrName], ns::[Name]

The idea is that '...blah...' 
  a) sees the bindings of ns
  b) returns the free variables it mentions
     so that bindNames can report unused ones

In particular, 
    mapM rnPatAndThen [p1, p2, p3]
has a *left-to-right* scoping: it makes the binders in 
p1 scope over p2,p3.

94
\begin{code}
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
newtype CpsRn b = CpsRn { unCpsRn :: forall r. (b -> RnM (r, FreeVars))
                                            -> RnM (r, FreeVars) }
	-- See Note [CpsRn monad]

instance Monad CpsRn where
  return x = CpsRn (\k -> k x)
  (CpsRn m) >>= mk = CpsRn (\k -> m (\v -> unCpsRn (mk v) k))

runCps :: CpsRn a -> RnM (a, FreeVars)
runCps (CpsRn m) = m (\r -> return (r, emptyFVs))

liftCps :: RnM a -> CpsRn a
liftCps rn_thing = CpsRn (\k -> rn_thing >>= k)

liftCpsFV :: RnM (a, FreeVars) -> CpsRn a
liftCpsFV rn_thing = CpsRn (\k -> do { (v,fvs1) <- rn_thing
                                     ; (r,fvs2) <- k v
                                     ; return (r, fvs1 `plusFV` fvs2) })

wrapSrcSpanCps :: (a -> CpsRn b) -> Located a -> CpsRn (Located b)
-- Set the location, and also wrap it around the value returned
wrapSrcSpanCps fn (L loc a)
  = CpsRn (\k -> setSrcSpan loc $ 
                 unCpsRn (fn a) $ \v -> 
                 k (L loc v))

lookupConCps :: Located RdrName -> CpsRn (Located Name)
lookupConCps con_rdr 
  = CpsRn (\k -> do { con_name <- lookupLocatedOccRn con_rdr
124 125 126
                    ; k con_name })
    -- We do not add the constructor name to the free vars
    -- See Note [Patterns are not uses]
127
\end{code}
128

129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
Note [Patterns are not uses]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Consider
  module Foo( f, g ) where
  data T = T1 | T2

  f T1 = True
  f T2 = False

  g _ = T1

Arguaby we should report T2 as unused, even though it appears in a
pattern, because it never occurs in a constructed position.  See
Trac #7336.

144 145 146 147 148
%*********************************************************
%*							*
	Name makers
%*							*
%*********************************************************
149

150 151 152 153 154 155 156
Externally abstract type of name makers,
which is how you go from a RdrName to a Name

\begin{code}
data NameMaker 
  = LamMk 	-- Lambdas 
      Bool	-- True <=> report unused bindings
157 158
      		--   (even if True, the warning only comes out 
		--    if -fwarn-unused-matches is on)
159 160

  | LetMk       -- Let bindings, incl top level
161
		-- Do *not* check for unused bindings
162
      TopLevelFlag
163 164
      MiniFixityEnv

165 166
topRecNameMaker :: MiniFixityEnv -> NameMaker
topRecNameMaker fix_env = LetMk TopLevel fix_env
167 168

localRecNameMaker :: MiniFixityEnv -> NameMaker
169
localRecNameMaker fix_env = LetMk NotTopLevel fix_env 
170

171 172 173 174 175 176
matchNameMaker :: HsMatchContext a -> NameMaker
matchNameMaker ctxt = LamMk report_unused
  where
    -- Do not report unused names in interactive contexts
    -- i.e. when you type 'x <- e' at the GHCi prompt
    report_unused = case ctxt of
177 178
                      StmtCtxt GhciStmtCtxt -> False
                      _                     -> True
179

180
rnHsSigCps :: HsWithBndrs (LHsType RdrName) -> CpsRn (HsWithBndrs (LHsType Name))
181
rnHsSigCps sig 
182
  = CpsRn (rnHsBndrSig PatCtx sig)
183

batterseapower's avatar
batterseapower committed
184 185
newPatName :: NameMaker -> Located RdrName -> CpsRn Name
newPatName (LamMk report_unused) rdr_name
186 187 188 189 190 191
  = CpsRn (\ thing_inside -> 
	do { name <- newLocalBndrRn rdr_name
	   ; (res, fvs) <- bindLocalName name (thing_inside name)
	   ; when report_unused $ warnUnusedMatches [name] fvs
	   ; return (res, name `delFV` fvs) })

batterseapower's avatar
batterseapower committed
192
newPatName (LetMk is_top fix_env) rdr_name
193
  = CpsRn (\ thing_inside -> 
194 195 196
        do { name <- case is_top of
                       NotTopLevel -> newLocalBndrRn rdr_name
                       TopLevel    -> newTopSrcBinder rdr_name
197 198 199
	   ; bindLocalName name $	-- Do *not* use bindLocalNameFV here
					-- See Note [View pattern usage]
             addLocalFixities fix_env [name] $
200
	     thing_inside name })
201
			  
202
    -- Note: the bindLocalName is somewhat suspicious
203 204 205 206 207 208 209
    --       because it binds a top-level name as a local name.
    --       however, this binding seems to work, and it only exists for
    --       the duration of the patterns and the continuation;
    --       then the top-level name is added to the global env
    --       before going on to the RHSes (see RnSource.lhs).
\end{code}

210 211 212 213 214 215 216 217
Note [View pattern usage]
~~~~~~~~~~~~~~~~~~~~~~~~~
Consider
  let (r, (r -> x)) = x in ...
Here the pattern binds 'r', and then uses it *only* in the view pattern.
We want to "see" this use, and in let-bindings we collect all uses and
report unused variables at the binding level. So we must use bindLocalName
here, *not* bindLocalNameFV.  Trac #3943.
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251

%*********************************************************
%*							*
	External entry points
%*							*
%*********************************************************

There are various entry points to renaming patterns, depending on
 (1) whether the names created should be top-level names or local names
 (2) whether the scope of the names is entirely given in a continuation
     (e.g., in a case or lambda, but not in a let or at the top-level,
      because of the way mutually recursive bindings are handled)
 (3) whether the a type signature in the pattern can bind 
	lexically-scoped type variables (for unpacking existential 
	type vars in data constructors)
 (4) whether we do duplicate and unused variable checking
 (5) whether there are fixity declarations associated with the names
     bound by the patterns that need to be brought into scope with them.
     
 Rather than burdening the clients of this module with all of these choices,
 we export the three points in this design space that we actually need:

\begin{code}
-- ----------- Entry point 1: rnPats -------------------
-- Binds local names; the scope of the bindings is entirely in the thing_inside
--   * allows type sigs to bind type vars
--   * local namemaker
--   * unused and duplicate checking
--   * no fixities
rnPats :: HsMatchContext Name -- for error messages
       -> [LPat RdrName] 
       -> ([LPat Name] -> RnM (a, FreeVars))
       -> RnM (a, FreeVars)
rnPats ctxt pats thing_inside
252
  = do	{ envs_before <- getRdrEnvs
253 254 255

	  -- (1) rename the patterns, bringing into scope all of the term variables
	  -- (2) then do the thing inside.
256
	; unCpsRn (rnLPatsAndThen (matchNameMaker ctxt) pats) $ \ pats' -> do
257
        { -- Check for duplicated and shadowed names 
258 259 260 261 262 263 264 265 266
	  -- Must do this *after* renaming the patterns
	  -- See Note [Collect binders only after renaming] in HsUtils
          -- Because we don't bind the vars all at once, we can't
	  -- 	check incrementally for duplicates; 
	  -- Nor can we check incrementally for shadowing, else we'll
	  -- 	complain *twice* about duplicates e.g. f (x,x) = ...
        ; addErrCtxt doc_pat $ 
          checkDupAndShadowedNames envs_before $
          collectPatsBinders pats'
267
        ; thing_inside pats' } }
268
  where
Ian Lynagh's avatar
Ian Lynagh committed
269
    doc_pat = ptext (sLit "In") <+> pprMatchContext ctxt
270

271 272 273
rnPat :: HsMatchContext Name -- for error messages
      -> LPat RdrName 
      -> (LPat Name -> RnM (a, FreeVars))
274 275
      -> RnM (a, FreeVars)     -- Variables bound by pattern do not 
      	     	 	       -- appear in the result FreeVars 
276
rnPat ctxt pat thing_inside 
277
  = rnPats ctxt [pat] (\pats' -> let [pat'] = pats' in thing_inside pat')
278

279
applyNameMaker :: NameMaker -> Located RdrName -> RnM Name
batterseapower's avatar
batterseapower committed
280
applyNameMaker mk rdr = do { (n, _fvs) <- runCps (newPatName mk rdr); return n }
281 282 283

-- ----------- Entry point 2: rnBindPat -------------------
-- Binds local names; in a recursive scope that involves other bound vars
284
--	e.g let { (x, Just y) = e1; ... } in ...
285 286 287 288
--   * does NOT allows type sig to bind type vars
--   * local namemaker
--   * no unused and duplicate checking
--   * fixities might be coming in
289 290
rnBindPat :: NameMaker
          -> LPat RdrName
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
          -> RnM (LPat Name, FreeVars)
   -- Returned FreeVars are the free variables of the pattern,
   -- of course excluding variables bound by this pattern 

rnBindPat name_maker pat = runCps (rnLPatAndThen name_maker pat)
\end{code}


%*********************************************************
%*							*
	The main event
%*							*
%*********************************************************

\begin{code}
-- ----------- Entry point 3: rnLPatAndThen -------------------
-- General version: parametrized by how you make new names

rnLPatsAndThen :: NameMaker -> [LPat RdrName] -> CpsRn [LPat Name]
rnLPatsAndThen mk = mapM (rnLPatAndThen mk)
  -- Despite the map, the monad ensures that each pattern binds
  -- variables that may be mentioned in subsequent patterns in the list

--------------------
-- The workhorse
rnLPatAndThen :: NameMaker -> LPat RdrName -> CpsRn (LPat Name)
rnLPatAndThen nm lpat = wrapSrcSpanCps (rnPatAndThen nm) lpat

rnPatAndThen :: NameMaker -> Pat RdrName -> CpsRn (Pat Name)
rnPatAndThen _  (WildPat _)   = return (WildPat placeHolderType)
rnPatAndThen mk (ParPat pat)  = do { pat' <- rnLPatAndThen mk pat; return (ParPat pat') }
rnPatAndThen mk (LazyPat pat) = do { pat' <- rnLPatAndThen mk pat; return (LazyPat pat') }
rnPatAndThen mk (BangPat pat) = do { pat' <- rnLPatAndThen mk pat; return (BangPat pat') }
rnPatAndThen mk (VarPat rdr)  = do { loc <- liftCps getSrcSpanM
batterseapower's avatar
batterseapower committed
325
                                   ; name <- newPatName mk (L loc rdr)
326 327 328
                                   ; return (VarPat name) }
     -- we need to bind pattern variables for view pattern expressions
     -- (e.g. in the pattern (x, x -> y) x needs to be bound in the rhs of the tuple)
329
                                     
330 331 332 333
rnPatAndThen mk (SigPatIn pat sig)
  = do { pat' <- rnLPatAndThen mk pat
       ; sig' <- rnHsSigCps sig
       ; return (SigPatIn pat' sig') }
334
       
335 336
rnPatAndThen mk (LitPat lit)
  | HsString s <- lit
337
  = do { ovlStr <- liftCps (xoptM Opt_OverloadedStrings)
338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
       ; if ovlStr 
         then rnPatAndThen mk (mkNPat (mkHsIsString s placeHolderType) Nothing)
         else normal_lit }
  | otherwise = normal_lit
  where
    normal_lit = do { liftCps (rnLit lit); return (LitPat lit) }

rnPatAndThen _ (NPat lit mb_neg _eq)
  = do { lit'    <- liftCpsFV $ rnOverLit lit
       ; mb_neg' <- liftCpsFV $ case mb_neg of
		      Nothing -> return (Nothing, emptyFVs)
		      Just _  -> do { (neg, fvs) <- lookupSyntaxName negateName
				    ; return (Just neg, fvs) }
       ; eq' <- liftCpsFV $ lookupSyntaxName eqName
       ; return (NPat lit' mb_neg' eq') }

rnPatAndThen mk (NPlusKPat rdr lit _ _)
batterseapower's avatar
batterseapower committed
355
  = do { new_name <- newPatName mk rdr
356 357 358 359
       ; lit'  <- liftCpsFV $ rnOverLit lit
       ; minus <- liftCpsFV $ lookupSyntaxName minusName
       ; ge    <- liftCpsFV $ lookupSyntaxName geName
       ; return (NPlusKPat (L (nameSrcSpan new_name) new_name) lit' ge minus) }
360 361
	   	-- The Report says that n+k patterns must be in Integral

362
rnPatAndThen mk (AsPat rdr pat)
batterseapower's avatar
batterseapower committed
363
  = do { new_name <- newPatName mk rdr
364 365 366 367
       ; pat' <- rnLPatAndThen mk pat
       ; return (AsPat (L (nameSrcSpan new_name) new_name) pat') }

rnPatAndThen mk p@(ViewPat expr pat ty)
368
  = do { liftCps $ do { vp_flag <- xoptM Opt_ViewPatterns
369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392
                      ; checkErr vp_flag (badViewPat p) }
         -- Because of the way we're arranging the recursive calls,
         -- this will be in the right context 
       ; expr' <- liftCpsFV $ rnLExpr expr 
       ; pat' <- rnLPatAndThen mk pat
       ; return (ViewPat expr' pat' ty) }

rnPatAndThen mk (ConPatIn con stuff)
   -- rnConPatAndThen takes care of reconstructing the pattern
  = rnConPatAndThen mk con stuff

rnPatAndThen mk (ListPat pats _)
  = do { pats' <- rnLPatsAndThen mk pats
       ; return (ListPat pats' placeHolderType) }

rnPatAndThen mk (PArrPat pats _)
  = do { pats' <- rnLPatsAndThen mk pats
       ; return (PArrPat pats' placeHolderType) }

rnPatAndThen mk (TuplePat pats boxed _)
  = do { liftCps $ checkTupSize (length pats)
       ; pats' <- rnLPatsAndThen mk pats
       ; return (TuplePat pats' boxed placeHolderType) }

393
#ifndef GHCI
394 395
rnPatAndThen _ p@(QuasiQuotePat {}) 
  = pprPanic "Can't do QuasiQuotePat without GHCi" (ppr p)
396
#else
397
rnPatAndThen mk (QuasiQuotePat qq)
398
  = do { pat <- liftCps $ runQuasiQuotePat qq
399 400
       ; L _ pat' <- rnLPatAndThen mk pat
       ; return pat' }
401 402
#endif 	/* GHCI */

403
rnPatAndThen _ pat = pprPanic "rnLPatAndThen" (ppr pat)
Ian Lynagh's avatar
Ian Lynagh committed
404

405

406
--------------------
407 408 409
rnConPatAndThen :: NameMaker
                -> Located RdrName          -- the constructor
                -> HsConPatDetails RdrName 
410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
                -> CpsRn (Pat Name)

rnConPatAndThen mk con (PrefixCon pats)
  = do	{ con' <- lookupConCps con
	; pats' <- rnLPatsAndThen mk pats
	; return (ConPatIn con' (PrefixCon pats')) }

rnConPatAndThen mk con (InfixCon pat1 pat2)
  = do	{ con' <- lookupConCps con
   	; pat1' <- rnLPatAndThen mk pat1
	; pat2' <- rnLPatAndThen mk pat2
	; fixity <- liftCps $ lookupFixityRn (unLoc con')
	; liftCps $ mkConOpPatRn con' fixity pat1' pat2' }

rnConPatAndThen mk con (RecCon rpats)
  = do	{ con' <- lookupConCps con
  	; rpats' <- rnHsRecPatsAndThen mk con' rpats
	; return (ConPatIn con' (RecCon rpats')) }

--------------------
rnHsRecPatsAndThen :: NameMaker
                   -> Located Name	-- Constructor
		   -> HsRecFields RdrName (LPat RdrName)
		   -> CpsRn (HsRecFields Name (LPat Name))
rnHsRecPatsAndThen mk (L _ con) hs_rec_fields@(HsRecFields { rec_dotdot = dd })
  = do { flds <- liftCpsFV $ rnHsRecFields1 (HsRecFieldPat con) VarPat hs_rec_fields
       ; flds' <- mapM rn_field (flds `zip` [1..])
       ; return (HsRecFields { rec_flds = flds', rec_dotdot = dd }) }
  where 
    rn_field (fld, n') = do { arg' <- rnLPatAndThen (nested_mk dd mk n') 
                                                    (hsRecFieldArg fld)
                            ; return (fld { hsRecFieldArg = arg' }) }

	-- Suppress unused-match reporting for fields introduced by ".."
    nested_mk Nothing  mk                    _  = mk
    nested_mk (Just _) mk@(LetMk {})         _  = mk
    nested_mk (Just n) (LamMk report_unused) n' = LamMk (report_unused && (n' <= n))
\end{code}


%************************************************************************
%*									*
	Record fields
%*									*
%************************************************************************

\begin{code}
data HsRecFieldContext 
  = HsRecFieldCon Name
  | HsRecFieldPat Name
  | HsRecFieldUpd

rnHsRecFields1 
463 464
    :: forall arg. 
       HsRecFieldContext
465 466 467 468 469 470 471 472 473 474 475
    -> (RdrName -> arg) -- When punning, use this to build a new field
    -> HsRecFields RdrName (Located arg)
    -> RnM ([HsRecField Name (Located arg)], FreeVars)

-- This supprisingly complicated pass
--   a) looks up the field name (possibly using disambiguation)
--   b) fills in puns and dot-dot stuff
-- When we we've finished, we've renamed the LHS, but not the RHS,
-- of each x=e binding

rnHsRecFields1 ctxt mk_arg (HsRecFields { rec_flds = flds, rec_dotdot = dotdot })
476 477
  = do { pun_ok      <- xoptM Opt_RecordPuns
       ; disambig_ok <- xoptM Opt_DisambiguateRecordFields
478 479 480
       ; parent <- check_disambiguation disambig_ok mb_con
       ; flds1 <- mapM (rn_fld pun_ok parent) flds
       ; mapM_ (addErr . dupFieldErr ctxt) dup_flds
481 482 483 484
       ; dotdot_flds <- rn_dotdot dotdot mb_con flds1
       ; let all_flds | null dotdot_flds = flds1
                      | otherwise        = flds1 ++ dotdot_flds
       ; return (all_flds, mkFVs (getFieldIds all_flds)) }
485 486
  where
    mb_con = case ctxt of
487 488 489 490 491 492 493 494
		HsRecFieldCon con | not (isUnboundName con) -> Just con
		HsRecFieldPat con | not (isUnboundName con) -> Just con
		_other -> Nothing
	   -- The unbound name test is because if the constructor 
	   -- isn't in scope the constructor lookup will add an error
	   -- add an error, but still return an unbound name. 
	   -- We don't want that to screw up the dot-dot fill-in stuff.

495 496 497 498 499 500 501
    doc = case mb_con of
            Nothing  -> ptext (sLit "constructor field name")
            Just con -> ptext (sLit "field of constructor") <+> quotes (ppr con)

    rn_fld pun_ok parent (HsRecField { hsRecFieldId = fld
                       	      	     , hsRecFieldArg = arg
                       	      	     , hsRecPun = pun })
502
      = do { fld'@(L loc fld_nm) <- wrapLocM (lookupSubBndrOcc True parent doc) fld
503 504
           ; arg' <- if pun 
                     then do { checkErr pun_ok (badPun fld)
505
                             ; return (L loc (mk_arg (mkRdrUnqual (nameOccName fld_nm)))) }
506 507 508 509 510
                     else return arg
           ; return (HsRecField { hsRecFieldId = fld'
                                , hsRecFieldArg = arg'
                                , hsRecPun = pun }) }

511 512 513 514 515 516 517 518 519
    rn_dotdot :: Maybe Int	-- See Note [DotDot fields] in HsPat
    	      -> Maybe Name	-- The constructor (Nothing for an update
	      	       		--    or out of scope constructor)
	      -> [HsRecField Name (Located arg)]   -- Explicit fields
	      -> RnM [HsRecField Name (Located arg)]   -- Filled in .. fields
    rn_dotdot Nothing _mb_con _flds     -- No ".." at all
      = return []
    rn_dotdot (Just {}) Nothing _flds   -- ".." on record update
      = do { addErr (badDotDot ctxt); return [] }
520
    rn_dotdot (Just n) (Just con) flds -- ".." on record construction / pat match
521 522
      = ASSERT( n == length flds )
        do { loc <- getSrcSpanM	-- Rather approximate
523
           ; dd_flag <- xoptM Opt_RecordWildCards
524
           ; checkErr dd_flag (needFlagDotDot ctxt)
525
	   ; (rdr_env, lcl_env) <- getRdrEnvs
526 527
           ; con_fields <- lookupConstructorFields con
           ; let present_flds = getFieldIds flds
528 529
                 parent_tc = find_tycon rdr_env con

530 531
                   -- For constructor uses (but not patterns)
                   -- the arg should be in scope (unqualified)
532 533 534
		   -- ignoring the record field itself
		   -- Eg.  data R = R { x,y :: Int }
                   --      f x = R { .. }   -- Should expand to R {x=x}, not R{x=x,y=y}
535 536 537 538 539 540 541 542 543
		 arg_in_scope fld 
                   = rdr `elemLocalRdrEnv` lcl_env
                   || notNull [ gre | gre <- lookupGRE_RdrName rdr rdr_env
                                    , case gre_par gre of
                                        ParentIs p -> p /= parent_tc
                                        _          -> True ]
                   where
                     rdr = mkRdrUnqual (nameOccName fld)

544
                 dot_dot_gres = [ head gres
545 546
                                | fld <- con_fields
                                , not (fld `elem` present_flds)
547 548
                                , let gres = lookupGRE_Name rdr_env fld
                                , not (null gres)  -- Check field is in scope
549 550 551 552 553
                                , case ctxt of
                                    HsRecFieldCon {} -> arg_in_scope fld
                                    _other           -> True ] 

           ; addUsedRdrNames (map greRdrName dot_dot_gres)
554
           ; return [ HsRecField
555 556 557 558 559 560
                        { hsRecFieldId  = L loc fld
                        , hsRecFieldArg = L loc (mk_arg arg_rdr)
                        , hsRecPun      = False }
                    | gre <- dot_dot_gres
		    , let fld     = gre_name gre
		          arg_rdr = mkRdrUnqual (nameOccName fld) ] }
561 562

    check_disambiguation :: Bool -> Maybe Name -> RnM Parent
563
    -- When disambiguation is on, 
564 565
    check_disambiguation disambig_ok mb_con
      | disambig_ok, Just con <- mb_con
566
      = do { env <- getGlobalRdrEnv; return (ParentIs (find_tycon env con)) }
567 568
      | otherwise = return NoParent
 
569 570 571 572 573 574 575 576 577
    find_tycon :: GlobalRdrEnv -> Name {- DataCon -} -> Name {- TyCon -}
    -- Return the parent *type constructor* of the data constructor
    -- That is, the parent of the data constructor.  
    -- That's the parent to use for looking up record fields.
    find_tycon env con 
      = case lookupGRE_Name env con of
	  [GRE { gre_par = ParentIs p }] -> p
          gres  -> pprPanic "find_tycon" (ppr con $$ ppr gres)

578 579 580 581 582 583 584 585 586 587 588 589 590 591 592
    dup_flds :: [[RdrName]]
        -- Each list represents a RdrName that occurred more than once
        -- (the list contains all occurrences)
        -- Each list in dup_fields is non-empty
    (_, dup_flds) = removeDups compare (getFieldIds flds)

getFieldIds :: [HsRecField id arg] -> [id]
getFieldIds flds = map (unLoc . hsRecFieldId) flds

needFlagDotDot :: HsRecFieldContext -> SDoc
needFlagDotDot ctxt = vcat [ptext (sLit "Illegal `..' in record") <+> pprRFC ctxt,
			    ptext (sLit "Use -XRecordWildCards to permit this")]

badDotDot :: HsRecFieldContext -> SDoc
badDotDot ctxt = ptext (sLit "You cannot use `..' in a record") <+> pprRFC ctxt
593

Ian Lynagh's avatar
Ian Lynagh committed
594
badPun :: Located RdrName -> SDoc
Ian Lynagh's avatar
Ian Lynagh committed
595
badPun fld = vcat [ptext (sLit "Illegal use of punning for field") <+> quotes (ppr fld),
596
		   ptext (sLit "Use -XNamedFieldPuns to permit this")]
597

598 599 600 601 602
dupFieldErr :: HsRecFieldContext -> [RdrName] -> SDoc
dupFieldErr ctxt dups
  = hsep [ptext (sLit "duplicate field name"), 
          quotes (ppr (head dups)),
	  ptext (sLit "in record"), pprRFC ctxt]
603

604 605 606 607
pprRFC :: HsRecFieldContext -> SDoc
pprRFC (HsRecFieldCon {}) = ptext (sLit "construction")
pprRFC (HsRecFieldPat {}) = ptext (sLit "pattern")
pprRFC (HsRecFieldUpd {}) = ptext (sLit "update")
608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623
\end{code}


%************************************************************************
%*									*
\subsubsection{Literals}
%*									*
%************************************************************************

When literals occur we have to make sure
that the types and classes they involve
are made available.

\begin{code}
rnLit :: HsLit -> RnM ()
rnLit (HsChar c) = checkErr (inCharRange c) (bogusCharError c)
Ian Lynagh's avatar
Ian Lynagh committed
624
rnLit _ = return ()
625

Ian Lynagh's avatar
Ian Lynagh committed
626
rnOverLit :: HsOverLit t -> RnM (HsOverLit Name, FreeVars)
627 628 629 630 631 632 633 634
rnOverLit lit@(OverLit {ol_val=val})
  = do	{ let std_name = hsOverLitName val
	; (from_thing_name, fvs) <- lookupSyntaxName std_name
	; let rebindable = case from_thing_name of
				HsVar v -> v /= std_name
				_	-> panic "rnOverLit"
	; return (lit { ol_witness = from_thing_name
		      , ol_rebindable = rebindable }, fvs) }
635 636
\end{code}

637
%************************************************************************
638 639 640 641 642 643
%*									*
\subsubsection{Errors}
%*									*
%************************************************************************

\begin{code}
Ian Lynagh's avatar
Ian Lynagh committed
644
patSigErr :: Outputable a => a -> SDoc
645
patSigErr ty
Ian Lynagh's avatar
Ian Lynagh committed
646
  =  (ptext (sLit "Illegal signature in pattern:") <+> ppr ty)
647
	$$ nest 4 (ptext (sLit "Use -XScopedTypeVariables to permit it"))
648

Ian Lynagh's avatar
Ian Lynagh committed
649
bogusCharError :: Char -> SDoc
650
bogusCharError c
Ian Lynagh's avatar
Ian Lynagh committed
651
  = ptext (sLit "character literal out of range: '\\") <> char c  <> char '\''
652

Ian Lynagh's avatar
Ian Lynagh committed
653
badViewPat :: Pat RdrName -> SDoc
Ian Lynagh's avatar
Ian Lynagh committed
654 655
badViewPat pat = vcat [ptext (sLit "Illegal view pattern: ") <+> ppr pat,
                       ptext (sLit "Use -XViewPatterns to enable view patterns")]
656
\end{code}