Merge branch 'no-pred-ty'
[ghc.git] / compiler / iface / TcIface.lhs
1 %
2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 %
5
6 Type checking of type signatures in interface files
7
8 \begin{code}
9 module TcIface ( 
10         tcImportDecl, checkWiredInTyCon, tcHiBootIface, typecheckIface, 
11         tcIfaceDecl, tcIfaceInst, tcIfaceFamInst, tcIfaceRules,
12         tcIfaceVectInfo, tcIfaceAnnotations, tcIfaceGlobal, tcExtCoreBindings
13  ) where
14
15 #include "HsVersions.h"
16
17 import IfaceSyn
18 import LoadIface
19 import IfaceEnv
20 import BuildTyCl
21 import TcRnMonad
22 import TcType
23 import Type
24 import Coercion
25 import TypeRep
26 import HscTypes
27 import Annotations
28 import InstEnv
29 import FamInstEnv
30 import CoreSyn
31 import CoreUtils
32 import CoreUnfold
33 import CoreLint
34 import WorkWrap
35 import Id
36 import MkId
37 import IdInfo
38 import Class
39 import IParam
40 import TyCon
41 import DataCon
42 import TysWiredIn
43 import TysPrim          ( anyTyConOfKind )
44 import BasicTypes       ( Arity, strongLoopBreaker )
45 import qualified Var
46 import VarEnv
47 import VarSet
48 import Name
49 import NameEnv
50 import NameSet
51 import OccurAnal        ( occurAnalyseExpr )
52 import Demand           ( isBottomingSig )
53 import Module
54 import UniqFM
55 import UniqSupply
56 import Outputable       
57 import ErrUtils
58 import Maybes
59 import SrcLoc
60 import DynFlags
61 import Util
62 import FastString
63
64 import Control.Monad
65 import Data.List
66 \end{code}
67
68 This module takes
69
70         IfaceDecl -> TyThing
71         IfaceType -> Type
72         etc
73
74 An IfaceDecl is populated with RdrNames, and these are not renamed to
75 Names before typechecking, because there should be no scope errors etc.
76
77         -- For (b) consider: f = \$(...h....)
78         -- where h is imported, and calls f via an hi-boot file.  
79         -- This is bad!  But it is not seen as a staging error, because h
80         -- is indeed imported.  We don't want the type-checker to black-hole 
81         -- when simplifying and compiling the splice!
82         --
83         -- Simple solution: discard any unfolding that mentions a variable
84         -- bound in this module (and hence not yet processed).
85         -- The discarding happens when forkM finds a type error.
86
87 %************************************************************************
88 %*                                                                      *
89 %*      tcImportDecl is the key function for "faulting in"              *
90 %*      imported things
91 %*                                                                      *
92 %************************************************************************
93
94 The main idea is this.  We are chugging along type-checking source code, and
95 find a reference to GHC.Base.map.  We call tcLookupGlobal, which doesn't find
96 it in the EPS type envt.  So it 
97         1 loads GHC.Base.hi
98         2 gets the decl for GHC.Base.map
99         3 typechecks it via tcIfaceDecl
100         4 and adds it to the type env in the EPS
101
102 Note that DURING STEP 4, we may find that map's type mentions a type 
103 constructor that also 
104
105 Notice that for imported things we read the current version from the EPS
106 mutable variable.  This is important in situations like
107         ...$(e1)...$(e2)...
108 where the code that e1 expands to might import some defns that 
109 also turn out to be needed by the code that e2 expands to.
110
111 \begin{code}
112 tcImportDecl :: Name -> TcM TyThing
113 -- Entry point for *source-code* uses of importDecl
114 tcImportDecl name 
115   | Just thing <- wiredInNameTyThing_maybe name
116   = do  { when (needWiredInHomeIface thing)
117                (initIfaceTcRn (loadWiredInHomeIface name))
118                 -- See Note [Loading instances for wired-in things]
119         ; return thing }
120   | otherwise
121   = do  { traceIf (text "tcImportDecl" <+> ppr name)
122         ; mb_thing <- initIfaceTcRn (importDecl name)
123         ; case mb_thing of
124             Succeeded thing -> return thing
125             Failed err      -> failWithTc err }
126
127 importDecl :: Name -> IfM lcl (MaybeErr Message TyThing)
128 -- Get the TyThing for this Name from an interface file
129 -- It's not a wired-in thing -- the caller caught that
130 importDecl name
131   = ASSERT( not (isWiredInName name) )
132     do  { traceIf nd_doc
133
134         -- Load the interface, which should populate the PTE
135         ; mb_iface <- ASSERT2( isExternalName name, ppr name ) 
136                       loadInterface nd_doc (nameModule name) ImportBySystem
137         ; case mb_iface of {
138                 Failed err_msg  -> return (Failed err_msg) ;
139                 Succeeded _ -> do
140
141         -- Now look it up again; this time we should find it
142         { eps <- getEps 
143         ; case lookupTypeEnv (eps_PTE eps) name of
144             Just thing -> return (Succeeded thing)
145             Nothing    -> return (Failed not_found_msg)
146     }}}
147   where
148     nd_doc = ptext (sLit "Need decl for") <+> ppr name
149     not_found_msg = hang (ptext (sLit "Can't find interface-file declaration for") <+>
150                                 pprNameSpace (occNameSpace (nameOccName name)) <+> ppr name)
151                        2 (vcat [ptext (sLit "Probable cause: bug in .hi-boot file, or inconsistent .hi file"),
152                                 ptext (sLit "Use -ddump-if-trace to get an idea of which file caused the error")])
153 \end{code}
154
155 %************************************************************************
156 %*                                                                      *
157            Checks for wired-in things
158 %*                                                                      *
159 %************************************************************************
160
161 Note [Loading instances for wired-in things]
162 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
163 We need to make sure that we have at least *read* the interface files
164 for any module with an instance decl or RULE that we might want.  
165
166 * If the instance decl is an orphan, we have a whole separate mechanism
167   (loadOprhanModules)
168
169 * If the instance decl not an orphan, then the act of looking at the
170   TyCon or Class will force in the defining module for the
171   TyCon/Class, and hence the instance decl
172
173 * BUT, if the TyCon is a wired-in TyCon, we don't really need its interface;
174   but we must make sure we read its interface in case it has instances or
175   rules.  That is what LoadIface.loadWiredInHomeInterface does.  It's called
176   from TcIface.{tcImportDecl, checkWiredInTyCon, ifCheckWiredInThing}
177
178 * HOWEVER, only do this for TyCons.  There are no wired-in Classes.  There
179   are some wired-in Ids, but we don't want to load their interfaces. For
180   example, Control.Exception.Base.recSelError is wired in, but that module
181   is compiled late in the base library, and we don't want to force it to
182   load before it's been compiled!
183
184 All of this is done by the type checker. The renamer plays no role.
185 (It used to, but no longer.)
186
187
188 \begin{code}
189 checkWiredInTyCon :: TyCon -> TcM ()
190 -- Ensure that the home module of the TyCon (and hence its instances)
191 -- are loaded. See Note [Loading instances for wired-in things]
192 -- It might not be a wired-in tycon (see the calls in TcUnify),
193 -- in which case this is a no-op.
194 checkWiredInTyCon tc    
195   | not (isWiredInName tc_name) 
196   = return ()
197   | otherwise
198   = do  { mod <- getModule
199         ; ASSERT( isExternalName tc_name ) 
200           when (mod /= nameModule tc_name)
201                (initIfaceTcRn (loadWiredInHomeIface tc_name))
202                 -- Don't look for (non-existent) Float.hi when
203                 -- compiling Float.lhs, which mentions Float of course
204                 -- A bit yukky to call initIfaceTcRn here
205         }
206   where
207     tc_name = tyConName tc
208
209 ifCheckWiredInThing :: TyThing -> IfL ()
210 -- Even though we are in an interface file, we want to make
211 -- sure the instances of a wired-in thing are loaded (imagine f :: Double -> Double)
212 -- Ditto want to ensure that RULES are loaded too
213 -- See Note [Loading instances for wired-in things]
214 ifCheckWiredInThing thing
215   = do  { mod <- getIfModule
216                 -- Check whether we are typechecking the interface for this
217                 -- very module.  E.g when compiling the base library in --make mode
218                 -- we may typecheck GHC.Base.hi. At that point, GHC.Base is not in
219                 -- the HPT, so without the test we'll demand-load it into the PIT!
220                 -- C.f. the same test in checkWiredInTyCon above
221         ; let name = getName thing
222         ; ASSERT2( isExternalName name, ppr name ) 
223           when (needWiredInHomeIface thing && mod /= nameModule name)
224                (loadWiredInHomeIface name) }
225
226 needWiredInHomeIface :: TyThing -> Bool
227 -- Only for TyCons; see Note [Loading instances for wired-in things]
228 needWiredInHomeIface (ATyCon {}) = True
229 needWiredInHomeIface _           = False
230 \end{code}
231
232 %************************************************************************
233 %*                                                                      *
234                 Type-checking a complete interface
235 %*                                                                      *
236 %************************************************************************
237
238 Suppose we discover we don't need to recompile.  Then we must type
239 check the old interface file.  This is a bit different to the
240 incremental type checking we do as we suck in interface files.  Instead
241 we do things similarly as when we are typechecking source decls: we
242 bring into scope the type envt for the interface all at once, using a
243 knot.  Remember, the decls aren't necessarily in dependency order --
244 and even if they were, the type decls might be mutually recursive.
245
246 \begin{code}
247 typecheckIface :: ModIface      -- Get the decls from here
248                -> TcRnIf gbl lcl ModDetails
249 typecheckIface iface
250   = initIfaceTc iface $ \ tc_env_var -> do
251         -- The tc_env_var is freshly allocated, private to 
252         -- type-checking this particular interface
253         {       -- Get the right set of decls and rules.  If we are compiling without -O
254                 -- we discard pragmas before typechecking, so that we don't "see"
255                 -- information that we shouldn't.  From a versioning point of view
256                 -- It's not actually *wrong* to do so, but in fact GHCi is unable 
257                 -- to handle unboxed tuples, so it must not see unfoldings.
258           ignore_prags <- doptM Opt_IgnoreInterfacePragmas
259
260                 -- Typecheck the decls.  This is done lazily, so that the knot-tying
261                 -- within this single module work out right.  In the If monad there is
262                 -- no global envt for the current interface; instead, the knot is tied
263                 -- through the if_rec_types field of IfGblEnv
264         ; names_w_things <- loadDecls ignore_prags (mi_decls iface)
265         ; let type_env = mkNameEnv names_w_things
266         ; writeMutVar tc_env_var type_env
267
268                 -- Now do those rules, instances and annotations
269         ; insts     <- mapM tcIfaceInst (mi_insts iface)
270         ; fam_insts <- mapM tcIfaceFamInst (mi_fam_insts iface)
271         ; rules     <- tcIfaceRules ignore_prags (mi_rules iface)
272         ; anns      <- tcIfaceAnnotations (mi_anns iface)
273
274                 -- Vectorisation information
275         ; vect_info <- tcIfaceVectInfo (mi_module iface) type_env 
276                                        (mi_vect_info iface)
277
278                 -- Exports
279         ; exports <- ifaceExportNames (mi_exports iface)
280
281                 -- Finished
282         ; traceIf (vcat [text "Finished typechecking interface for" <+> ppr (mi_module iface),
283                          text "Type envt:" <+> ppr type_env])
284         ; return $ ModDetails { md_types     = type_env
285                               , md_insts     = insts
286                               , md_fam_insts = fam_insts
287                               , md_rules     = rules
288                               , md_anns      = anns
289                               , md_vect_info = vect_info
290                               , md_exports   = exports
291                               }
292     }
293 \end{code}
294
295
296 %************************************************************************
297 %*                                                                      *
298                 Type and class declarations
299 %*                                                                      *
300 %************************************************************************
301
302 \begin{code}
303 tcHiBootIface :: HscSource -> Module -> TcRn ModDetails
304 -- Load the hi-boot iface for the module being compiled,
305 -- if it indeed exists in the transitive closure of imports
306 -- Return the ModDetails, empty if no hi-boot iface
307 tcHiBootIface hsc_src mod
308   | isHsBoot hsc_src            -- Already compiling a hs-boot file
309   = return emptyModDetails
310   | otherwise
311   = do  { traceIf (text "loadHiBootInterface" <+> ppr mod)
312
313         ; mode <- getGhcMode
314         ; if not (isOneShot mode)
315                 -- In --make and interactive mode, if this module has an hs-boot file
316                 -- we'll have compiled it already, and it'll be in the HPT
317                 -- 
318                 -- We check wheher the interface is a *boot* interface.
319                 -- It can happen (when using GHC from Visual Studio) that we
320                 -- compile a module in TypecheckOnly mode, with a stable, 
321                 -- fully-populated HPT.  In that case the boot interface isn't there
322                 -- (it's been replaced by the mother module) so we can't check it.
323                 -- And that's fine, because if M's ModInfo is in the HPT, then 
324                 -- it's been compiled once, and we don't need to check the boot iface
325           then do { hpt <- getHpt
326                   ; case lookupUFM hpt (moduleName mod) of
327                       Just info | mi_boot (hm_iface info) 
328                                 -> return (hm_details info)
329                       _ -> return emptyModDetails }
330           else do
331
332         -- OK, so we're in one-shot mode.  
333         -- In that case, we're read all the direct imports by now, 
334         -- so eps_is_boot will record if any of our imports mention us by 
335         -- way of hi-boot file
336         { eps <- getEps
337         ; case lookupUFM (eps_is_boot eps) (moduleName mod) of {
338             Nothing -> return emptyModDetails ; -- The typical case
339
340             Just (_, False) -> failWithTc moduleLoop ;
341                 -- Someone below us imported us!
342                 -- This is a loop with no hi-boot in the way
343                 
344             Just (_mod, True) ->        -- There's a hi-boot interface below us
345                 
346     do  { read_result <- findAndReadIface 
347                                 need mod
348                                 True    -- Hi-boot file
349
350         ; case read_result of
351                 Failed err               -> failWithTc (elaborate err)
352                 Succeeded (iface, _path) -> typecheckIface iface
353     }}}}
354   where
355     need = ptext (sLit "Need the hi-boot interface for") <+> ppr mod
356                  <+> ptext (sLit "to compare against the Real Thing")
357
358     moduleLoop = ptext (sLit "Circular imports: module") <+> quotes (ppr mod) 
359                      <+> ptext (sLit "depends on itself")
360
361     elaborate err = hang (ptext (sLit "Could not find hi-boot interface for") <+> 
362                           quotes (ppr mod) <> colon) 4 err
363 \end{code}
364
365
366 %************************************************************************
367 %*                                                                      *
368                 Type and class declarations
369 %*                                                                      *
370 %************************************************************************
371
372 When typechecking a data type decl, we *lazily* (via forkM) typecheck
373 the constructor argument types.  This is in the hope that we may never
374 poke on those argument types, and hence may never need to load the
375 interface files for types mentioned in the arg types.
376
377 E.g.    
378         data Foo.S = MkS Baz.T
379 Mabye we can get away without even loading the interface for Baz!
380
381 This is not just a performance thing.  Suppose we have
382         data Foo.S = MkS Baz.T
383         data Baz.T = MkT Foo.S
384 (in different interface files, of course).
385 Now, first we load and typecheck Foo.S, and add it to the type envt.  
386 If we do explore MkS's argument, we'll load and typecheck Baz.T.
387 If we explore MkT's argument we'll find Foo.S already in the envt.  
388
389 If we typechecked constructor args eagerly, when loading Foo.S we'd try to
390 typecheck the type Baz.T.  So we'd fault in Baz.T... and then need Foo.S...
391 which isn't done yet.
392
393 All very cunning. However, there is a rather subtle gotcha which bit
394 me when developing this stuff.  When we typecheck the decl for S, we
395 extend the type envt with S, MkS, and all its implicit Ids.  Suppose
396 (a bug, but it happened) that the list of implicit Ids depended in
397 turn on the constructor arg types.  Then the following sequence of
398 events takes place:
399         * we build a thunk <t> for the constructor arg tys
400         * we build a thunk for the extended type environment (depends on <t>)
401         * we write the extended type envt into the global EPS mutvar
402         
403 Now we look something up in the type envt
404         * that pulls on <t>
405         * which reads the global type envt out of the global EPS mutvar
406         * but that depends in turn on <t>
407
408 It's subtle, because, it'd work fine if we typechecked the constructor args 
409 eagerly -- they don't need the extended type envt.  They just get the extended
410 type envt by accident, because they look at it later.
411
412 What this means is that the implicitTyThings MUST NOT DEPEND on any of
413 the forkM stuff.
414
415
416 \begin{code}
417 tcIfaceDecl :: Bool     -- True <=> discard IdInfo on IfaceId bindings
418             -> IfaceDecl
419             -> IfL TyThing
420 tcIfaceDecl = tc_iface_decl NoParentTyCon
421
422 tc_iface_decl :: TyConParent    -- For nested declarations
423               -> Bool   -- True <=> discard IdInfo on IfaceId bindings
424               -> IfaceDecl
425               -> IfL TyThing
426 tc_iface_decl _ ignore_prags (IfaceId {ifName = occ_name, ifType = iface_type, 
427                                        ifIdDetails = details, ifIdInfo = info})
428   = do  { name <- lookupIfaceTop occ_name
429         ; ty <- tcIfaceType iface_type
430         ; details <- tcIdDetails ty details
431         ; info <- tcIdInfo ignore_prags name ty info
432         ; return (AnId (mkGlobalId details name ty info)) }
433
434 tc_iface_decl parent _ (IfaceData {ifName = occ_name, 
435                           ifTyVars = tv_bndrs, 
436                           ifCtxt = ctxt, ifGadtSyntax = gadt_syn,
437                           ifCons = rdr_cons, 
438                           ifRec = is_rec, 
439                           ifFamInst = mb_family })
440   = bindIfaceTyVars_AT tv_bndrs $ \ tyvars -> do
441     { tc_name <- lookupIfaceTop occ_name
442     ; tycon <- fixM ( \ tycon -> do
443             { stupid_theta <- tcIfaceCtxt ctxt
444             ; cons <- tcIfaceDataCons tc_name tycon tyvars rdr_cons
445             ; mb_fam_inst  <- tcFamInst mb_family
446             ; buildAlgTyCon tc_name tyvars stupid_theta cons is_rec
447                             gadt_syn parent mb_fam_inst
448             })
449     ; traceIf (text "tcIfaceDecl4" <+> ppr tycon)
450     ; return (ATyCon tycon) }
451
452 tc_iface_decl parent _ (IfaceSyn {ifName = occ_name, ifTyVars = tv_bndrs, 
453                                   ifSynRhs = mb_rhs_ty,
454                                   ifSynKind = kind, ifFamInst = mb_family})
455    = bindIfaceTyVars_AT tv_bndrs $ \ tyvars -> do
456      { tc_name  <- lookupIfaceTop occ_name
457      ; rhs_kind <- tcIfaceType kind     -- Note [Synonym kind loop]
458      ; rhs      <- forkM (mk_doc tc_name) $ 
459                    tc_syn_rhs mb_rhs_ty
460      ; fam_info <- tcFamInst mb_family
461      ; tycon <- buildSynTyCon tc_name tyvars rhs rhs_kind parent fam_info
462      ; return (ATyCon tycon)
463      }
464    where
465      mk_doc n = ptext (sLit "Type syonym") <+> ppr n
466      tc_syn_rhs Nothing   = return SynFamilyTyCon
467      tc_syn_rhs (Just ty) = do { rhs_ty <- tcIfaceType ty
468                                ; return (SynonymTyCon rhs_ty) }
469
470 tc_iface_decl _parent ignore_prags
471             (IfaceClass {ifCtxt = rdr_ctxt, ifName = tc_occ,
472                  ifTyVars = tv_bndrs, ifFDs = rdr_fds, 
473                          ifATs = rdr_ats, ifSigs = rdr_sigs, 
474                          ifRec = tc_isrec })
475 -- ToDo: in hs-boot files we should really treat abstract classes specially,
476 --       as we do abstract tycons
477   = bindIfaceTyVars tv_bndrs $ \ tyvars -> do
478     { tc_name <- lookupIfaceTop tc_occ
479     ; ctxt <- tcIfaceCtxt rdr_ctxt
480     ; sigs <- mapM tc_sig rdr_sigs
481     ; fds  <- mapM tc_fd rdr_fds
482     ; cls  <- fixM $ \ cls -> do
483               { ats  <- mapM (tc_at cls) rdr_ats
484               ; buildClass ignore_prags tc_name tyvars ctxt fds ats sigs tc_isrec }
485     ; return (ATyCon (classTyCon cls)) }
486   where
487    tc_sig (IfaceClassOp occ dm rdr_ty)
488      = do { op_name <- lookupIfaceTop occ
489           ; op_ty   <- forkM (mk_doc op_name rdr_ty) (tcIfaceType rdr_ty)
490                 -- Must be done lazily for just the same reason as the 
491                 -- type of a data con; to avoid sucking in types that
492                 -- it mentions unless it's necessray to do so
493           ; return (op_name, dm, op_ty) }
494
495    tc_at cls (IfaceAT tc_decl defs_decls)
496      = do tc <- tc_iface_tc_decl (AssocFamilyTyCon cls) tc_decl
497           defs <- mapM tc_iface_at_def defs_decls
498           return (tc, defs)
499
500    tc_iface_tc_decl parent decl = do
501        ATyCon tc <- tc_iface_decl parent ignore_prags decl
502        return tc
503
504    tc_iface_at_def (IfaceATD tvs pat_tys ty) =
505        bindIfaceTyVars_AT tvs $ \tvs' -> liftM2 (ATD tvs') (mapM tcIfaceType pat_tys) (tcIfaceType ty)
506
507    mk_doc op_name op_ty = ptext (sLit "Class op") <+> sep [ppr op_name, ppr op_ty]
508
509    tc_fd (tvs1, tvs2) = do { tvs1' <- mapM tcIfaceTyVar tvs1
510                            ; tvs2' <- mapM tcIfaceTyVar tvs2
511                            ; return (tvs1', tvs2') }
512
513 tc_iface_decl _ _ (IfaceForeign {ifName = rdr_name, ifExtName = ext_name})
514   = do  { name <- lookupIfaceTop rdr_name
515         ; return (ATyCon (mkForeignTyCon name ext_name 
516                                          liftedTypeKind 0)) }
517
518 tcFamInst :: Maybe (IfaceTyCon, [IfaceType]) -> IfL (Maybe (TyCon, [Type]))
519 tcFamInst Nothing           = return Nothing
520 tcFamInst (Just (fam, tys)) = do { famTyCon <- tcIfaceTyCon fam
521                                  ; insttys <- mapM tcIfaceType tys
522                                  ; return $ Just (famTyCon, insttys) }
523
524 tcIfaceDataCons :: Name -> TyCon -> [TyVar] -> IfaceConDecls -> IfL AlgTyConRhs
525 tcIfaceDataCons tycon_name tycon _ if_cons
526   = case if_cons of
527         IfAbstractTyCon dis -> return (AbstractTyCon dis)
528         IfOpenDataTyCon  -> return DataFamilyTyCon
529         IfDataTyCon cons -> do  { data_cons <- mapM tc_con_decl cons
530                                 ; return (mkDataTyConRhs data_cons) }
531         IfNewTyCon con   -> do  { data_con <- tc_con_decl con
532                                 ; mkNewTyConRhs tycon_name tycon data_con }
533   where
534     tc_con_decl (IfCon { ifConInfix = is_infix, 
535                          ifConUnivTvs = univ_tvs, ifConExTvs = ex_tvs,
536                          ifConOcc = occ, ifConCtxt = ctxt, ifConEqSpec = spec,
537                          ifConArgTys = args, ifConFields = field_lbls,
538                          ifConStricts = stricts})
539      = bindIfaceTyVars univ_tvs $ \ univ_tyvars -> do
540        bindIfaceTyVars ex_tvs    $ \ ex_tyvars -> do
541         { name  <- lookupIfaceTop occ
542         ; eq_spec <- tcIfaceEqSpec spec
543         ; theta <- tcIfaceCtxt ctxt     -- Laziness seems not worth the bother here
544                 -- At one stage I thought that this context checking *had*
545                 -- to be lazy, because of possible mutual recursion between the
546                 -- type and the classe: 
547                 -- E.g. 
548                 --      class Real a where { toRat :: a -> Ratio Integer }
549                 --      data (Real a) => Ratio a = ...
550                 -- But now I think that the laziness in checking class ops breaks 
551                 -- the loop, so no laziness needed
552
553         -- Read the argument types, but lazily to avoid faulting in
554         -- the component types unless they are really needed
555         ; arg_tys <- forkM (mk_doc name) (mapM tcIfaceType args)
556         ; lbl_names <- mapM lookupIfaceTop field_lbls
557
558         -- Remember, tycon is the representation tycon
559         ; let orig_res_ty = mkFamilyTyConApp tycon 
560                                 (substTyVars (mkTopTvSubst eq_spec) univ_tyvars)
561
562         ; buildDataCon name is_infix {- Not infix -}
563                        stricts lbl_names
564                        univ_tyvars ex_tyvars 
565                        eq_spec theta 
566                        arg_tys orig_res_ty tycon
567         }
568     mk_doc con_name = ptext (sLit "Constructor") <+> ppr con_name
569
570 tcIfaceEqSpec :: [(OccName, IfaceType)] -> IfL [(TyVar, Type)]
571 tcIfaceEqSpec spec
572   = mapM do_item spec
573   where
574     do_item (occ, if_ty) = do { tv <- tcIfaceTyVar (occNameFS occ)
575                               ; ty <- tcIfaceType if_ty
576                               ; return (tv,ty) }
577 \end{code}
578
579 Note [Synonym kind loop]
580 ~~~~~~~~~~~~~~~~~~~~~~~~
581 Notice that we eagerly grab the *kind* from the interface file, but
582 build a forkM thunk for the *rhs* (and family stuff).  To see why, 
583 consider this (Trac #2412)
584
585 M.hs:       module M where { import X; data T = MkT S }
586 X.hs:       module X where { import {-# SOURCE #-} M; type S = T }
587 M.hs-boot:  module M where { data T }
588
589 When kind-checking M.hs we need S's kind.  But we do not want to
590 find S's kind from (typeKind S-rhs), because we don't want to look at
591 S-rhs yet!  Since S is imported from X.hi, S gets just one chance to
592 be defined, and we must not do that until we've finished with M.T.
593
594 Solution: record S's kind in the interface file; now we can safely
595 look at it.
596
597 %************************************************************************
598 %*                                                                      *
599                 Instances
600 %*                                                                      *
601 %************************************************************************
602
603 \begin{code}
604 tcIfaceInst :: IfaceInst -> IfL Instance
605 tcIfaceInst (IfaceInst { ifDFun = dfun_occ, ifOFlag = oflag,
606                               ifInstCls = cls, ifInstTys = mb_tcs })
607   = do { dfun    <- forkM (ptext (sLit "Dict fun") <+> ppr dfun_occ) $
608                      tcIfaceExtId dfun_occ
609        ; let mb_tcs' = map (fmap ifaceTyConName) mb_tcs
610        ; return (mkImportedInstance cls mb_tcs' dfun oflag) }
611
612 tcIfaceFamInst :: IfaceFamInst -> IfL FamInst
613 tcIfaceFamInst (IfaceFamInst { ifFamInstTyCon = tycon, 
614                                ifFamInstFam = fam, ifFamInstTys = mb_tcs })
615 --      { tycon'  <- forkM (ptext (sLit "Inst tycon") <+> ppr tycon) $
616 -- the above line doesn't work, but this below does => CPP in Haskell = evil!
617     = do tycon'  <- forkM (text ("Inst tycon") <+> ppr tycon) $
618                     tcIfaceTyCon tycon
619          let mb_tcs' = map (fmap ifaceTyConName) mb_tcs
620          return (mkImportedFamInst fam mb_tcs' tycon')
621 \end{code}
622
623
624 %************************************************************************
625 %*                                                                      *
626                 Rules
627 %*                                                                      *
628 %************************************************************************
629
630 We move a IfaceRule from eps_rules to eps_rule_base when all its LHS free vars
631 are in the type environment.  However, remember that typechecking a Rule may 
632 (as a side effect) augment the type envt, and so we may need to iterate the process.
633
634 \begin{code}
635 tcIfaceRules :: Bool            -- True <=> ignore rules
636              -> [IfaceRule]
637              -> IfL [CoreRule]
638 tcIfaceRules ignore_prags if_rules
639   | ignore_prags = return []
640   | otherwise    = mapM tcIfaceRule if_rules
641
642 tcIfaceRule :: IfaceRule -> IfL CoreRule
643 tcIfaceRule (IfaceRule {ifRuleName = name, ifActivation = act, ifRuleBndrs = bndrs,
644                         ifRuleHead = fn, ifRuleArgs = args, ifRuleRhs = rhs,
645                         ifRuleAuto = auto })
646   = do  { ~(bndrs', args', rhs') <- 
647                 -- Typecheck the payload lazily, in the hope it'll never be looked at
648                 forkM (ptext (sLit "Rule") <+> ftext name) $
649                 bindIfaceBndrs bndrs                      $ \ bndrs' ->
650                 do { args' <- mapM tcIfaceExpr args
651                    ; rhs'  <- tcIfaceExpr rhs
652                    ; return (bndrs', args', rhs') }
653         ; let mb_tcs = map ifTopFreeName args
654         ; return (Rule { ru_name = name, ru_fn = fn, ru_act = act, 
655                           ru_bndrs = bndrs', ru_args = args', 
656                           ru_rhs = occurAnalyseExpr rhs', 
657                           ru_rough = mb_tcs,
658                           ru_auto = auto,
659                           ru_local = False }) } -- An imported RULE is never for a local Id
660                                                 -- or, even if it is (module loop, perhaps)
661                                                 -- we'll just leave it in the non-local set
662   where
663         -- This function *must* mirror exactly what Rules.topFreeName does
664         -- We could have stored the ru_rough field in the iface file
665         -- but that would be redundant, I think.
666         -- The only wrinkle is that we must not be deceived by
667         -- type syononyms at the top of a type arg.  Since
668         -- we can't tell at this point, we are careful not
669         -- to write them out in coreRuleToIfaceRule
670     ifTopFreeName :: IfaceExpr -> Maybe Name
671     ifTopFreeName (IfaceType (IfaceTyConApp tc _ )) = Just (ifaceTyConName tc)
672     ifTopFreeName (IfaceApp f _)                    = ifTopFreeName f
673     ifTopFreeName (IfaceExt n)                      = Just n
674     ifTopFreeName _                                 = Nothing
675 \end{code}
676
677
678 %************************************************************************
679 %*                                                                      *
680                 Annotations
681 %*                                                                      *
682 %************************************************************************
683
684 \begin{code}
685 tcIfaceAnnotations :: [IfaceAnnotation] -> IfL [Annotation]
686 tcIfaceAnnotations = mapM tcIfaceAnnotation
687
688 tcIfaceAnnotation :: IfaceAnnotation -> IfL Annotation
689 tcIfaceAnnotation (IfaceAnnotation target serialized) = do
690     target' <- tcIfaceAnnTarget target
691     return $ Annotation {
692         ann_target = target',
693         ann_value = serialized
694     }
695
696 tcIfaceAnnTarget :: IfaceAnnTarget -> IfL (AnnTarget Name)
697 tcIfaceAnnTarget (NamedTarget occ) = do
698     name <- lookupIfaceTop occ
699     return $ NamedTarget name
700 tcIfaceAnnTarget (ModuleTarget mod) = do
701     return $ ModuleTarget mod
702
703 \end{code}
704
705
706 %************************************************************************
707 %*                                                                      *
708                 Vectorisation information
709 %*                                                                      *
710 %************************************************************************
711
712 \begin{code}
713 tcIfaceVectInfo :: Module -> TypeEnv  -> IfaceVectInfo -> IfL VectInfo
714 tcIfaceVectInfo mod typeEnv (IfaceVectInfo 
715                              { ifaceVectInfoVar          = vars
716                              , ifaceVectInfoTyCon        = tycons
717                              , ifaceVectInfoTyConReuse   = tyconsReuse
718                              , ifaceVectInfoScalarVars   = scalarVars
719                              , ifaceVectInfoScalarTyCons = scalarTyCons
720                              })
721   = do { let scalarTyConsSet = mkNameSet scalarTyCons
722        ; vVars     <- mapM vectVarMapping                          vars
723        ; tyConRes1 <- mapM vectTyConMapping                        tycons
724        ; tyConRes2 <- mapM (vectTyConReuseMapping scalarTyConsSet) tyconsReuse
725        ; let (vTyCons, vDataCons, vPAs, vIsos) = unzip4 (tyConRes1 ++ tyConRes2)
726        ; return $ VectInfo 
727                   { vectInfoVar          = mkVarEnv  vVars
728                   , vectInfoTyCon        = mkNameEnv vTyCons
729                   , vectInfoDataCon      = mkNameEnv (concat vDataCons)
730                   , vectInfoPADFun       = mkNameEnv (catMaybes vPAs)
731                   , vectInfoIso          = mkNameEnv (catMaybes vIsos)
732                   , vectInfoScalarVars   = mkVarSet  (map lookupVar scalarVars)
733                   , vectInfoScalarTyCons = scalarTyConsSet
734                   }
735        }
736   where
737     vectVarMapping name 
738       = do { vName <- lookupOrig mod (mkLocalisedOccName mod mkVectOcc name)
739            ; var  <- forkM (text ("vect var")  <+> ppr name)  $
740                      tcIfaceExtId name
741            ; vVar <- forkM (text ("vect vVar") <+> ppr vName) $
742                      tcIfaceExtId vName
743            ; return (var, (var, vVar))
744            }
745     vectTyConMapping name 
746       = do { vName   <- lookupOrig mod (mkLocalisedOccName mod mkVectTyConOcc name)
747            ; paName  <- lookupOrig mod (mkLocalisedOccName mod mkPADFunOcc    name)
748            ; isoName <- lookupOrig mod (mkLocalisedOccName mod mkVectIsoOcc   name)
749            -- FIXME: we will need to use tcIfaceTyCon/tcIfaceExtId on some of these (but depends
750            --   on how we exactly define the 'VECTORISE type' pragma to work)
751            ; let { tycon    = lookupTyCon name
752                  ; vTycon   = lookupTyCon vName
753                  ; paTycon  = lookupVar paName
754                  ; isoTycon = lookupVar isoName
755                  }
756            ; vDataCons <- mapM vectDataConMapping (tyConDataCons tycon)
757            ; return ( (name, (tycon, vTycon))          -- (T, T_v)
758                     , vDataCons                        -- list of (Ci, Ci_v)
759                     , Just (vName, (vTycon, paTycon))  -- (T_v, paT)
760                     , Just (name, (tycon, isoTycon))   -- (T, isoT)
761                     )
762            }
763     vectTyConReuseMapping scalarNames name 
764       = do { paName  <- lookupOrig mod (mkLocalisedOccName mod mkPADFunOcc  name)
765            ; isoName <- lookupOrig mod (mkLocalisedOccName mod mkVectIsoOcc name)
766            ; tycon <- forkM (text ("vect reuse tycon") <+> ppr name) $
767                       tcIfaceTyCon (IfaceTc name) -- somewhat naughty for wired in tycons, but ok
768            ; if name `elemNameSet` scalarNames
769              then do
770            { return ( (name, (tycon, tycon))      -- scalar type constructors expose no data...
771                     , []                          -- ...constructors and have no PA and ISO vars...
772                     , Nothing                     -- ...see "Note [Pragmas to vectorise tycons]" in..
773                     , Nothing                     -- ...'Vectorise.Type.Env'
774                     )
775            } else do 
776            { let { paTycon    = lookupVar paName
777                  ; isoTycon   = lookupVar isoName
778                  ; vDataCons  = [ (dataConName dc, (dc, dc)) 
779                                 | dc <- tyConDataCons tycon]
780                  }
781            ; return ( (name, (tycon, tycon))          -- (T, T)
782                     , vDataCons                       -- list of (Ci, Ci)
783                     , Just (name, (tycon, paTycon))   -- (T, paT)
784                     , Just (name, (tycon, isoTycon))  -- (T, isoT)
785                     )
786            }}
787     vectDataConMapping datacon
788       = do { let name = dataConName datacon
789            ; vName <- lookupOrig mod (mkLocalisedOccName mod mkVectDataConOcc name)
790            ; let vDataCon = lookupDataCon vName
791            ; return (name, (datacon, vDataCon))
792            }
793     --
794     lookupVar name = case lookupTypeEnv typeEnv name of
795                        Just (AnId var) -> var
796                        Just _         -> 
797                          pprPanic "TcIface.tcIfaceVectInfo: not an id" (ppr name)
798                        Nothing        ->
799                          pprPanic "TcIface.tcIfaceVectInfo: unknown name of id" (ppr name)
800     lookupTyCon name = case lookupTypeEnv typeEnv name of
801                          Just (ATyCon tc) -> tc
802                          Just _         -> 
803                            pprPanic "TcIface.tcIfaceVectInfo: not a tycon" (ppr name)
804                          Nothing        ->
805                            pprPanic "TcIface.tcIfaceVectInfo: unknown name of tycon" (ppr name)
806     lookupDataCon name = case lookupTypeEnv typeEnv name of
807                            Just (ADataCon dc) -> dc
808                            Just _         -> 
809                              pprPanic "TcIface.tcIfaceVectInfo: not a datacon" (ppr name)
810                            Nothing        ->
811                              pprPanic "TcIface.tcIfaceVectInfo: unknown name of datacon" (ppr name)
812 \end{code}
813
814 %************************************************************************
815 %*                                                                      *
816                         Types
817 %*                                                                      *
818 %************************************************************************
819
820 \begin{code}
821 tcIfaceType :: IfaceType -> IfL Type
822 tcIfaceType (IfaceTyVar n)        = do { tv <- tcIfaceTyVar n; return (TyVarTy tv) }
823 tcIfaceType (IfaceAppTy t1 t2)    = do { t1' <- tcIfaceType t1; t2' <- tcIfaceType t2; return (AppTy t1' t2') }
824 tcIfaceType (IfaceFunTy t1 t2)    = do { t1' <- tcIfaceType t1; t2' <- tcIfaceType t2; return (FunTy t1' t2') }
825 tcIfaceType (IfaceTyConApp tc ts) = do { tc' <- tcIfaceTyCon tc; ts' <- tcIfaceTypes ts; return (mkTyConApp tc' ts') }
826 tcIfaceType (IfaceForAllTy tv t)  = bindIfaceTyVar tv $ \ tv' -> do { t' <- tcIfaceType t; return (ForAllTy tv' t') }
827 tcIfaceType t@(IfaceCoConApp {})  = pprPanic "tcIfaceType" (ppr t)
828
829 tcIfaceTypes :: [IfaceType] -> IfL [Type]
830 tcIfaceTypes tys = mapM tcIfaceType tys
831
832 -----------------------------------------
833 tcIfaceCtxt :: IfaceContext -> IfL ThetaType
834 tcIfaceCtxt sts = mapM tcIfaceType sts
835 \end{code}
836
837 %************************************************************************
838 %*                                                                      *
839                         Coercions
840 %*                                                                      *
841 %************************************************************************
842
843 \begin{code}
844 tcIfaceCo :: IfaceType -> IfL Coercion
845 tcIfaceCo (IfaceTyVar n)        = mkCoVarCo <$> tcIfaceCoVar n
846 tcIfaceCo (IfaceAppTy t1 t2)    = mkAppCo <$> tcIfaceCo t1 <*> tcIfaceCo t2
847 tcIfaceCo (IfaceFunTy t1 t2)    = mkFunCo <$> tcIfaceCo t1 <*> tcIfaceCo t2
848 tcIfaceCo (IfaceTyConApp tc ts) = mkTyConAppCo <$> tcIfaceTyCon tc <*> mapM tcIfaceCo ts
849 tcIfaceCo (IfaceCoConApp tc ts) = tcIfaceCoApp tc ts
850 tcIfaceCo (IfaceForAllTy tv t)  = bindIfaceTyVar tv $ \ tv' ->
851                                   mkForAllCo tv' <$> tcIfaceCo t
852
853 tcIfaceCoApp :: IfaceCoCon -> [IfaceType] -> IfL Coercion
854 tcIfaceCoApp IfaceReflCo      [t]     = Refl         <$> tcIfaceType t
855 tcIfaceCoApp (IfaceCoAx n)    ts      = AxiomInstCo  <$> tcIfaceCoAxiom n <*> mapM tcIfaceCo ts
856 tcIfaceCoApp (IfaceIPCoAx ip) ts      = AxiomInstCo  <$> liftM ipCoAxiom (newIPName ip) <*> mapM tcIfaceCo ts
857 tcIfaceCoApp IfaceUnsafeCo    [t1,t2] = UnsafeCo     <$> tcIfaceType t1 <*> tcIfaceType t2
858 tcIfaceCoApp IfaceSymCo       [t]     = SymCo        <$> tcIfaceCo t
859 tcIfaceCoApp IfaceTransCo     [t1,t2] = TransCo      <$> tcIfaceCo t1 <*> tcIfaceCo t2
860 tcIfaceCoApp IfaceInstCo      [t1,t2] = InstCo       <$> tcIfaceCo t1 <*> tcIfaceType t2
861 tcIfaceCoApp (IfaceNthCo d)   [t]     = NthCo d      <$> tcIfaceCo t
862 tcIfaceCoApp cc ts = pprPanic "toIfaceCoApp" (ppr cc <+> ppr ts)
863
864 tcIfaceCoVar :: FastString -> IfL CoVar
865 tcIfaceCoVar = tcIfaceLclId
866 \end{code}
867
868
869 %************************************************************************
870 %*                                                                      *
871                         Core
872 %*                                                                      *
873 %************************************************************************
874
875 \begin{code}
876 tcIfaceExpr :: IfaceExpr -> IfL CoreExpr
877 tcIfaceExpr (IfaceType ty)
878   = Type <$> tcIfaceType ty
879
880 tcIfaceExpr (IfaceCo co)
881   = Coercion <$> tcIfaceCo co
882
883 tcIfaceExpr (IfaceCast expr co)
884   = Cast <$> tcIfaceExpr expr <*> tcIfaceCo co
885
886 tcIfaceExpr (IfaceLcl name)
887   = Var <$> tcIfaceLclId name
888
889 tcIfaceExpr (IfaceTick modName tickNo)
890   = Var <$> tcIfaceTick modName tickNo
891
892 tcIfaceExpr (IfaceExt gbl)
893   = Var <$> tcIfaceExtId gbl
894
895 tcIfaceExpr (IfaceTupId boxity arity)
896   = return $ Var (dataConWorkId (tupleCon boxity arity))
897
898 tcIfaceExpr (IfaceLit lit)
899   = return (Lit lit)
900
901 tcIfaceExpr (IfaceFCall cc ty) = do
902     ty' <- tcIfaceType ty
903     u <- newUnique
904     return (Var (mkFCallId u cc ty'))
905
906 tcIfaceExpr (IfaceTuple boxity args)  = do
907     args' <- mapM tcIfaceExpr args
908     -- Put the missing type arguments back in
909     let con_args = map (Type . exprType) args' ++ args'
910     return (mkApps (Var con_id) con_args)
911   where
912     arity = length args
913     con_id = dataConWorkId (tupleCon boxity arity)
914     
915
916 tcIfaceExpr (IfaceLam bndr body)
917   = bindIfaceBndr bndr $ \bndr' ->
918     Lam bndr' <$> tcIfaceExpr body
919
920 tcIfaceExpr (IfaceApp fun arg)
921   = App <$> tcIfaceExpr fun <*> tcIfaceExpr arg
922
923 tcIfaceExpr (IfaceCase scrut case_bndr alts)  = do
924     scrut' <- tcIfaceExpr scrut
925     case_bndr_name <- newIfaceName (mkVarOccFS case_bndr)
926     let
927         scrut_ty   = exprType scrut'
928         case_bndr' = mkLocalId case_bndr_name scrut_ty
929         tc_app     = splitTyConApp scrut_ty
930                 -- NB: Won't always succeed (polymoprhic case)
931                 --     but won't be demanded in those cases
932                 -- NB: not tcSplitTyConApp; we are looking at Core here
933                 --     look through non-rec newtypes to find the tycon that
934                 --     corresponds to the datacon in this case alternative
935
936     extendIfaceIdEnv [case_bndr'] $ do
937      alts' <- mapM (tcIfaceAlt scrut' tc_app) alts
938      return (Case scrut' case_bndr' (coreAltsType alts') alts')
939
940 tcIfaceExpr (IfaceLet (IfaceNonRec (IfLetBndr fs ty info) rhs) body)
941   = do  { name    <- newIfaceName (mkVarOccFS fs)
942         ; ty'     <- tcIfaceType ty
943         ; id_info <- tcIdInfo False {- Don't ignore prags; we are inside one! -}
944                               name ty' info
945         ; let id = mkLocalIdWithInfo name ty' id_info
946         ; rhs' <- tcIfaceExpr rhs
947         ; body' <- extendIfaceIdEnv [id] (tcIfaceExpr body)
948         ; return (Let (NonRec id rhs') body') }
949
950 tcIfaceExpr (IfaceLet (IfaceRec pairs) body)
951   = do { ids <- mapM tc_rec_bndr (map fst pairs)
952        ; extendIfaceIdEnv ids $ do
953        { pairs' <- zipWithM tc_pair pairs ids
954        ; body' <- tcIfaceExpr body
955        ; return (Let (Rec pairs') body') } }
956  where
957    tc_rec_bndr (IfLetBndr fs ty _) 
958      = do { name <- newIfaceName (mkVarOccFS fs)  
959           ; ty'  <- tcIfaceType ty
960           ; return (mkLocalId name ty') }
961    tc_pair (IfLetBndr _ _ info, rhs) id
962      = do { rhs' <- tcIfaceExpr rhs
963           ; id_info <- tcIdInfo False {- Don't ignore prags; we are inside one! -}
964                                 (idName id) (idType id) info
965           ; return (setIdInfo id id_info, rhs') }
966
967 tcIfaceExpr (IfaceNote note expr) = do
968     expr' <- tcIfaceExpr expr
969     case note of
970         IfaceSCC cc       -> return (Note (SCC cc)   expr')
971         IfaceCoreNote n   -> return (Note (CoreNote n) expr')
972
973 -------------------------
974 tcIfaceAlt :: CoreExpr -> (TyCon, [Type])
975            -> (IfaceConAlt, [FastString], IfaceExpr)
976            -> IfL (AltCon, [TyVar], CoreExpr)
977 tcIfaceAlt _ _ (IfaceDefault, names, rhs)
978   = ASSERT( null names ) do
979     rhs' <- tcIfaceExpr rhs
980     return (DEFAULT, [], rhs')
981   
982 tcIfaceAlt _ _ (IfaceLitAlt lit, names, rhs)
983   = ASSERT( null names ) do
984     rhs' <- tcIfaceExpr rhs
985     return (LitAlt lit, [], rhs')
986
987 -- A case alternative is made quite a bit more complicated
988 -- by the fact that we omit type annotations because we can
989 -- work them out.  True enough, but its not that easy!
990 tcIfaceAlt scrut (tycon, inst_tys) (IfaceDataAlt data_occ, arg_strs, rhs)
991   = do  { con <- tcIfaceDataCon data_occ
992         ; when (debugIsOn && not (con `elem` tyConDataCons tycon))
993                (failIfM (ppr scrut $$ ppr con $$ ppr tycon $$ ppr (tyConDataCons tycon)))
994         ; tcIfaceDataAlt con inst_tys arg_strs rhs }
995
996 tcIfaceAlt _ (tycon, inst_tys) (IfaceTupleAlt _boxity, arg_occs, rhs)
997   = ASSERT2( isTupleTyCon tycon && tupleTyConSort tycon == _boxity, ppr tycon )
998     do  { let [data_con] = tyConDataCons tycon
999         ; tcIfaceDataAlt data_con inst_tys arg_occs rhs }
1000
1001 tcIfaceDataAlt :: DataCon -> [Type] -> [FastString] -> IfaceExpr
1002                -> IfL (AltCon, [TyVar], CoreExpr)
1003 tcIfaceDataAlt con inst_tys arg_strs rhs
1004   = do  { us <- newUniqueSupply
1005         ; let uniqs = uniqsFromSupply us
1006         ; let (ex_tvs, arg_ids)
1007                       = dataConRepFSInstPat arg_strs uniqs con inst_tys
1008
1009         ; rhs' <- extendIfaceTyVarEnv ex_tvs    $
1010                   extendIfaceIdEnv arg_ids      $
1011                   tcIfaceExpr rhs
1012         ; return (DataAlt con, ex_tvs ++ arg_ids, rhs') }
1013 \end{code}
1014
1015
1016 \begin{code}
1017 tcExtCoreBindings :: [IfaceBinding] -> IfL [CoreBind]   -- Used for external core
1018 tcExtCoreBindings []     = return []
1019 tcExtCoreBindings (b:bs) = do_one b (tcExtCoreBindings bs)
1020
1021 do_one :: IfaceBinding -> IfL [CoreBind] -> IfL [CoreBind]
1022 do_one (IfaceNonRec bndr rhs) thing_inside
1023   = do  { rhs' <- tcIfaceExpr rhs
1024         ; bndr' <- newExtCoreBndr bndr
1025         ; extendIfaceIdEnv [bndr'] $ do 
1026         { core_binds <- thing_inside
1027         ; return (NonRec bndr' rhs' : core_binds) }}
1028
1029 do_one (IfaceRec pairs) thing_inside
1030   = do  { bndrs' <- mapM newExtCoreBndr bndrs
1031         ; extendIfaceIdEnv bndrs' $ do
1032         { rhss' <- mapM tcIfaceExpr rhss
1033         ; core_binds <- thing_inside
1034         ; return (Rec (bndrs' `zip` rhss') : core_binds) }}
1035   where
1036     (bndrs,rhss) = unzip pairs
1037 \end{code}
1038
1039
1040 %************************************************************************
1041 %*                                                                      *
1042                 IdInfo
1043 %*                                                                      *
1044 %************************************************************************
1045
1046 \begin{code}
1047 tcIdDetails :: Type -> IfaceIdDetails -> IfL IdDetails
1048 tcIdDetails _  IfVanillaId = return VanillaId
1049 tcIdDetails ty IfDFunId
1050   = return (DFunId (isNewTyCon (classTyCon cls)))
1051   where
1052     (_, _, cls, _) = tcSplitDFunTy ty
1053
1054 tcIdDetails _ (IfRecSelId tc naughty)
1055   = do { tc' <- tcIfaceTyCon tc
1056        ; return (RecSelId { sel_tycon = tc', sel_naughty = naughty }) }
1057
1058 tcIdInfo :: Bool -> Name -> Type -> IfaceIdInfo -> IfL IdInfo
1059 tcIdInfo ignore_prags name ty info 
1060   | ignore_prags = return vanillaIdInfo
1061   | otherwise    = case info of
1062                         NoInfo       -> return vanillaIdInfo
1063                         HasInfo info -> foldlM tcPrag init_info info
1064   where
1065     -- Set the CgInfo to something sensible but uninformative before
1066     -- we start; default assumption is that it has CAFs
1067     init_info = vanillaIdInfo
1068
1069     tcPrag :: IdInfo -> IfaceInfoItem -> IfL IdInfo
1070     tcPrag info HsNoCafRefs        = return (info `setCafInfo`   NoCafRefs)
1071     tcPrag info (HsArity arity)    = return (info `setArityInfo` arity)
1072     tcPrag info (HsStrictness str) = return (info `setStrictnessInfo` Just str)
1073     tcPrag info (HsInline prag)    = return (info `setInlinePragInfo` prag)
1074
1075         -- The next two are lazy, so they don't transitively suck stuff in
1076     tcPrag info (HsUnfold lb if_unf) 
1077       = do { unf <- tcUnfolding name ty info if_unf
1078            ; let info1 | lb        = info `setOccInfo` strongLoopBreaker
1079                        | otherwise = info
1080            ; return (info1 `setUnfoldingInfoLazily` unf) }
1081 \end{code}
1082
1083 \begin{code}
1084 tcUnfolding :: Name -> Type -> IdInfo -> IfaceUnfolding -> IfL Unfolding
1085 tcUnfolding name _ info (IfCoreUnfold stable if_expr)
1086   = do  { mb_expr <- tcPragExpr name if_expr
1087         ; let unf_src = if stable then InlineStable else InlineRhs
1088         ; return (case mb_expr of
1089                     Nothing   -> NoUnfolding
1090                     Just expr -> mkUnfolding unf_src
1091                                              True {- Top level -} 
1092                                              is_bottoming expr) }
1093   where
1094      -- Strictness should occur before unfolding!
1095     is_bottoming = case strictnessInfo info of
1096                      Just sig -> isBottomingSig sig
1097                      Nothing  -> False
1098
1099 tcUnfolding name _ _ (IfCompulsory if_expr)
1100   = do  { mb_expr <- tcPragExpr name if_expr
1101         ; return (case mb_expr of
1102                     Nothing   -> NoUnfolding
1103                     Just expr -> mkCompulsoryUnfolding expr) }
1104
1105 tcUnfolding name _ _ (IfInlineRule arity unsat_ok boring_ok if_expr)
1106   = do  { mb_expr <- tcPragExpr name if_expr
1107         ; return (case mb_expr of
1108                     Nothing   -> NoUnfolding
1109                     Just expr -> mkCoreUnfolding InlineStable True expr arity 
1110                                                  (UnfWhen unsat_ok boring_ok))
1111     }
1112
1113 tcUnfolding name dfun_ty _ (IfDFunUnfold ops)
1114   = do { mb_ops1 <- forkM_maybe doc $ mapM tcIfaceExpr ops
1115        ; return (case mb_ops1 of
1116                     Nothing   -> noUnfolding
1117                     Just ops1 -> mkDFunUnfolding dfun_ty ops1) }
1118   where
1119     doc = text "Class ops for dfun" <+> ppr name
1120
1121 tcUnfolding name ty info (IfExtWrapper arity wkr)
1122   = tcIfaceWrapper name ty info arity (tcIfaceExtId wkr)
1123 tcUnfolding name ty info (IfLclWrapper arity wkr)
1124   = tcIfaceWrapper name ty info arity (tcIfaceLclId wkr)
1125
1126 -------------
1127 tcIfaceWrapper :: Name -> Type -> IdInfo -> Arity -> IfL Id -> IfL Unfolding
1128 tcIfaceWrapper name ty info arity get_worker
1129   = do  { mb_wkr_id <- forkM_maybe doc get_worker
1130         ; us <- newUniqueSupply
1131         ; return (case mb_wkr_id of
1132                      Nothing     -> noUnfolding
1133                      Just wkr_id -> make_inline_rule wkr_id us) }
1134   where
1135     doc = text "Worker for" <+> ppr name
1136
1137     make_inline_rule wkr_id us 
1138         = mkWwInlineRule wkr_id
1139                          (initUs_ us (mkWrapper ty strict_sig) wkr_id) 
1140                          arity
1141
1142         -- Again we rely here on strictness info always appearing 
1143         -- before unfolding
1144     strict_sig = case strictnessInfo info of
1145                    Just sig -> sig
1146                    Nothing  -> pprPanic "Worker info but no strictness for" (ppr name)
1147 \end{code}
1148
1149 For unfoldings we try to do the job lazily, so that we never type check
1150 an unfolding that isn't going to be looked at.
1151
1152 \begin{code}
1153 tcPragExpr :: Name -> IfaceExpr -> IfL (Maybe CoreExpr)
1154 tcPragExpr name expr
1155   = forkM_maybe doc $ do
1156     core_expr' <- tcIfaceExpr expr
1157
1158                 -- Check for type consistency in the unfolding
1159     ifDOptM Opt_DoCoreLinting $ do
1160         in_scope <- get_in_scope
1161         case lintUnfolding noSrcLoc in_scope core_expr' of
1162           Nothing       -> return ()
1163           Just fail_msg -> do { mod <- getIfModule 
1164                               ; pprPanic "Iface Lint failure" 
1165                                   (vcat [ ptext (sLit "In interface for") <+> ppr mod
1166                                         , hang doc 2 fail_msg
1167                                         , ppr name <+> equals <+> ppr core_expr'
1168                                         , ptext (sLit "Iface expr =") <+> ppr expr ]) }
1169     return core_expr'
1170   where
1171     doc = text "Unfolding of" <+> ppr name
1172
1173     get_in_scope :: IfL [Var] -- Totally disgusting; but just for linting
1174     get_in_scope        
1175         = do { (gbl_env, lcl_env) <- getEnvs
1176              ; rec_ids <- case if_rec_types gbl_env of
1177                             Nothing -> return []
1178                             Just (_, get_env) -> do
1179                                { type_env <- setLclEnv () get_env
1180                                ; return (typeEnvIds type_env) }
1181              ; return (varEnvElts (if_tv_env lcl_env) ++
1182                        varEnvElts (if_id_env lcl_env) ++
1183                        rec_ids) }
1184 \end{code}
1185
1186
1187
1188 %************************************************************************
1189 %*                                                                      *
1190                 Getting from Names to TyThings
1191 %*                                                                      *
1192 %************************************************************************
1193
1194 \begin{code}
1195 tcIfaceGlobal :: Name -> IfL TyThing
1196 tcIfaceGlobal name
1197   | Just thing <- wiredInNameTyThing_maybe name
1198         -- Wired-in things include TyCons, DataCons, and Ids
1199   = do { ifCheckWiredInThing thing; return thing }
1200   | otherwise
1201   = do  { env <- getGblEnv
1202         ; case if_rec_types env of {    -- Note [Tying the knot]
1203             Just (mod, get_type_env) 
1204                 | nameIsLocalOrFrom mod name
1205                 -> do           -- It's defined in the module being compiled
1206                 { type_env <- setLclEnv () get_type_env         -- yuk
1207                 ; case lookupNameEnv type_env name of
1208                         Just thing -> return thing
1209                         Nothing   -> pprPanic "tcIfaceGlobal (local): not found:"  
1210                                                 (ppr name $$ ppr type_env) }
1211
1212           ; _ -> do
1213
1214         { hsc_env <- getTopEnv
1215         ; mb_thing <- liftIO (lookupTypeHscEnv hsc_env name)
1216         ; case mb_thing of {
1217             Just thing -> return thing ;
1218             Nothing    -> do
1219
1220         { mb_thing <- importDecl name   -- It's imported; go get it
1221         ; case mb_thing of
1222             Failed err      -> failIfM err
1223             Succeeded thing -> return thing
1224     }}}}}
1225
1226 -- Note [Tying the knot]
1227 -- ~~~~~~~~~~~~~~~~~~~~~
1228 -- The if_rec_types field is used in two situations:
1229 --
1230 -- a) Compiling M.hs, which indiretly imports Foo.hi, which mentions M.T
1231 --    Then we look up M.T in M's type environment, which is splatted into if_rec_types
1232 --    after we've built M's type envt.
1233 --
1234 -- b) In ghc --make, during the upsweep, we encounter M.hs, whose interface M.hi
1235 --    is up to date.  So we call typecheckIface on M.hi.  This splats M.T into 
1236 --    if_rec_types so that the (lazily typechecked) decls see all the other decls
1237 --
1238 -- In case (b) it's important to do the if_rec_types check *before* looking in the HPT
1239 -- Because if M.hs also has M.hs-boot, M.T will *already be* in the HPT, but in its
1240 -- emasculated form (e.g. lacking data constructors).
1241
1242 tcIfaceTyCon :: IfaceTyCon -> IfL TyCon
1243 tcIfaceTyCon IfaceIntTc         = tcWiredInTyCon intTyCon
1244 tcIfaceTyCon IfaceBoolTc        = tcWiredInTyCon boolTyCon
1245 tcIfaceTyCon IfaceCharTc        = tcWiredInTyCon charTyCon
1246 tcIfaceTyCon IfaceListTc        = tcWiredInTyCon listTyCon
1247 tcIfaceTyCon IfacePArrTc        = tcWiredInTyCon parrTyCon
1248 tcIfaceTyCon (IfaceTupTc bx ar) = tcWiredInTyCon (tupleTyCon bx ar)
1249 tcIfaceTyCon (IfaceIPTc n)      = do { n' <- newIPName n
1250                                      ; tcWiredInTyCon (ipTyCon n') }
1251 tcIfaceTyCon (IfaceAnyTc kind)  = do { tc_kind <- tcIfaceType kind
1252                                      ; tcWiredInTyCon (anyTyConOfKind tc_kind) }
1253 tcIfaceTyCon (IfaceTc name)     = do { thing <- tcIfaceGlobal name 
1254                                      ; return (check_tc (tyThingTyCon thing)) }
1255   where
1256     check_tc tc
1257      | debugIsOn = case toIfaceTyCon tc of
1258                    IfaceTc _ -> tc
1259                    _         -> pprTrace "check_tc" (ppr tc) tc
1260      | otherwise = tc
1261 -- we should be okay just returning Kind constructors without extra loading
1262 tcIfaceTyCon IfaceLiftedTypeKindTc   = return liftedTypeKindTyCon
1263 tcIfaceTyCon IfaceOpenTypeKindTc     = return openTypeKindTyCon
1264 tcIfaceTyCon IfaceUnliftedTypeKindTc = return unliftedTypeKindTyCon
1265 tcIfaceTyCon IfaceArgTypeKindTc      = return argTypeKindTyCon
1266 tcIfaceTyCon IfaceUbxTupleKindTc     = return ubxTupleKindTyCon
1267 tcIfaceTyCon IfaceConstraintKindTc   = return constraintKindTyCon
1268
1269 -- Even though we are in an interface file, we want to make
1270 -- sure the instances and RULES of this tycon are loaded 
1271 -- Imagine: f :: Double -> Double
1272 tcWiredInTyCon :: TyCon -> IfL TyCon
1273 tcWiredInTyCon tc = do { ifCheckWiredInThing (ATyCon tc)
1274                        ; return tc }
1275
1276 tcIfaceCoAxiom :: Name -> IfL CoAxiom
1277 tcIfaceCoAxiom name = do { thing <- tcIfaceGlobal name
1278                          ; return (tyThingCoAxiom thing) }
1279
1280 tcIfaceDataCon :: Name -> IfL DataCon
1281 tcIfaceDataCon name = do { thing <- tcIfaceGlobal name
1282                          ; case thing of
1283                                 ADataCon dc -> return dc
1284                                 _       -> pprPanic "tcIfaceExtDC" (ppr name$$ ppr thing) }
1285
1286 tcIfaceExtId :: Name -> IfL Id
1287 tcIfaceExtId name = do { thing <- tcIfaceGlobal name
1288                        ; case thing of
1289                           AnId id -> return id
1290                           _       -> pprPanic "tcIfaceExtId" (ppr name$$ ppr thing) }
1291 \end{code}
1292
1293 %************************************************************************
1294 %*                                                                      *
1295                 Bindings
1296 %*                                                                      *
1297 %************************************************************************
1298
1299 \begin{code}
1300 bindIfaceBndr :: IfaceBndr -> (CoreBndr -> IfL a) -> IfL a
1301 bindIfaceBndr (IfaceIdBndr (fs, ty)) thing_inside
1302   = do  { name <- newIfaceName (mkVarOccFS fs)
1303         ; ty' <- tcIfaceType ty
1304         ; let id = mkLocalId name ty'
1305         ; extendIfaceIdEnv [id] (thing_inside id) }
1306 bindIfaceBndr (IfaceTvBndr bndr) thing_inside
1307   = bindIfaceTyVar bndr thing_inside
1308     
1309 bindIfaceBndrs :: [IfaceBndr] -> ([CoreBndr] -> IfL a) -> IfL a
1310 bindIfaceBndrs []     thing_inside = thing_inside []
1311 bindIfaceBndrs (b:bs) thing_inside
1312   = bindIfaceBndr b     $ \ b' ->
1313     bindIfaceBndrs bs   $ \ bs' ->
1314     thing_inside (b':bs')
1315
1316 -----------------------
1317 newExtCoreBndr :: IfaceLetBndr -> IfL Id
1318 newExtCoreBndr (IfLetBndr var ty _)    -- Ignoring IdInfo for now
1319   = do  { mod <- getIfModule
1320         ; name <- newGlobalBinder mod (mkVarOccFS var) noSrcSpan
1321         ; ty' <- tcIfaceType ty
1322         ; return (mkLocalId name ty') }
1323
1324 -----------------------
1325 bindIfaceTyVar :: IfaceTvBndr -> (TyVar -> IfL a) -> IfL a
1326 bindIfaceTyVar (occ,kind) thing_inside
1327   = do  { name <- newIfaceName (mkTyVarOccFS occ)
1328         ; tyvar <- mk_iface_tyvar name kind
1329         ; extendIfaceTyVarEnv [tyvar] (thing_inside tyvar) }
1330
1331 bindIfaceTyVars :: [IfaceTvBndr] -> ([TyVar] -> IfL a) -> IfL a
1332 bindIfaceTyVars bndrs thing_inside
1333   = do  { names <- newIfaceNames (map mkTyVarOccFS occs)
1334         ; tyvars <- zipWithM mk_iface_tyvar names kinds
1335         ; extendIfaceTyVarEnv tyvars (thing_inside tyvars) }
1336   where
1337     (occs,kinds) = unzip bndrs
1338
1339 mk_iface_tyvar :: Name -> IfaceKind -> IfL TyVar
1340 mk_iface_tyvar name ifKind
1341    = do { kind <- tcIfaceType ifKind
1342         ; return (Var.mkTyVar name kind) }
1343
1344 bindIfaceTyVars_AT :: [IfaceTvBndr] -> ([TyVar] -> IfL a) -> IfL a
1345 -- Used for type variable in nested associated data/type declarations
1346 -- where some of the type variables are already in scope
1347 --    class C a where { data T a b }
1348 -- Here 'a' is in scope when we look at the 'data T'
1349 bindIfaceTyVars_AT [] thing_inside
1350   = thing_inside []
1351 bindIfaceTyVars_AT (b@(tv_occ,_) : bs) thing_inside 
1352   = bindIfaceTyVars_AT bs $ \ bs' ->
1353     do { mb_tv <- lookupIfaceTyVar tv_occ
1354        ; case mb_tv of
1355            Just b' -> thing_inside (b':bs')
1356            Nothing -> bindIfaceTyVar b $ \ b' -> 
1357                       thing_inside (b':bs') }
1358 \end{code} 
1359