TcRnDriver.lhs 45.3 KB
Newer Older
1
%
2
3
4
5
6
7
8
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%
\section[TcModule]{Typechecking a whole module}

\begin{code}
module TcRnDriver (
#ifdef GHCI
9
	tcRnStmt, tcRnExpr, tcRnType,
10
	tcRnLookupRdrName,
11
12
	tcRnLookupName,
	tcRnGetInfo,
13
	getModuleExports, 
14
#endif
15
16
	tcRnModule, 
	tcTopSrcDecls,
17
	tcRnExtCore
18
19
20
21
    ) where

#include "HsVersions.h"

22
import IO
23
#ifdef GHCI
chak's avatar
chak committed
24
import {-# SOURCE #-} TcSplice ( tcSpliceDecls )
25
26
#endif

27
28
import DynFlags		( DynFlag(..), DynFlags(..), dopt, GhcMode(..) )
import StaticFlags	( opt_PprStyle_Debug )
29
import Packages		( checkForPackageConflicts, mkHomeModules )
30
import HsSyn		( HsModule(..), HsExtCore(..), HsGroup(..), LHsDecl,
31
			  SpliceDecl(..), HsBind(..), LHsBinds,
32
			  emptyRdrGroup, emptyRnGroup, appendGroups, plusHsValBinds,
33
			  nlHsApp, nlHsVar, pprLHsBinds )
34
import RdrHsSyn		( findSplice )
35

36
import PrelNames	( runMainIOName, rootMainKey, rOOT_MAIN, mAIN,
37
			  main_RDR_Unqual )
38
import RdrName		( RdrName, mkRdrUnqual, emptyGlobalRdrEnv )
39
40
import TcHsSyn		( zonkTopDecls )
import TcExpr 		( tcInferRho )
41
import TcRnMonad
42
import TcType		( tidyTopType, tcEqType, mkTyVarTys, substTyWith )
43
import Inst		( showLIE )
44
import InstEnv		( extendInstEnvList, Instance, pprInstances, instanceDFunId )
45
import TcBinds		( tcTopBinds, tcHsBootSigs )
46
import TcDefaults	( tcDefaults )
47
import TcEnv		( tcExtendGlobalValEnv, iDFunId )
48
49
import TcRules		( tcRules )
import TcForeign	( tcForeignImports, tcForeignExports )
50
import TcInstDcls	( tcInstDecls1, tcInstDecls2 )
51
import TcIface		( tcExtCoreBindings, tcHiBootIface )
52
import TcSimplify	( tcSimplifyTop )
53
import TcTyClsDecls	( tcTyAndClassDecls )
54
import LoadIface	( loadOrphanModules )
55
import RnNames		( importsFromLocalDecls, rnImports, rnExports,
56
			  reportUnusedNames, reportDeprecations )
57
58
import RnEnv		( lookupSrcOcc_maybe )
import RnSource		( rnSrcDecls, rnTyClDecls, checkModDeprec )
59
60
import PprCore		( pprRules, pprCoreBindings )
import CoreSyn		( CoreRule, bindersOfBinds )
61
import DataCon		( dataConWrapId )
62
import ErrUtils		( Messages, mkDumpDoc, showPass )
63
import Id		( Id, mkExportedLocalId, isLocalId, idName, idType )
64
import Var		( Var )
65
import Module           ( Module, ModuleEnv, mkModule, moduleEnvElts, elemModuleEnv )
66
67
68
import OccName		( mkVarOcc, mkOccFS, varName )
import Name		( Name, NamedThing(..), isExternalName, getSrcLoc, isWiredInName,
			  mkExternalName )
69
import NameSet
70
import TyCon		( tyConHasGenerics, isSynTyCon, getSynTyConDefn, tyConKind )
71
import SrcLoc		( srcLocSpan, Located(..), noLoc )
72
import DriverPhases	( HscSource(..), isHsBoot )
73
74
import HscTypes		( ModGuts(..), ModDetails(..), emptyModDetails,
			  HscEnv(..), ExternalPackageState(..),
75
			  IsBootInterface, noDependencies, 
76
			  Deprecs( NoDeprecs ), plusDeprecs,
77
			  ForeignStubs(NoStubs), TyThing(..), 
78
79
			  TypeEnv, lookupTypeEnv, hptInstances, 
			  extendTypeEnvWithIds, typeEnvIds, typeEnvTyCons, typeEnvElts,
80
			  emptyFixityEnv
81
			)
82
83
import Outputable

84
#ifdef GHCI
85
86
import HsSyn		( HsStmtContext(..), Stmt(..), HsExpr(..), 
			  HsLocalBinds(..), HsValBinds(..),
87
			  LStmt, LHsExpr, LHsType, mkMatchGroup, mkMatch, emptyLocalBinds,
88
			  collectLStmtsBinders, collectLStmtBinders, nlVarPat,
89
		   	  placeHolderType, noSyntaxExpr )
90
91
import RdrName		( GlobalRdrElt(..), globalRdrEnvElts,
			  unQualOK, lookupLocalRdrEnv, extendLocalRdrEnv )
92
import RnSource		( addTcgDUs )
93
import TcHsSyn		( mkHsDictLet, zonkTopLExpr, zonkTopBndrs )
94
import TcHsType		( kcHsType )
95
import TcMType		( zonkTcType, zonkQuantifiedTyVar )
96
import TcMatches	( tcStmts, tcDoStmt )
97
import TcSimplify	( tcSimplifyInteractive, tcSimplifyInfer )
98
import TcType		( Type, mkForAllTys, mkFunTys, mkTyConApp, tyVarsOfType, isTauTy,
99
			  isUnLiftedType, tyClsNamesOfDFunHead, tyClsNamesOfType, isUnitTy )
100
import TcEnv		( tcLookupTyCon, tcLookupId, tcLookupGlobal )
101
import RnTypes		( rnLHsType )
102
import Inst		( tcGetInstEnvs )
103
import InstEnv		( classInstances, instEnvElts )
104
import RnExpr		( rnStmts, rnLExpr )
105
import LoadIface	( loadSrcInterface, loadSysInterface )
106
107
import IfaceEnv		( ifaceExportNames )
import Module		( moduleSetElts, mkModuleSet )
108
import RnEnv		( lookupOccRn, dataTcOccs, lookupFixityRn )
109
import Id		( setIdType )
110
import MkId		( unsafeCoerceId )
111
import TyCon		( tyConName )
112
113
import TysWiredIn	( mkListTy, unitTy )
import IdInfo		( GlobalIdDetails(..) )
114
import Kind		( Kind )
115
import Var		( globaliseId )
116
117
import Name		( nameOccName, nameModule, isBuiltInSyntax )
import OccName		( isTcOcc )
118
import NameEnv		( delListFromNameEnv )
119
120
import PrelNames	( iNTERACTIVE, ioTyConName, printName, itName, 
			  bindIOName, thenIOName, returnIOName )
121
122
import HscTypes		( InteractiveContext(..),
			  ModIface(..), icPrintUnqual,
123
			  Dependencies(..) )
124
import BasicTypes	( Fixity, RecFlag(..) )
125
import SrcLoc		( unLoc )
126
127
#endif

128
import FastString	( mkFastString )
129
import Maybes		( MaybeErr(..) )
130
import Util		( sortLe )
131
import Bag		( unionBags, snocBag, emptyBag, unitBag, unionManyBags )
132
133

import Maybe		( isJust )
134
135
136
137
138
139
140
141
142
143
144
145
\end{code}



%************************************************************************
%*									*
	Typecheck and rename a module
%*									*
%************************************************************************


\begin{code}
146
tcRnModule :: HscEnv 
147
	   -> HscSource
148
	   -> Bool 		-- True <=> save renamed syntax
149
	   -> Located (HsModule RdrName)
150
	   -> IO (Messages, Maybe TcGblEnv)
151

152
153
154
tcRnModule hsc_env hsc_src save_rn_decls
	 (L loc (HsModule maybe_mod export_ies 
			  import_decls local_decls mod_deprec))
155
156
 = do { showPass (hsc_dflags hsc_env) "Renamer/typechecker" ;

157
   let { this_mod = case maybe_mod of
158
159
			Nothing  -> mAIN	  -- 'module M where' is omitted
			Just (L _ mod) -> mod }	; -- The normal case
160
		
161
   initTc hsc_env hsc_src this_mod $ 
162
   setSrcSpan loc $
163
164
   do {
		-- Deal with imports; sets tcg_rdr_env, tcg_imports
165
	(rdr_env, imports) <- rnImports import_decls ;
166

167
168
169
	let { dep_mods :: ModuleEnv (Module, IsBootInterface)
	    ; dep_mods = imp_dep_mods imports

170
171
172
173
174
175
176
177
		-- We want instance declarations from all home-package
		-- modules below this one, including boot modules, except
		-- ourselves.  The 'except ourselves' is so that we don't
		-- get the instances from this module's hs-boot file
	    ; want_instances :: Module -> Bool
	    ; want_instances mod = mod `elemModuleEnv` dep_mods
				   && mod /= this_mod
	    ; home_insts = hptInstances hsc_env want_instances
178
179
	    } ;

180
181
182
		-- Record boot-file info in the EPS, so that it's 
		-- visible to loadHiBootInterface in tcRnSrcDecls,
		-- and any other incrementally-performed imports
183
	updateEps_ (\eps -> eps { eps_is_boot = dep_mods }) ;
184

185
186
	checkConflicts imports this_mod $ do {

187
		-- Update the gbl env
188
189
190
	updGblEnv ( \ gbl -> 
		gbl { tcg_rdr_env  = rdr_env,
		      tcg_inst_env = extendInstEnvList (tcg_inst_env gbl) home_insts,
191
192
		      tcg_imports  = tcg_imports gbl `plusImportAvails` imports,
		      tcg_rn_decls = if save_rn_decls then
193
					Just emptyRnGroup
194
195
				     else
					Nothing })
196
197
		$ do {

198
	traceRn (text "rn1" <+> ppr (imp_dep_mods imports)) ;
199
200
201
202
203
		-- Fail if there are any errors so far
		-- The error printing (if needed) takes advantage 
		-- of the tcg_env we have now set
	failIfErrsM ;

204
205
206
207
		-- Load any orphan-module interfaces, so that
		-- their rules and instance decls will be found
	loadOrphanModules (imp_orphs imports) ;

208
209
	traceRn (text "rn1a") ;
		-- Rename and type check the declarations
210
211
212
213
	tcg_env <- if isHsBoot hsc_src then
			tcRnHsBootDecls local_decls
		   else	
			tcRnSrcDecls local_decls ;
214
215
216
217
	setGblEnv tcg_env		$ do {

	traceRn (text "rn3") ;

218
219
220
221
222
223
224
		-- Report the use of any deprecated things
		-- We do this before processsing the export list so
		-- that we don't bleat about re-exporting a deprecated
		-- thing (especially via 'module Foo' export item)
		-- Only uses in the body of the module are complained about
	reportDeprecations tcg_env ;

225
		-- Process the export list
226
	exports <- rnExports (isJust maybe_mod) export_ies ;
227

228
229
230
231
232
		-- Check whether the entire module is deprecated
		-- This happens only once per module
	let { mod_deprecs = checkModDeprec mod_deprec } ;

		-- Add exports and deprecations to envt
233
234
	let { final_env  = tcg_env { tcg_exports = exports,
				     tcg_dus = tcg_dus tcg_env `plusDU` usesOnly exports,
235
236
237
238
				     tcg_deprecs = tcg_deprecs tcg_env `plusDeprecs` 
						   mod_deprecs }
		-- A module deprecation over-rides the earlier ones
	     } ;
239
240

		-- Report unused names
241
 	reportUnusedNames export_ies final_env ;
242
243

		-- Dump output and return
244
245
	tcDump final_env ;
	return final_env
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
    }}}}}


-- The program is not allowed to contain two modules with the same
-- name, and we check for that here.  It could happen if the home package
-- contains a module that is also present in an external package, for example.
checkConflicts imports this_mod and_then = do
   dflags <- getDOpts
   let 
	dep_mods = this_mod : map fst (moduleEnvElts (imp_dep_mods imports))
		-- don't forget to include the current module!

	mb_dep_pkgs = checkForPackageConflicts 
				dflags dep_mods (imp_dep_pkgs imports)
   --
   case mb_dep_pkgs of
     Failed msg -> 
	do addErr msg; failM
     Succeeded _ -> 
	updGblEnv (\gbl -> gbl{ tcg_home_mods = mkHomeModules dep_mods })
	   and_then
267
268
269
270
271
\end{code}


%************************************************************************
%*									*
272
	Type-checking external-core modules
273
274
275
276
%*									*
%************************************************************************

\begin{code}
277
278
279
280
tcRnExtCore :: HscEnv 
	    -> HsExtCore RdrName
	    -> IO (Messages, Maybe ModGuts)
	-- Nothing => some error occurred 
281

282
283
284
tcRnExtCore hsc_env (HsExtCore this_mod decls src_binds)
	-- The decls are IfaceDecls; all names are original names
 = do { showPass (hsc_dflags hsc_env) "Renamer/typechecker" ;
285

286
   initTc hsc_env ExtCoreFile this_mod $ do {
287

288
   let { ldecls  = map noLoc decls } ;
289

290
291
	-- Deal with the type declarations; first bring their stuff
	-- into scope, then rname them, then type check them
292
   tcg_env  <- importsFromLocalDecls (mkFakeGroup ldecls) ;
293

294
   setGblEnv tcg_env $ do {
295

296
297
   rn_decls <- rnTyClDecls ldecls ;
   failIfErrsM ;
298

299
300
	-- Dump trace of renaming part
   rnDump (ppr rn_decls) ;
301

302
303
	-- Typecheck them all together so that
	-- any mutually recursive types are done right
304
   tcg_env <- checkNoErrs (tcTyAndClassDecls emptyModDetails rn_decls) ;
305
	-- Make the new type env available to stuff slurped from interface files
306

307
308
309
   setGblEnv tcg_env $ do {
   
	-- Now the core bindings
310
   core_binds <- initIfaceExtCore (tcExtCoreBindings src_binds) ;
311

312
313
314
315
316
	-- Wrap up
   let {
	bndrs 	   = bindersOfBinds core_binds ;
	my_exports = mkNameSet (map idName bndrs) ;
		-- ToDo: export the data types also?
317

318
	final_type_env = extendTypeEnvWithIds (tcg_type_env tcg_env) bndrs ;
319

320
	mod_guts = ModGuts {	mg_module   = this_mod,
321
				mg_boot	    = False,
322
323
324
				mg_usages   = [],		-- ToDo: compute usage
				mg_dir_imps = [],		-- ??
				mg_deps     = noDependencies,	-- ??
325
				mg_home_mods = mkHomeModules [], -- ?? wrong!!
326
327
328
329
330
				mg_exports  = my_exports,
				mg_types    = final_type_env,
				mg_insts    = tcg_insts tcg_env,
				mg_rules    = [],
				mg_binds    = core_binds,
331

332
333
334
335
336
337
				-- Stubs
				mg_rdr_env  = emptyGlobalRdrEnv,
				mg_fix_env  = emptyFixityEnv,
				mg_deprecs  = NoDeprecs,
				mg_foreign  = NoStubs
		    } } ;
338

339
   tcCoreDump mod_guts ;
340

341
342
   return mod_guts
   }}}}
343

344
mkFakeGroup decls -- Rather clumsy; lots of unused fields
345
  = emptyRdrGroup { hs_tyclds = decls }
346
\end{code}
347
348


349
350
351
352
353
%************************************************************************
%*									*
	Type-checking the top level of a module
%*									*
%************************************************************************
354

355
356
357
358
359
\begin{code}
tcRnSrcDecls :: [LHsDecl RdrName] -> TcM TcGblEnv
	-- Returns the variables free in the decls
	-- Reason: solely to report unused imports and bindings
tcRnSrcDecls decls
360
361
362
363
 = do { 	-- Load the hi-boot interface for this module, if any
		-- We do this now so that the boot_names can be passed
		-- to tcTyAndClassDecls, because the boot_names are 
		-- automatically considered to be loop breakers
364
365
	mod <- getModule ;
	boot_iface <- tcHiBootIface mod ;
366
367

	  	-- Do all the declarations
368
	(tc_envs, lie) <- getLIE (tc_rn_src_decls boot_iface decls) ;
369

370
371
372
373
374
375
376
377
378
379
380
	     -- tcSimplifyTop deals with constant or ambiguous InstIds.  
	     -- How could there be ambiguous ones?  They can only arise if a
	     -- top-level decl falls under the monomorphism
	     -- restriction, and no subsequent decl instantiates its
	     -- type.  (Usually, ambiguous type variables are resolved
	     -- during the generalisation step.)
        traceTc (text "Tc8") ;
	inst_binds <- setEnvs tc_envs (tcSimplifyTop lie) ;
		-- Setting the global env exposes the instances to tcSimplifyTop
		-- Setting the local env exposes the local Ids to tcSimplifyTop, 
		-- so that we get better error messages (monomorphism restriction)
381

382
383
384
385
386
387
	    -- Backsubstitution.  This must be done last.
	    -- Even tcSimplifyTop may do some unification.
        traceTc (text "Tc9") ;
	let { (tcg_env, _) = tc_envs ;
	      TcGblEnv { tcg_type_env = type_env, tcg_binds = binds, 
		         tcg_rules = rules, tcg_fords = fords } = tcg_env } ;
388

389
390
	(bind_ids, binds', fords', rules') <- zonkTopDecls (binds `unionBags` inst_binds)
							   rules fords ;
391

392
393
	let { final_type_env = extendTypeEnvWithIds type_env bind_ids
	    ; tcg_env' = tcg_env { tcg_type_env = final_type_env,
394
395
			 	   tcg_binds = binds',
				   tcg_rules = rules', 
396
				   tcg_fords = fords' } } ;
397

398
399
	-- Make the new type env available to stuff slurped from interface files
	writeMutVar (tcg_type_env_var tcg_env) final_type_env ;
400

401
402
403
404
	-- Compare the hi-boot iface (if any) with the real thing
 	dfun_binds <- checkHiBootIface tcg_env' boot_iface ;

	return (tcg_env' { tcg_binds = tcg_binds tcg_env' `unionBags` dfun_binds }) 
405
   }
406

407
tc_rn_src_decls :: ModDetails -> [LHsDecl RdrName] -> TcM (TcGblEnv, TcLclEnv)
408
409
-- Loops around dealing with each top level inter-splice group 
-- in turn, until it's dealt with the entire module
410
tc_rn_src_decls boot_details ds
411
412
 = do { let { (first_group, group_tail) = findSplice ds } ;
		-- If ds is [] we get ([], Nothing)
413

414
	-- Type check the decls up to, but not including, the first splice
415
	tc_envs@(tcg_env,tcl_env) <- tcRnGroup boot_details first_group ;
416

417
418
419
420
	-- Bale out if errors; for example, error recovery when checking
	-- the RHS of 'main' can mean that 'main' is not in the envt for 
	-- the subsequent checkMain test
	failIfErrsM ;
421

422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
	setEnvs tc_envs $

	-- If there is no splice, we're nearly done
	case group_tail of {
	   Nothing -> do { 	-- Last thing: check for `main'
			   tcg_env <- checkMain ;
			   return (tcg_env, tcl_env) 
		      } ;

	-- If there's a splice, we must carry on
	   Just (SpliceDecl splice_expr, rest_ds) -> do {
#ifndef GHCI
	failWithTc (text "Can't do a top-level splice; need a bootstrapped compiler")
#else

	-- Rename the splice expression, and get its supporting decls
	(rn_splice_expr, splice_fvs) <- rnLExpr splice_expr ;
	failIfErrsM ;	-- Don't typecheck if renaming failed

	-- Execute the splice
	spliced_decls <- tcSpliceDecls rn_splice_expr ;

	-- Glue them on the front of the remaining decls and loop
	setGblEnv (tcg_env `addTcgDUs` usesOnly splice_fvs) $
446
	tc_rn_src_decls boot_details (spliced_decls ++ rest_ds)
447
448
#endif /* GHCI */
    }}}
449
450
\end{code}

451
452
%************************************************************************
%*									*
453
454
	Compiling hs-boot source files, and
	comparing the hi-boot interface with the real thing
455
456
457
%*									*
%************************************************************************

458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
\begin{code}
tcRnHsBootDecls :: [LHsDecl RdrName] -> TcM TcGblEnv
tcRnHsBootDecls decls
   = do { let { (first_group, group_tail) = findSplice decls }

	; case group_tail of
	     Just stuff -> spliceInHsBootErr stuff
	     Nothing    -> return ()

		-- Rename the declarations
	; (tcg_env, rn_group) <- rnTopSrcDecls first_group
	; setGblEnv tcg_env $ do {

	-- Todo: check no foreign decls, no rules, no default decls

		-- Typecheck type/class decls
	; traceTc (text "Tc2")
	; let tycl_decls = hs_tyclds rn_group
476
	; tcg_env <- checkNoErrs (tcTyAndClassDecls emptyModDetails tycl_decls)
477
478
479
480
481
482
483
484
485
	; setGblEnv tcg_env	$ do {

		-- Typecheck instance decls
	; traceTc (text "Tc3")
	; (tcg_env, inst_infos, _binds) <- tcInstDecls1 tycl_decls (hs_instds rn_group)
	; setGblEnv tcg_env	$ do {

		-- Typecheck value declarations
	; traceTc (text "Tc5") 
486
	; val_ids <- tcHsBootSigs (hs_valds rn_group)
487
488
489
490
491
492

		-- Wrap up
		-- No simplification or zonking to do
	; traceTc (text "Tc7a")
	; gbl_env <- getGblEnv 
	
493
494
495
496
497
498
499
500
		-- Make the final type-env
		-- Include the dfun_ids so that their type sigs get
		-- are written into the interface file
	; let { type_env0 = tcg_type_env gbl_env
	      ; type_env1 = extendTypeEnvWithIds type_env0 val_ids
	      ; type_env2 = extendTypeEnvWithIds type_env1 dfun_ids 
	      ; dfun_ids = map iDFunId inst_infos }
	; return (gbl_env { tcg_type_env = type_env2 }) 
501
502
503
504
505
506
   }}}}

spliceInHsBootErr (SpliceDecl (L loc _), _)
  = addErrAt loc (ptext SLIT("Splices are not allowed in hs-boot files"))
\end{code}

507
508
Once we've typechecked the body of the module, we want to compare what
we've found (gathered in a TypeEnv) with the hi-boot details (if any).
509
510

\begin{code}
511
checkHiBootIface :: TcGblEnv -> ModDetails -> TcM (LHsBinds Id)
512
513
-- Compare the hi-boot file for this module (if there is one)
-- with the type environment we've just come up with
514
515
-- In the common case where there is no hi-boot file, the list
-- of boot_names is empty.
516
517
518
519
--
-- The bindings we return give bindings for the dfuns defined in the
-- hs-boot file, such as 	$fbEqT = $fEqT

520
521
522
checkHiBootIface
	(TcGblEnv { tcg_insts = local_insts, tcg_type_env = local_type_env })
	(ModDetails { md_insts = boot_insts, md_types = boot_type_env })
523
524
525
  = do	{ mapM_ check_one (typeEnvElts boot_type_env)
	; dfun_binds <- mapM check_inst boot_insts
	; return (unionManyBags dfun_binds) }
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
  where
    check_one boot_thing
      | no_check name
      = return ()	
      | otherwise	
      = case lookupTypeEnv local_type_env name of
	  Nothing 	  -> addErrTc (missingBootThing boot_thing)
	  Just real_thing -> check_thing boot_thing real_thing
      where
	name = getName boot_thing

    no_check name = isWiredInName name	-- No checking for wired-in names.  In particular,
					-- 'error' is handled by a rather gross hack
					-- (see comments in GHC.Err.hs-boot)
		  || name `elem` dfun_names
    dfun_names = map getName boot_insts

543
544
545
546
547
    check_inst boot_inst
	= case [dfun | inst <- local_insts, 
		       let dfun = instanceDFunId inst,
		       idType dfun `tcEqType` boot_inst_ty ] of
	    [] -> do { addErrTc (instMisMatch boot_inst); return emptyBag }
548
	    (dfun:_) -> return (unitBag $ noLoc $ VarBind local_boot_dfun (nlHsVar dfun))
549
550
551
	where
	  boot_dfun = instanceDFunId boot_inst
	  boot_inst_ty = idType boot_dfun
552
	  local_boot_dfun = mkExportedLocalId (idName boot_dfun) boot_inst_ty
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569

----------------
check_thing (ATyCon boot_tc) (ATyCon real_tc)
  | isSynTyCon boot_tc && isSynTyCon real_tc,
    defn1 `tcEqType` substTyWith tvs2 (mkTyVarTys tvs1) defn2
  = return ()

  | tyConKind boot_tc == tyConKind real_tc
  = return ()
  where
    (tvs1, defn1) = getSynTyConDefn boot_tc
    (tvs2, defn2) = getSynTyConDefn boot_tc

check_thing (AnId boot_id) (AnId real_id)
  | idType boot_id `tcEqType` idType real_id
  = return ()

570
571
572
573
574
575
check_thing (ADataCon dc1) (ADataCon dc2)
  | idType (dataConWrapId dc1) `tcEqType` idType (dataConWrapId dc2)
  = return ()

	-- Can't declare a class in a hi-boot file

576
577
578
579
580
581
check_thing boot_thing real_thing	-- Default case; failure
  = addErrAt (srcLocSpan (getSrcLoc real_thing))
	     (bootMisMatch real_thing)

----------------
missingBootThing thing
582
  = ppr thing <+> ptext SLIT("is defined in the hs-boot file, but not in the module")
583
bootMisMatch thing
584
  = ppr thing <+> ptext SLIT("has conflicting definitions in the module and its hs-boot file")
585
instMisMatch inst
586
  = hang (ppr inst)
587
       2 (ptext SLIT("is defined in the hs-boot file, but not in the module"))
588
589
\end{code}

590

591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
%************************************************************************
%*									*
	Type-checking the top level of a module
%*									*
%************************************************************************

tcRnGroup takes a bunch of top-level source-code declarations, and
 * renames them
 * gets supporting declarations from interface files
 * typechecks them
 * zonks them
 * and augments the TcGblEnv with the results

In Template Haskell it may be called repeatedly for each group of
declarations.  It expects there to be an incoming TcGblEnv in the
monad; it augments it and returns the new TcGblEnv.
607
608

\begin{code}
609
tcRnGroup :: ModDetails -> HsGroup RdrName -> TcM (TcGblEnv, TcLclEnv)
610
	-- Returns the variables free in the decls, for unused-binding reporting
611
tcRnGroup boot_details decls
612
613
614
 = do {		-- Rename the declarations
	(tcg_env, rn_decls) <- rnTopSrcDecls decls ;
	setGblEnv tcg_env $ do {
615

616
		-- Typecheck the declarations
617
	tcTopSrcDecls boot_details rn_decls 
618
  }}
619

620
621
622
623
------------------------------------------------
rnTopSrcDecls :: HsGroup RdrName -> TcM (TcGblEnv, HsGroup Name)
rnTopSrcDecls group
 = do { 	-- Bring top level binders into scope
624
625
	tcg_env <- importsFromLocalDecls group ;
	setGblEnv tcg_env $ do {
626

627
	failIfErrsM ;	-- No point in continuing if (say) we have duplicate declarations
628

629
630
631
		-- Rename the source decls
	(tcg_env, rn_decls) <- rnSrcDecls group ;
	failIfErrsM ;
632

633
634
635
636
637
638
639
		-- save the renamed syntax, if we want it
	let { tcg_env'
	        | Just grp <- tcg_rn_decls tcg_env
	          = tcg_env{ tcg_rn_decls = Just (appendGroups grp rn_decls) }
	        | otherwise
	           = tcg_env };

640
641
		-- Dump trace of renaming part
	rnDump (ppr rn_decls) ;
642

643
	return (tcg_env', rn_decls)
644
   }}
645

646
------------------------------------------------
647
648
tcTopSrcDecls :: ModDetails -> HsGroup Name -> TcM (TcGblEnv, TcLclEnv)
tcTopSrcDecls boot_details
649
650
651
652
653
654
655
656
657
	(HsGroup { hs_tyclds = tycl_decls, 
		   hs_instds = inst_decls,
		   hs_fords  = foreign_decls,
		   hs_defds  = default_decls,
		   hs_ruleds = rule_decls,
		   hs_valds  = val_binds })
 = do {		-- Type-check the type and class decls, and all imported decls
		-- The latter come in via tycl_decls
        traceTc (text "Tc2") ;
658

659
	tcg_env <- checkNoErrs (tcTyAndClassDecls boot_details tycl_decls) ;
660
661
662
663
664
	-- tcTyAndClassDecls recovers internally, but if anything gave rise to
	-- an error we'd better stop now, to avoid a cascade
	
	-- Make these type and class decls available to stuff slurped from interface files
	writeMutVar (tcg_type_env_var tcg_env) (tcg_type_env tcg_env) ;
665
666


667
668
669
670
671
672
	setGblEnv tcg_env	$ do {
		-- Source-language instances, including derivings,
		-- and import the supporting declarations
        traceTc (text "Tc3") ;
	(tcg_env, inst_infos, deriv_binds) <- tcInstDecls1 tycl_decls inst_decls ;
	setGblEnv tcg_env	$ do {
673

674
675
676
677
678
	        -- Foreign import declarations next.  No zonking necessary
		-- here; we can tuck them straight into the global environment.
        traceTc (text "Tc4") ;
	(fi_ids, fi_decls) <- tcForeignImports foreign_decls ;
	tcExtendGlobalValEnv fi_ids	$ do {
679

680
681
682
683
		-- Default declarations
        traceTc (text "Tc4a") ;
	default_tys <- tcDefaults default_decls ;
	updGblEnv (\gbl -> gbl { tcg_default = default_tys }) $ do {
684
	
685
686
687
688
		-- Value declarations next
		-- We also typecheck any extra binds that came out 
		-- of the "deriving" process (deriv_binds)
        traceTc (text "Tc5") ;
689
	(tc_val_binds, tcl_env) <- tcTopBinds (val_binds `plusHsValBinds` deriv_binds) ;
690
	setLclTypeEnv tcl_env 	$ do {
691

692
693
	     	-- Second pass over class and instance declarations, 
        traceTc (text "Tc6") ;
694
	(inst_binds, tcl_env) <- tcInstDecls2 tycl_decls inst_infos ;
695
	showLIE (text "after instDecls2") ;
696

697
698
699
700
		-- Foreign exports
		-- They need to be zonked, so we return them
        traceTc (text "Tc7") ;
	(foe_binds, foe_decls) <- tcForeignExports foreign_decls ;
701

702
703
		-- Rules
	rules <- tcRules rule_decls ;
704

705
706
707
708
709
710
711
712
713
714
715
716
		-- Wrap up
        traceTc (text "Tc7a") ;
	tcg_env <- getGblEnv ;
	let { all_binds = tc_val_binds	 `unionBags`
			  inst_binds	 `unionBags`
			  foe_binds  ;

		-- Extend the GblEnv with the (as yet un-zonked) 
		-- bindings, rules, foreign decls
	      tcg_env' = tcg_env {  tcg_binds = tcg_binds tcg_env `unionBags` all_binds,
				    tcg_rules = tcg_rules tcg_env ++ rules,
				    tcg_fords = tcg_fords tcg_env ++ foe_decls ++ fi_decls } } ;
717
  	return (tcg_env', tcl_env)
718
    }}}}}}
719
720
\end{code}

721

722
723
%************************************************************************
%*									*
724
	Checking for 'main'
725
726
727
728
%*									*
%************************************************************************

\begin{code}
729
730
checkMain :: TcM TcGblEnv
-- If we are in module Main, check that 'main' is defined.
731
732
733
checkMain 
  = do { ghci_mode <- getGhciMode ;
	 tcg_env   <- getGblEnv ;
734
735
	 dflags    <- getDOpts ;
	 let { main_mod = case mainModIs dflags of {
736
737
				Just mod -> mkModule mod ;
				Nothing  -> mAIN } ;
738
	       main_fn  = case mainFunIs dflags of {
739
740
741
742
743
				Just fn -> mkRdrUnqual (mkVarOcc (mkFastString fn)) ;
				Nothing -> main_RDR_Unqual } } ;
	
	 check_main ghci_mode tcg_env main_mod main_fn
    }
744

745

746
check_main ghci_mode tcg_env main_mod main_fn
747
 | mod /= main_mod
748
749
 = traceTc (text "checkMain not" <+> ppr main_mod <+> ppr mod) >>
   return tcg_env
750

751
752
753
754
755
756
 | otherwise
 = addErrCtxt mainCtxt			$
   do	{ mb_main <- lookupSrcOcc_maybe main_fn
		-- Check that 'main' is in scope
		-- It might be imported from another module!
	; case mb_main of {
757
758
	     Nothing -> do { traceTc (text "checkMain fail" <+> ppr main_mod <+> ppr main_fn)
			   ; complain_no_main	
759
760
			   ; return tcg_env } ;
	     Just main_name -> do
761
762
	{ traceTc (text "checkMain found" <+> ppr main_mod <+> ppr main_fn)
	; let { rhs = nlHsApp (nlHsVar runMainIOName) (nlHsVar main_name) }
763
		   	-- :Main.main :: IO () = runMainIO main 
764

765
	; (main_expr, ty) <- setSrcSpan (srcLocSpan (getSrcLoc main_name)) $
766
			     tcInferRho rhs
767

768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
	-- The function that the RTS invokes is always :Main.main,
	-- which we call root_main_id.  
	-- (Because GHC allows the user to have a module not called 
	-- Main as the main module, we can't rely on the main function
	-- being called "Main.main".  That's why root_main_id has a fixed
	-- module ":Main".)
	-- We also make root_main_id an implicit Id, by making main_name
	-- its parent (hence (Just main_name)).  That has the effect
	-- of preventing its type and unfolding from getting out into
	-- the interface file. Otherwise we can end up with two defns
	-- for 'main' in the interface file!

	; let { root_main_name =  mkExternalName rootMainKey rOOT_MAIN 
				   (mkOccFS varName FSLIT("main")) 
				   (Just main_name) (getSrcLoc main_name)
	      ; root_main_id = mkExportedLocalId root_main_name ty
	      ; main_bind    = noLoc (VarBind root_main_id main_expr) }
785

786
787
788
789
	; return (tcg_env { tcg_binds = tcg_binds tcg_env 
					`snocBag` main_bind,
			    tcg_dus   = tcg_dus tcg_env
				        `plusDU` usesOnly (unitFV main_name)
790
791
			-- Record the use of 'main', so that we don't 
			-- complain about it being defined but not used
792
793
794
		 }) 
    }}}
  where
795
    mod = tcg_mod tcg_env
796
797
798
799
800
801
 
    complain_no_main | ghci_mode == Interactive = return ()
		     | otherwise 		= failWithTc noMainMsg
	-- In interactive mode, don't worry about the absence of 'main'
	-- In other modes, fail altogether, so that we don't go on
	-- and complain a second time when processing the export list.
802

803
804
805
806
    mainCtxt  = ptext SLIT("When checking the type of the main function") <+> quotes (ppr main_fn)
    noMainMsg = ptext SLIT("The main function") <+> quotes (ppr main_fn) 
		<+> ptext SLIT("is not defined in module") <+> quotes (ppr main_mod)
\end{code}
807

808
809
810
811
812
%*********************************************************
%*						 	 *
		GHCi stuff
%*							 *
%*********************************************************
813

814
815
\begin{code}
#ifdef GHCI
816
817
818
setInteractiveContext :: HscEnv -> InteractiveContext -> TcRn a -> TcRn a
setInteractiveContext hsc_env icxt thing_inside 
  = let 
819
820
821
822
	-- Initialise the tcg_inst_env with instances 
	-- from all home modules.  This mimics the more selective
	-- call to hptInstances in tcRnModule
	dfuns = hptInstances hsc_env (\mod -> True)
823
824
825
826
827
828
829
830
831
832
    in
    updGblEnv (\env -> env { 
	tcg_rdr_env  = ic_rn_gbl_env icxt,
	tcg_type_env = ic_type_env   icxt,
	tcg_inst_env = extendInstEnvList (tcg_inst_env env) dfuns }) $

    updLclEnv (\env -> env { tcl_rdr = ic_rn_local_env icxt })	$

    do	{ traceTc (text "setIC" <+> ppr (ic_type_env icxt))
 	; thing_inside }
833
\end{code}
834

835

836
837
838
839
840
841
842
843
844
845
\begin{code}
tcRnStmt :: HscEnv
	 -> InteractiveContext
	 -> LStmt RdrName
	 -> IO (Maybe (InteractiveContext, [Name], LHsExpr Id))
		-- The returned [Name] is the same as the input except for
		-- ExprStmt, in which case the returned [Name] is [itName]
		--
		-- The returned TypecheckedHsExpr is of type IO [ () ],
		-- a list of the bound values, coerced to ().
846

847
848
tcRnStmt hsc_env ictxt rdr_stmt
  = initTcPrintErrors hsc_env iNTERACTIVE $ 
849
    setInteractiveContext hsc_env ictxt $ do {
850

851
    -- Rename; use CmdLineMode because tcRnStmt is only used interactively
852
    (([rn_stmt], _), fvs) <- rnStmts DoExpr [rdr_stmt] (return ((), emptyFVs)) ;
853
854
855
856
    traceRn (text "tcRnStmt" <+> vcat [ppr rdr_stmt, ppr rn_stmt, ppr fvs]) ;
    failIfErrsM ;
    
    -- The real work is done here
857
858
859
    (bound_ids, tc_expr) <- mkPlan rn_stmt ;
    zonked_expr <- zonkTopLExpr tc_expr ;
    zonked_ids  <- zonkTopBndrs bound_ids ;
860
    
861
862
863
864
	-- None of the Ids should be of unboxed type, because we
	-- cast them all to HValues in the end!
    mappM bad_unboxed (filter (isUnLiftedType . idType) zonked_ids) ;

865
    traceTc (text "tcs 1") ;
866
867
868
869
870
871
872
873
874
    let {	-- (a) Make all the bound ids "global" ids, now that
    		--     they're notionally top-level bindings.  This is
	    	--     important: otherwise when we come to compile an expression
	    	--     using these ids later, the byte code generator will consider
	    	--     the occurrences to be free rather than global.
		-- 
		-- (b) Tidy their types; this is important, because :info may
		--     ask to look at them, and :info expects the things it looks
		--     up to have tidy types
875
	global_ids = map globaliseAndTidy zonked_ids ;
876
877
878
879
    
		-- Update the interactive context
	rn_env   = ic_rn_local_env ictxt ;
	type_env = ic_type_env ictxt ;
880

881
882
	bound_names = map idName global_ids ;
	new_rn_env  = extendLocalRdrEnv rn_env bound_names ;
883

884
885
886
887
888
889
		-- Remove any shadowed bindings from the type_env;
		-- they are inaccessible but might, I suppose, cause 
		-- a space leak if we leave them there
	shadowed = [ n | name <- bound_names,
			 let rdr_name = mkRdrUnqual (nameOccName name),
			 Just n <- [lookupLocalRdrEnv rn_env rdr_name] ] ;
890

891
892
	filtered_type_env = delListFromNameEnv type_env shadowed ;
	new_type_env = extendTypeEnvWithIds filtered_type_env global_ids ;
893

894
895
896
	new_ic = ictxt { ic_rn_local_env = new_rn_env, 
		  	 ic_type_env     = new_type_env }
    } ;
897

898
899
    dumpOptTcRn Opt_D_dump_tc 
    	(vcat [text "Bound Ids" <+> pprWithCommas ppr global_ids,
900
    	       text "Typechecked expr" <+> ppr zonked_expr]) ;
901

902
    returnM (new_ic, bound_names, zonked_expr)
903
    }
904
905
906
  where
    bad_unboxed id = addErr (sep [ptext SLIT("GHCi can't bind a variable of unlifted type:"),
				  nest 2 (ppr id <+> dcolon <+> ppr (idType id))])
907

908
909
910
911
912
913
914
globaliseAndTidy :: Id -> Id
globaliseAndTidy id
-- Give the Id a Global Name, and tidy its type
  = setIdType (globaliseId VanillaGlobal id) tidy_type
  where
    tidy_type = tidyTopType (idType id)
\end{code}
915

916
Here is the grand plan, implemented in tcUserStmt
917

918
919
920
921
	What you type			The IO [HValue] that hscStmt returns
	-------------			------------------------------------
	let pat = expr		==> 	let pat = expr in return [coerce HVal x, coerce HVal y, ...]
					bindings: [x,y,...]
922

923
924
	pat <- expr		==> 	expr >>= \ pat -> return [coerce HVal x, coerce HVal y, ...]
					bindings: [x,y,...]
925

926
927
928
929
930
	expr (of IO type)	==>	expr >>= \ it -> return [coerce HVal it]
	  [NB: result not printed]	bindings: [it]
	  
	expr (of non-IO type,	==>	let it = expr in print it >> return [coerce HVal it]
	  result showable)		bindings: [it]
931

932
933
	expr (of non-IO type, 
	  result not showable)	==>	error
934

935

936
937
\begin{code}
---------------------------
938
939
940
941
942
943
944
945
946
947
948
949
type PlanResult = ([Id], LHsExpr Id)
type Plan = TcM PlanResult

runPlans :: [Plan] -> TcM PlanResult
-- Try the plans in order.  If one fails (by raising an exn), try the next.
-- If one succeeds, take it.
runPlans []     = panic "runPlans"
runPlans [p]    = p
runPlans (p:ps) = tryTcLIE_ (runPlans ps) p

--------------------
mkPlan :: LStmt Name -> TcM PlanResult
950
951
mkPlan (L loc (ExprStmt expr _ _))	-- An expression typed at the prompt 
  = do	{ uniq <- newUnique		-- is treated very specially
952
	; let fresh_it  = itName uniq
953
954
	      the_bind  = L loc $ FunBind (L loc fresh_it) False matches emptyNameSet
	      matches   = mkMatchGroup [mkMatch [] expr emptyLocalBinds]
955
	      let_stmt  = L loc $ LetStmt (HsValBinds (ValBindsOut [(NonRecursive,unitBag the_bind)] []))
956
957
958
959
960
961
962
963
964
	      bind_stmt = L loc $ BindStmt (nlVarPat fresh_it) expr
					   (HsVar bindIOName) noSyntaxExpr 
	      print_it  = L loc $ ExprStmt (nlHsApp (nlHsVar printName) (nlHsVar fresh_it))
			          	   (HsVar thenIOName) placeHolderType

	-- The plans are:
	--	[it <- e; print it]	but not if it::()
	--	[it <- e]		
	--	[let it = e; print it]	
965
966
	; runPlans [	-- Plan A
		    do { stuff@([it_id], _) <- tcGhciStmts [bind_stmt, print_it]
967
968
969
		       ; it_ty <- zonkTcType (idType it_id)
		       ; ifM (isUnitTy it_ty) failM
		       ; return stuff },
970
971
972
973
974
975
976
977

			-- Plan B; a naked bind statment
		    tcGhciStmts [bind_stmt],	

			-- Plan C; check that the let-binding is typeable all by itself.
			-- If not, fail; if so, try to print it.
			-- The two-step process avoids getting two errors: one from
			-- the expression itself, and one from the 'print it' part
978
979
980
981
			-- This two-step story is very clunky, alas
		    do { checkNoErrs (tcGhciStmts [let_stmt]) 
				--- checkNoErrs defeats the error recovery of let-bindings
		       ; tcGhciStmts [let_stmt, print_it] }
982
983
	  ]}

984
985
mkPlan stmt@(L loc (BindStmt {}))
  | [L _ v] <- collectLStmtBinders stmt		-- One binder, for a bind stmt 
986
987
988
989
990
991
992
  = do	{ let print_v  = L loc $ ExprStmt (nlHsApp (nlHsVar printName) (nlHsVar v))
			          	   (HsVar thenIOName) placeHolderType
	-- The plans are:
	--	[stmt; print v]		but not if v::()
	--	[stmt]
	; runPlans [do { stuff@([v_id], _) <- tcGhciStmts [stmt, print_v]
		       ; v_ty <- zonkTcType (idType v_id)
993
		       ; ifM (isUnitTy v_ty || not (isTauTy v_ty)) failM
994
995
996
		       ; return stuff },
		    tcGhciStmts [stmt]
	  ]}
997
998

mkPlan stmt
999
  = tcGhciStmts [stmt]
1000

For faster browsing, not all history is shown. View entire blame