[project @ 2001-11-26 09:20:25 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcModule.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[TcModule]{Typechecking a whole module}
5
6 \begin{code}
7 module TcModule (
8         typecheckModule, typecheckIface, typecheckStmt, typecheckExpr,
9         typecheckExtraDecls,
10         TcResults(..)
11     ) where
12
13 #include "HsVersions.h"
14
15 import CmdLineOpts      ( DynFlag(..), DynFlags, dopt )
16 import HsSyn            ( HsBinds(..), MonoBinds(..), HsDecl(..), HsExpr(..),
17                           Stmt(..), InPat(..), HsMatchContext(..), HsDoContext(..), RuleDecl(..),
18                           isIfaceRuleDecl, nullBinds, mkSimpleMatch, placeHolderType
19                         )
20 import PrelNames        ( mAIN_Name, mainName, ioTyConName, printName,
21                           returnIOName, bindIOName, failIOName, 
22                           itName
23                         )
24 import MkId             ( unsafeCoerceId )
25 import RnHsSyn          ( RenamedHsBinds, RenamedHsDecl, RenamedStmt,
26                           RenamedHsExpr )
27 import TcHsSyn          ( TypecheckedMonoBinds, TypecheckedHsExpr,
28                           TypecheckedForeignDecl, TypecheckedRuleDecl,
29                           zonkTopBinds, zonkForeignExports, zonkRules, mkHsLet,
30                           zonkExpr, zonkIdBndr
31                         )
32
33 import MkIface          ( pprModDetails )
34 import TcExpr           ( tcMonoExpr )
35 import TcMonad
36 import TcMType          ( newTyVarTy, zonkTcType, tcInstType )
37 import TcType           ( Type, liftedTypeKind, openTypeKind,
38                           tyVarsOfType, tidyType, tcFunResultTy,
39                           mkForAllTys, mkFunTys, mkTyConApp, tcSplitForAllTys
40                         )
41 import TcMatches        ( tcStmtsAndThen )
42 import Inst             ( emptyLIE, plusLIE )
43 import TcBinds          ( tcTopBinds )
44 import TcClassDcl       ( tcClassDecls2 )
45 import TcDefaults       ( tcDefaults, defaultDefaultTys )
46 import TcEnv            ( TcEnv, RecTcEnv, InstInfo(iDFunId), tcExtendGlobalValEnv, tcLookup_maybe,
47                           isLocalThing, tcSetEnv, tcSetInstEnv, initTcEnv, getTcGEnv,
48                           tcExtendGlobalTypeEnv, tcLookupGlobalId, tcLookupTyCon,
49                           TcTyThing(..), tcLookupId 
50                         )
51 import TcRules          ( tcIfaceRules, tcSourceRules )
52 import TcForeign        ( tcForeignImports, tcForeignExports )
53 import TcIfaceSig       ( tcInterfaceSigs )
54 import TcInstDcls       ( tcInstDecls1, tcInstDecls2 )
55 import TcUnify          ( unifyTauTy )
56 import TcSimplify       ( tcSimplifyTop, tcSimplifyInfer )
57 import TcTyClsDecls     ( tcTyAndClassDecls )
58 import CoreUnfold       ( unfoldingTemplate )
59 import TysWiredIn       ( mkListTy, unitTy )
60 import ErrUtils         ( printErrorsAndWarnings, errorsFound, 
61                           dumpIfSet_dyn, dumpIfSet_dyn_or, showPass )
62 import Id               ( Id, idType, idUnfolding )
63 import Module           ( Module, moduleName )
64 import Name             ( Name )
65 import NameEnv          ( lookupNameEnv )
66 import TyCon            ( tyConGenInfo )
67 import BasicTypes       ( EP(..), Fixity, RecFlag(..) )
68 import SrcLoc           ( noSrcLoc )
69 import Outputable
70 import IO               ( stdout )
71 import HscTypes         ( PersistentCompilerState(..), HomeSymbolTable, 
72                           PackageTypeEnv, ModIface(..),
73                           ModDetails(..), DFunId,
74                           TypeEnv, extendTypeEnvList, typeEnvTyCons, typeEnvElts,
75                           mkTypeEnv
76                         )
77 \end{code}
78
79
80 %************************************************************************
81 %*                                                                      *
82 \subsection{The stmt interface}
83 %*                                                                      *
84 %************************************************************************
85
86 \begin{code}
87 typecheckStmt
88    :: DynFlags
89    -> PersistentCompilerState
90    -> HomeSymbolTable
91    -> TypeEnv              -- The interactive context's type envt 
92    -> PrintUnqualified     -- For error printing
93    -> Module               -- Is this really needed
94    -> [Name]               -- Names bound by the Stmt (empty for expressions)
95    -> (RenamedStmt,        -- The stmt itself
96        [RenamedHsDecl])    -- Plus extra decls it sucked in from interface files
97    -> IO (Maybe (PersistentCompilerState, 
98                  TypecheckedHsExpr, 
99                  [Id],
100                  Type))
101                 -- The returned [Id] is the same as the input except for
102                 -- ExprStmt, in which case the returned [Name] is [itName]
103
104 typecheckStmt dflags pcs hst ic_type_env unqual this_mod names (stmt, iface_decls)
105   = typecheck dflags pcs hst unqual $
106
107          -- use the default default settings, i.e. [Integer, Double]
108     tcSetDefaultTys defaultDefaultTys $
109
110         -- Typecheck the extra declarations
111     fixTc (\ ~(unf_env, _, _, _, _) ->
112         tcImports unf_env pcs hst get_fixity this_mod iface_decls
113     )                   `thenTc` \ (env, new_pcs, local_inst_info, deriv_binds, local_rules) ->
114     ASSERT( null local_inst_info && nullBinds deriv_binds && null local_rules )
115
116     tcSetEnv env                                $
117     tcExtendGlobalTypeEnv ic_type_env           $
118
119         -- The real work is done here
120     tcUserStmt names stmt               `thenTc` \ (expr, bound_ids) ->
121
122     traceTc (text "tcs 1") `thenNF_Tc_`
123     zonkExpr expr                       `thenNF_Tc` \ zonked_expr ->
124     mapNF_Tc zonkIdBndr bound_ids       `thenNF_Tc` \ zonked_ids ->
125
126     ioToTc (dumpIfSet_dyn dflags Opt_D_dump_tc "Bound Ids" (vcat (map ppr zonked_ids))) `thenNF_Tc_`
127     ioToTc (dumpIfSet_dyn dflags Opt_D_dump_tc "Typechecked" (ppr zonked_expr))         `thenNF_Tc_`
128
129     returnTc (new_pcs, zonked_expr, zonked_ids, error "typecheckStmt: no type")
130
131   where
132     get_fixity :: Name -> Maybe Fixity
133     get_fixity n = pprPanic "typecheckStmt" (ppr n)
134 \end{code}
135
136 Here is the grand plan, implemented in tcUserStmt
137
138         What you type                   The IO [HValue] that hscStmt returns
139         -------------                   ------------------------------------
140         let pat = expr          ==>     let pat = expr in return [coerce HVal x, coerce HVal y, ...]
141                                         bindings: [x,y,...]
142
143         pat <- expr             ==>     expr >>= \ pat -> return [coerce HVal x, coerce HVal y, ...]
144                                         bindings: [x,y,...]
145
146         expr (of IO type)       ==>     expr >>= \ v -> return [v]
147           [NB: result not printed]      bindings: [it]
148           
149
150         expr (of non-IO type, 
151           result showable)      ==>     let v = expr in print v >> return [v]
152                                         bindings: [it]
153
154         expr (of non-IO type, 
155           result not showable)  ==>     error
156
157
158 \begin{code}
159 tcUserStmt :: [Name] -> RenamedStmt -> TcM (TypecheckedHsExpr, [Id])
160
161 tcUserStmt names (ExprStmt expr _ loc)
162   = ASSERT( null names )
163     tcGetUnique                 `thenNF_Tc` \ uniq ->
164     let 
165         fresh_it = itName uniq
166         the_bind = FunMonoBind fresh_it False 
167                         [ mkSimpleMatch [] expr placeHolderType loc ] loc
168     in
169     tryTc_ (traceTc (text "tcs 1b") `thenNF_Tc_`
170                 tc_stmts [fresh_it] [
171                     LetStmt (MonoBind the_bind [] NonRecursive),
172                     ExprStmt (HsApp (HsVar printName) (HsVar fresh_it)) placeHolderType loc])
173            (    traceTc (text "tcs 1a") `thenNF_Tc_`
174                 tc_stmts [fresh_it] [BindStmt (VarPatIn fresh_it) expr loc])
175
176 tcUserStmt names stmt
177   = tc_stmts names [stmt]
178     
179
180 tc_stmts names stmts
181   = tcLookupGlobalId returnIOName       `thenNF_Tc` \ return_id ->
182     tcLookupGlobalId bindIOName         `thenNF_Tc` \ bind_id ->
183     tcLookupGlobalId failIOName         `thenNF_Tc` \ fail_id ->
184     tcLookupTyCon ioTyConName           `thenNF_Tc` \ ioTyCon ->
185     newTyVarTy liftedTypeKind           `thenNF_Tc` \ res_ty ->
186     let
187         io_ty = (\ ty -> mkTyConApp ioTyCon [ty], res_ty)
188
189                 -- mk_return builds the expression
190                 --      returnIO @ [()] [coerce () x, ..,  coerce () z]
191         mk_return ids = HsApp (TyApp (HsVar return_id) [mkListTy unitTy]) 
192                               (ExplicitList unitTy (map mk_item ids))
193
194         mk_item id = HsApp (TyApp (HsVar unsafeCoerceId) [idType id, unitTy])
195                            (HsVar id)
196     in
197
198     traceTc (text "tcs 2") `thenNF_Tc_`
199     tcStmtsAndThen combine (DoCtxt DoExpr) io_ty stmts  (
200         -- Look up the names right in the middle,
201         -- where they will all be in scope
202         mapNF_Tc tcLookupId names                       `thenNF_Tc` \ ids ->
203         returnTc ((ids, [ResultStmt (mk_return ids) noSrcLoc]), emptyLIE)
204     )                                                   `thenTc` \ ((ids, tc_stmts), lie) ->
205
206         -- Simplify the context right here, so that we fail
207         -- if there aren't enough instances.  Notably, when we see
208         --              e
209         -- we use tryTc_ to try         it <- e
210         -- and then                     let it = e
211         -- It's the simplify step that rejects the first.
212
213     traceTc (text "tcs 3") `thenNF_Tc_`
214     tcSimplifyTop lie                   `thenTc` \ const_binds ->
215     traceTc (text "tcs 4") `thenNF_Tc_`
216
217     returnTc (mkHsLet const_binds $
218               HsDoOut DoExpr tc_stmts return_id bind_id fail_id 
219                       (mkTyConApp ioTyCon [mkListTy unitTy]) noSrcLoc,
220               ids)
221   where
222     combine stmt (ids, stmts) = (ids, stmt:stmts)
223 \end{code}
224
225 %************************************************************************
226 %*                                                                      *
227 \subsection{Typechecking an expression}
228 %*                                                                      *
229 %************************************************************************
230
231 \begin{code}
232 typecheckExpr :: DynFlags
233               -> PersistentCompilerState
234               -> HomeSymbolTable
235               -> TypeEnv           -- The interactive context's type envt 
236               -> PrintUnqualified       -- For error printing
237               -> Module
238               -> (RenamedHsExpr,        -- The expression itself
239                   [RenamedHsDecl])      -- Plus extra decls it sucked in from interface files
240               -> IO (Maybe (PersistentCompilerState, 
241                             TypecheckedHsExpr, 
242                             [Id],       -- always empty (matches typecheckStmt)
243                             Type))
244
245 typecheckExpr dflags pcs hst ic_type_env unqual this_mod (expr, decls)
246   = typecheck dflags pcs hst unqual $
247
248          -- use the default default settings, i.e. [Integer, Double]
249     tcSetDefaultTys defaultDefaultTys $
250
251         -- Typecheck the extra declarations
252     fixTc (\ ~(unf_env, _, _, _, _) ->
253         tcImports unf_env pcs hst get_fixity this_mod decls
254     )                   `thenTc` \ (env, new_pcs, local_inst_info, deriv_binds, local_rules) ->
255     ASSERT( null local_inst_info && nullBinds deriv_binds && null local_rules )
256
257         -- Now typecheck the expression
258     tcSetEnv env                        $
259     tcExtendGlobalTypeEnv ic_type_env   $
260
261     newTyVarTy openTypeKind             `thenTc` \ ty ->
262     tcMonoExpr expr ty                  `thenTc` \ (e', lie) ->
263     tcSimplifyInfer smpl_doc (tyVarsOfType ty) lie 
264                                         `thenTc` \ (qtvs, lie_free, dict_binds, dict_ids) ->
265     tcSimplifyTop lie_free              `thenTc` \ const_binds ->
266
267     let all_expr = mkHsLet const_binds  $
268                    TyLam qtvs           $
269                    DictLam dict_ids     $
270                    mkHsLet dict_binds   $       
271                    e'
272
273         all_expr_ty = mkForAllTys qtvs  $
274                       mkFunTys (map idType dict_ids) $
275                       ty
276     in
277
278     zonkExpr all_expr                           `thenNF_Tc` \ zonked_expr ->
279     zonkTcType all_expr_ty                      `thenNF_Tc` \ zonked_ty ->
280     ioToTc (dumpIfSet_dyn dflags 
281                 Opt_D_dump_tc "Typechecked" (ppr zonked_expr)) `thenNF_Tc_`
282     returnTc (new_pcs, zonked_expr, [], zonked_ty) 
283
284   where
285     get_fixity :: Name -> Maybe Fixity
286     get_fixity n = pprPanic "typecheckExpr" (ppr n)
287
288     smpl_doc = ptext SLIT("main expression")
289 \end{code}
290
291 %************************************************************************
292 %*                                                                      *
293 \subsection{Typechecking extra declarations}
294 %*                                                                      *
295 %************************************************************************
296
297 \begin{code}
298 typecheckExtraDecls 
299    :: DynFlags
300    -> PersistentCompilerState
301    -> HomeSymbolTable
302    -> PrintUnqualified     -- For error printing
303    -> Module               -- Is this really needed
304    -> [RenamedHsDecl]      -- extra decls sucked in from interface files
305    -> IO (Maybe PersistentCompilerState)
306
307 typecheckExtraDecls  dflags pcs hst unqual this_mod decls
308  = typecheck dflags pcs hst unqual $
309      fixTc (\ ~(unf_env, _, _, _, _) ->
310           tcImports unf_env pcs hst get_fixity this_mod decls
311      )  `thenTc` \ (env, new_pcs, local_inst_info, deriv_binds, local_rules) ->
312      ASSERT( null local_inst_info && nullBinds deriv_binds && null local_rules )
313      returnTc new_pcs
314  where
315     get_fixity n = pprPanic "typecheckExpr" (ppr n)
316 \end{code}
317
318 %************************************************************************
319 %*                                                                      *
320 \subsection{Typechecking a module}
321 %*                                                                      *
322 %************************************************************************
323
324 \begin{code}
325 typecheckModule
326         :: DynFlags
327         -> PersistentCompilerState
328         -> HomeSymbolTable
329         -> ModIface             -- Iface for this module
330         -> PrintUnqualified     -- For error printing
331         -> [RenamedHsDecl]
332         -> IO (Maybe (PersistentCompilerState, TcResults))
333                         -- The new PCS is Augmented with imported information,
334                                                 -- (but not stuff from this module)
335
336 data TcResults
337   = TcResults {
338         -- All these fields have info *just for this module*
339         tc_env     :: TypeEnv,                  -- The top level TypeEnv
340         tc_insts   :: [DFunId],                 -- Instances 
341         tc_rules   :: [TypecheckedRuleDecl],    -- Transformation rules
342         tc_binds   :: TypecheckedMonoBinds,     -- Bindings
343         tc_fords   :: [TypecheckedForeignDecl]  -- Foreign import & exports.
344     }
345
346
347 typecheckModule dflags pcs hst mod_iface unqual decls
348   = do  { maybe_tc_result <- typecheck dflags pcs hst unqual $
349                              tcModule pcs hst get_fixity this_mod decls
350         ; printTcDump dflags unqual maybe_tc_result
351         ; return maybe_tc_result }
352   where
353     this_mod   = mi_module   mod_iface
354     fixity_env = mi_fixities mod_iface
355
356     get_fixity :: Name -> Maybe Fixity
357     get_fixity nm = lookupNameEnv fixity_env nm
358
359
360 tcModule :: PersistentCompilerState
361          -> HomeSymbolTable
362          -> (Name -> Maybe Fixity)
363          -> Module
364          -> [RenamedHsDecl]
365          -> TcM (PersistentCompilerState, TcResults)
366
367 tcModule pcs hst get_fixity this_mod decls
368   = fixTc (\ ~(unf_env, _, _) ->
369                 -- Loop back the final environment, including the fully zonked
370                 -- versions of bindings from this module.  In the presence of mutual
371                 -- recursion, interface type signatures may mention variables defined
372                 -- in this module, which is why the knot is so big
373
374                 -- Type-check the type and class decls, and all imported decls
375         tcImports unf_env pcs hst get_fixity this_mod decls     
376                                 `thenTc` \ (env, new_pcs, local_insts, deriv_binds, local_rules) ->
377
378         tcSetEnv env                            $
379
380         -- Foreign import declarations next
381         traceTc (text "Tc4")                    `thenNF_Tc_`
382         tcForeignImports decls                  `thenTc`    \ (fo_ids, foi_decls) ->
383         tcExtendGlobalValEnv fo_ids             $
384     
385         -- Default declarations
386         tcDefaults decls                        `thenTc` \ defaulting_tys ->
387         tcSetDefaultTys defaulting_tys          $
388         
389         -- Value declarations next.
390         -- We also typecheck any extra binds that came out of the "deriving" process
391         traceTc (text "Default types" <+> ppr defaulting_tys)   `thenNF_Tc_`
392         traceTc (text "Tc5")                            `thenNF_Tc_`
393         tcTopBinds (val_binds `ThenBinds` deriv_binds)  `thenTc` \ ((val_binds, env), lie_valdecls) ->
394         
395         -- Second pass over class and instance declarations, 
396         -- plus rules and foreign exports, to generate bindings
397         tcSetEnv env                            $
398         tcClassDecls2 this_mod tycl_decls       `thenNF_Tc` \ (lie_clasdecls, cls_dm_binds, dm_ids) ->
399         tcExtendGlobalValEnv dm_ids             $
400         tcInstDecls2  local_insts               `thenNF_Tc` \ (lie_instdecls, inst_binds) ->
401         tcForeignExports decls                  `thenTc`    \ (lie_fodecls,   foe_binds, foe_decls) ->
402         tcSourceRules source_rules              `thenNF_Tc` \ (lie_rules,     more_local_rules) ->
403         
404                 -- CHECK THAT main IS DEFINED WITH RIGHT TYPE, IF REQUIRED
405         traceTc (text "Tc6")                    `thenNF_Tc_`
406         tcCheckMain this_mod                    `thenTc_`
407
408              -- Deal with constant or ambiguous InstIds.  How could
409              -- there be ambiguous ones?  They can only arise if a
410              -- top-level decl falls under the monomorphism
411              -- restriction, and no subsequent decl instantiates its
412              -- type.  (Usually, ambiguous type variables are resolved
413              -- during the generalisation step.)
414              --
415              -- Note that we must do this *after* tcCheckMain, because of the
416              -- following bizarre case: 
417              --         main = return ()
418              -- Here, we infer main :: forall a. m a, where m is a free
419              -- type variable.  tcCheckMain will unify it with IO, and that
420              -- must happen before tcSimplifyTop, since the latter will report
421              -- m as ambiguous
422         let
423             lie_alldecls = lie_valdecls  `plusLIE`
424                            lie_instdecls `plusLIE`
425                            lie_clasdecls `plusLIE`
426                            lie_fodecls   `plusLIE`
427                            lie_rules
428         in
429         tcSimplifyTop lie_alldecls      `thenTc` \ const_inst_binds ->
430         traceTc (text "endsimpltop") `thenTc_`
431         
432             -- Backsubstitution.    This must be done last.
433             -- Even tcSimplifyTop may do some unification.
434         let
435             all_binds = val_binds               `AndMonoBinds`
436                             inst_binds          `AndMonoBinds`
437                             cls_dm_binds        `AndMonoBinds`
438                             const_inst_binds    `AndMonoBinds`
439                             foe_binds
440         in
441         traceTc (text "Tc7")            `thenNF_Tc_`
442         zonkTopBinds all_binds          `thenNF_Tc` \ (all_binds', final_env)  ->
443         tcSetEnv final_env              $
444                 -- zonkTopBinds puts all the top-level Ids into the tcGEnv
445         traceTc (text "Tc8")            `thenNF_Tc_`
446         zonkForeignExports foe_decls    `thenNF_Tc` \ foe_decls' ->
447         traceTc (text "Tc9")            `thenNF_Tc_`
448         zonkRules more_local_rules      `thenNF_Tc` \ more_local_rules' ->
449         
450         
451         let     local_things = filter (isLocalThing this_mod) (typeEnvElts (getTcGEnv final_env))
452         
453                 local_type_env :: TypeEnv
454                 local_type_env = mkTypeEnv local_things
455                     
456                 all_local_rules = local_rules ++ more_local_rules'
457         in  
458         traceTc (text "Tc10")           `thenNF_Tc_`
459         returnTc (final_env,
460                   new_pcs,
461                   TcResults { tc_env     = local_type_env,
462                               tc_insts   = map iDFunId local_insts,
463                               tc_binds   = all_binds', 
464                               tc_fords   = foi_decls ++ foe_decls',
465                               tc_rules   = all_local_rules
466                             }
467         )
468     )                   `thenTc` \ (_, pcs, tc_result) ->
469     returnTc (pcs, tc_result)
470   where
471     tycl_decls   = [d | TyClD d <- decls]
472     val_binds    = foldr ThenBinds EmptyBinds [binds | ValD binds <- decls]
473     source_rules = [d | RuleD d <- decls, not (isIfaceRuleDecl d)]
474 \end{code}
475
476
477 %************************************************************************
478 %*                                                                      *
479 \subsection{Typechecking interface decls}
480 %*                                                                      *
481 %************************************************************************
482
483 \begin{code}
484 typecheckIface
485         :: DynFlags
486         -> PersistentCompilerState
487         -> HomeSymbolTable
488         -> ModIface             -- Iface for this module (just module & fixities)
489         -> [RenamedHsDecl]
490         -> IO (Maybe (PersistentCompilerState, ModDetails))
491                         -- The new PCS is Augmented with imported information,
492                         -- (but not stuff from this module).
493
494 typecheckIface dflags pcs hst mod_iface decls
495   = do  { maybe_tc_stuff <- typecheck dflags pcs hst alwaysQualify $
496                             tcIfaceImports pcs hst get_fixity this_mod decls
497         ; printIfaceDump dflags maybe_tc_stuff
498         ; return maybe_tc_stuff }
499   where
500     this_mod   = mi_module   mod_iface
501     fixity_env = mi_fixities mod_iface
502
503     get_fixity :: Name -> Maybe Fixity
504     get_fixity nm = lookupNameEnv fixity_env nm
505
506     tcIfaceImports pcs hst get_fixity this_mod decls
507         = fixTc (\ ~(unf_env, _, _, _, _) ->
508               tcImports unf_env pcs hst get_fixity this_mod decls
509           )     `thenTc` \ (env, new_pcs, local_inst_info, 
510                             deriv_binds, local_rules) ->
511           ASSERT(nullBinds deriv_binds)
512           let 
513               local_things = filter (isLocalThing this_mod) (typeEnvElts (getTcGEnv env))
514
515               mod_details = ModDetails { md_types = mkTypeEnv local_things,
516                                          md_insts = map iDFunId local_inst_info,
517                                          md_rules = [(id,rule) | IfaceRuleOut id rule <- local_rules],
518                                          md_binds = [] }
519                         -- All the rules from an interface are of the IfaceRuleOut form
520           in
521           returnTc (new_pcs, mod_details)
522
523 tcImports :: RecTcEnv
524           -> PersistentCompilerState
525           -> HomeSymbolTable
526           -> (Name -> Maybe Fixity)
527           -> Module
528           -> [RenamedHsDecl]
529           -> TcM (TcEnv, PersistentCompilerState, [InstInfo], 
530                          RenamedHsBinds, [TypecheckedRuleDecl])
531
532 -- tcImports is a slight mis-nomer.  
533 -- It deals with everything that could be an import:
534 --      type and class decls
535 --      interface signatures (checked lazily)
536 --      instance decls
537 --      rule decls
538 -- These can occur in source code too, of course
539
540 tcImports unf_env pcs hst get_fixity this_mod decls
541           -- (unf_env :: RecTcEnv) is used for type-checking interface pragmas
542           -- which is done lazily [ie failure just drops the pragma
543           -- without having any global-failure effect].
544           -- 
545           -- unf_env is also used to get the pragama info
546           -- for imported dfuns and default methods
547
548   = checkNoErrsTc $
549         -- tcImports recovers internally, but if anything gave rise to
550         -- an error we'd better stop now, to avoid a cascade
551         
552     traceTc (text "Tc1")                                `thenNF_Tc_`
553     tcTyAndClassDecls unf_env this_mod tycl_decls       `thenTc` \ env ->
554     tcSetEnv env                                        $
555     
556         -- Typecheck the instance decls, includes deriving
557     traceTc (text "Tc2")        `thenNF_Tc_`
558     tcInstDecls1 (pcs_insts pcs) (pcs_PRS pcs) 
559              hst unf_env get_fixity this_mod 
560              decls                      `thenTc` \ (new_pcs_insts, inst_env, local_insts, deriv_binds) ->
561     tcSetInstEnv inst_env                       $
562     
563     -- Interface type signatures
564     -- We tie a knot so that the Ids read out of interfaces are in scope
565     --   when we read their pragmas.
566     -- What we rely on is that pragmas are typechecked lazily; if
567     --   any type errors are found (ie there's an inconsistency)
568     --   we silently discard the pragma
569     traceTc (text "Tc3")                        `thenNF_Tc_`
570     tcInterfaceSigs unf_env this_mod tycl_decls `thenTc` \ sig_ids ->
571     tcExtendGlobalValEnv sig_ids                $
572     
573     
574     tcIfaceRules unf_env (pcs_rules pcs) this_mod iface_rules   `thenNF_Tc` \ (new_pcs_rules, local_rules) ->
575         -- When relinking this module from its interface-file decls
576         -- we'll have IfaceRules that are in fact local to this module
577         -- That's the reason we we get any local_rules out here
578     
579     tcGetEnv                                            `thenTc` \ unf_env ->
580     let
581         all_things = typeEnvElts (getTcGEnv unf_env)
582     
583          -- sometimes we're compiling in the context of a package module
584          -- (on the GHCi command line, for example).  In this case, we
585          -- want to treat everything we pulled in as an imported thing.
586         imported_things
587           = filter (not . isLocalThing this_mod) all_things
588         
589         new_pte :: PackageTypeEnv
590         new_pte = extendTypeEnvList (pcs_PTE pcs) imported_things
591         
592         new_pcs :: PersistentCompilerState
593         new_pcs = pcs { pcs_PTE   = new_pte,
594                         pcs_insts = new_pcs_insts,
595                         pcs_rules = new_pcs_rules
596                   }
597     in
598     returnTc (unf_env, new_pcs, local_insts, deriv_binds, local_rules)
599   where
600     tycl_decls  = [d | TyClD d <- decls]
601     iface_rules = [d | RuleD d <- decls, isIfaceRuleDecl d]
602 \end{code}    
603
604
605 %************************************************************************
606 %*                                                                      *
607 \subsection{Checking the type of main}
608 %*                                                                      *
609 %************************************************************************
610
611 We must check that in module Main,
612         a) main is defined
613         b) main :: forall a1...an. IO t,  for some type t
614
615 If we have
616         main = error "Urk"
617 then the type of main will be 
618         main :: forall a. a
619 and that should pass the test too.  
620
621 So we just instantiate the type and unify with IO t, and declare 
622 victory if doing so succeeds.
623
624 \begin{code}
625 tcCheckMain :: Module -> TcM ()
626 tcCheckMain this_mod
627   | not (moduleName this_mod == mAIN_Name )
628   = returnTc ()
629
630   | otherwise
631   =     -- First unify the main_id with IO t, for any old t
632     tcLookup_maybe mainName             `thenNF_Tc` \ maybe_thing ->
633     case maybe_thing of
634         Just (ATcId main_id) -> check_main_ty (idType main_id)
635         other                -> addErrTc noMainErr      
636   where
637     check_main_ty main_ty
638       = tcInstType main_ty              `thenNF_Tc` \ (tvs, theta, main_tau) ->
639         newTyVarTy liftedTypeKind       `thenNF_Tc` \ arg_ty ->
640         tcLookupTyCon ioTyConName       `thenNF_Tc` \ ioTyCon ->
641         tcAddErrCtxtM (mainTypeCtxt main_ty)    $
642         if not (null theta) then 
643                 failWithTc empty        -- Context has the error message
644         else
645         unifyTauTy main_tau (mkTyConApp ioTyCon [arg_ty])
646
647 mainTypeCtxt main_ty tidy_env 
648   = zonkTcType main_ty          `thenNF_Tc` \ main_ty' ->
649     returnNF_Tc (tidy_env, ptext SLIT("`main' has the illegal type") <+> 
650                                  quotes (ppr (tidyType tidy_env main_ty')))
651
652 noMainErr = hsep [ptext SLIT("Module") <+> quotes (ppr mAIN_Name), 
653                   ptext SLIT("must include a definition for") <+> quotes (ptext SLIT("main"))]
654 \end{code}
655
656
657 %************************************************************************
658 %*                                                                      *
659 \subsection{Interfacing the Tc monad to the IO monad}
660 %*                                                                      *
661 %************************************************************************
662
663 \begin{code}
664 typecheck :: DynFlags
665           -> PersistentCompilerState
666           -> HomeSymbolTable
667           -> PrintUnqualified   -- For error printing
668           -> TcM r
669           -> IO (Maybe r)
670
671 typecheck dflags pcs hst unqual thing_inside 
672  = do   { showPass dflags "Typechecker";
673         ; env <- initTcEnv hst (pcs_PTE pcs)
674
675         ; (maybe_tc_result, errs) <- initTc dflags env thing_inside
676
677         ; printErrorsAndWarnings unqual errs
678
679         ; if errorsFound errs then 
680              return Nothing 
681            else 
682              return maybe_tc_result
683         }
684 \end{code}
685
686
687 %************************************************************************
688 %*                                                                      *
689 \subsection{Dumping output}
690 %*                                                                      *
691 %************************************************************************
692
693 \begin{code}
694 printTcDump dflags unqual Nothing = return ()
695 printTcDump dflags unqual (Just (_, results))
696   = do if dopt Opt_D_dump_types dflags || dopt Opt_D_dump_tc dflags then
697           printForUser stdout unqual (dump_tc_iface dflags results)
698           else return ()
699
700        dumpIfSet_dyn dflags Opt_D_dump_tc    
701                      "Typechecked" (ppr (tc_binds results))
702
703           
704 printIfaceDump dflags Nothing = return ()
705 printIfaceDump dflags (Just (_, details))
706   = dumpIfSet_dyn_or dflags [Opt_D_dump_types, Opt_D_dump_tc]
707                      "Interface" (pprModDetails details)
708
709 dump_tc_iface dflags results
710   = vcat [pprModDetails (ModDetails {md_types = tc_env results, 
711                                      md_insts = tc_insts results,
712                                      md_rules = [], md_binds = []}) ,
713           ppr_rules (tc_rules results),
714
715           if dopt Opt_Generics dflags then
716                 ppr_gen_tycons (typeEnvTyCons (tc_env results))
717           else 
718                 empty
719     ]
720
721 ppr_rules [] = empty
722 ppr_rules rs = vcat [ptext SLIT("{-# RULES"),
723                       nest 4 (vcat (map ppr rs)),
724                       ptext SLIT("#-}")]
725
726 ppr_gen_tycons tcs = vcat [ptext SLIT("{-# Generic type constructor details"),
727                            vcat (map ppr_gen_tycon tcs),
728                            ptext SLIT("#-}")
729                      ]
730
731 -- x&y are now Id's, not CoreExpr's 
732 ppr_gen_tycon tycon 
733   | Just ep <- tyConGenInfo tycon
734   = (ppr tycon <> colon) $$ nest 4 (ppr_ep ep)
735
736   | otherwise = ppr tycon <> colon <+> ptext SLIT("Not derivable")
737
738 ppr_ep (EP from to)
739   = vcat [ ptext SLIT("Rep type:") <+> ppr (tcFunResultTy from_tau),
740            ptext SLIT("From:") <+> ppr (unfoldingTemplate (idUnfolding from)),
741            ptext SLIT("To:")   <+> ppr (unfoldingTemplate (idUnfolding to))
742     ]
743   where
744     (_,from_tau) = tcSplitForAllTys (idType from)
745 \end{code}