2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[TcBinds]{TcBinds}
7 #include "HsVersions.h"
9 module TcBinds ( tcBindsAndThen, tcPragmaSigs ) where
13 import HsSyn ( HsBinds(..), Bind(..), Sig(..), MonoBinds(..),
14 HsExpr, Match, PolyType, InPat, OutPat,
15 GRHSsAndBinds, ArithSeqInfo, HsLit, Fake,
17 import RnHsSyn ( RenamedHsBinds(..), RenamedBind(..), RenamedSig(..),
18 RenamedMonoBinds(..) )
19 import TcHsSyn ( TcHsBinds(..), TcBind(..), TcMonoBinds(..),
20 TcIdOcc(..), TcIdBndr(..) )
23 import GenSpecEtc ( checkSigTyVars, genBinds, TcSigInfo(..) )
24 import Inst ( Inst, LIE(..), emptyLIE, plusLIE, InstOrigin(..) )
25 import TcEnv ( tcExtendLocalValEnv, tcLookupLocalValueOK, newMonoIds )
26 import TcLoop ( tcGRHSsAndBinds )
27 import TcMatches ( tcMatchesFun )
28 import TcMonoType ( tcPolyType )
29 import TcPat ( tcPat )
30 import TcSimplify ( bindInstsOfLocalFuns )
31 import TcType ( newTcTyVar, tcInstType )
32 import Unify ( unifyTauTy )
34 import Kind ( mkBoxedTypeKind, mkTypeKind )
35 import Id ( GenId, idType, mkUserId )
36 import IdInfo ( noIdInfo )
37 import Name ( Name ) -- instances
38 import Maybes ( assocMaybe, catMaybes, Maybe(..) )
39 import Outputable ( pprNonOp )
40 import PragmaInfo ( PragmaInfo(..) )
42 import Type ( mkTyVarTy, mkTyVarTys, isTyVarTy,
43 mkSigmaTy, splitSigmaTy,
44 splitRhoTy, mkForAllTy, splitForAllTy )
48 %************************************************************************
50 \subsection{Type-checking bindings}
52 %************************************************************************
54 @tcBindsAndThen@ typechecks a @HsBinds@. The "and then" part is because
55 it needs to know something about the {\em usage} of the things bound,
56 so that it can create specialisations of them. So @tcBindsAndThen@
57 takes a function which, given an extended environment, E, typechecks
58 the scope of the bindings returning a typechecked thing and (most
59 important) an LIE. It is this LIE which is then used as the basis for
60 specialising the things bound.
62 @tcBindsAndThen@ also takes a "combiner" which glues together the
63 bindings and the "thing" to make a new "thing".
65 The real work is done by @tcBindAndThen@.
67 Recursive and non-recursive binds are handled in essentially the same
68 way: because of uniques there are no scoping issues left. The only
69 difference is that non-recursive bindings can bind primitive values.
71 Even for non-recursive binding groups we add typings for each binder
72 to the LVE for the following reason. When each individual binding is
73 checked the type of its LHS is unified with that of its RHS; and
74 type-checking the LHS of course requires that the binder is in scope.
76 At the top-level the LIE is sure to contain nothing but constant
77 dictionaries, which we resolve at the module level.
81 :: (TcHsBinds s -> thing -> thing) -- Combinator
83 -> TcM s (thing, LIE s, thing_ty)
84 -> TcM s (thing, LIE s, thing_ty)
86 tcBindsAndThen combiner EmptyBinds do_next
87 = do_next `thenTc` \ (thing, lie, thing_ty) ->
88 returnTc (combiner EmptyBinds thing, lie, thing_ty)
90 tcBindsAndThen combiner (SingleBind bind) do_next
91 = tcBindAndThen combiner bind [] do_next
93 tcBindsAndThen combiner (BindWith bind sigs) do_next
94 = tcBindAndThen combiner bind sigs do_next
96 tcBindsAndThen combiner (ThenBinds binds1 binds2) do_next
97 = tcBindsAndThen combiner binds1 (tcBindsAndThen combiner binds2 do_next)
100 An aside. The original version of @tcBindsAndThen@ which lacks a
101 combiner function, appears below. Though it is perfectly well
102 behaved, it cannot be typed by Haskell, because the recursive call is
103 at a different type to the definition itself. There aren't too many
104 examples of this, which is why I thought it worth preserving! [SLPJ]
109 -> TcM s (thing, LIE s, thing_ty))
110 -> TcM s ((TcHsBinds s, thing), LIE s, thing_ty)
112 tcBindsAndThen EmptyBinds do_next
113 = do_next `thenTc` \ (thing, lie, thing_ty) ->
114 returnTc ((EmptyBinds, thing), lie, thing_ty)
116 tcBindsAndThen (SingleBind bind) do_next
117 = tcBindAndThen bind [] do_next
119 tcBindsAndThen (BindWith bind sigs) do_next
120 = tcBindAndThen bind sigs do_next
122 tcBindsAndThen (ThenBinds binds1 binds2) do_next
123 = tcBindsAndThen binds1 (tcBindsAndThen binds2 do_next)
124 `thenTc` \ ((binds1', (binds2', thing')), lie1, thing_ty) ->
126 returnTc ((binds1' `ThenBinds` binds2', thing'), lie1, thing_ty)
129 %************************************************************************
133 %************************************************************************
137 :: (TcHsBinds s -> thing -> thing) -- Combinator
138 -> RenamedBind -- The Bind to typecheck
139 -> [RenamedSig] -- ...and its signatures
140 -> TcM s (thing, LIE s, thing_ty) -- Thing to type check in
142 -> TcM s (thing, LIE s, thing_ty) -- Results, incl the
144 tcBindAndThen combiner bind sigs do_next
145 = fixTc (\ ~(prag_info_fn, _) ->
146 -- This is the usual prag_info fix; the PragmaInfo field of an Id
147 -- is not inspected till ages later in the compiler, so there
148 -- should be no black-hole problems here.
150 tcBindAndSigs binder_names bind
151 sigs prag_info_fn `thenTc` \ (poly_binds, poly_lie, poly_ids) ->
153 -- Extend the environment to bind the new polymorphic Ids
154 tcExtendLocalValEnv binder_names poly_ids $
156 -- Build bindings and IdInfos corresponding to user pragmas
157 tcPragmaSigs sigs `thenTc` \ (prag_info_fn, prag_binds, prag_lie) ->
159 -- Now do whatever happens next, in the augmented envt
160 do_next `thenTc` \ (thing, thing_lie, thing_ty) ->
162 -- Create specialisations of functions bound here
163 bindInstsOfLocalFuns (prag_lie `plusLIE` thing_lie)
164 poly_ids `thenTc` \ (lie2, inst_mbinds) ->
168 final_lie = lie2 `plusLIE` poly_lie
169 final_binds = poly_binds `ThenBinds`
170 SingleBind (NonRecBind inst_mbinds) `ThenBinds`
173 returnTc (prag_info_fn, (combiner final_binds thing, final_lie, thing_ty))
174 ) `thenTc` \ (_, result) ->
177 binder_names = collectBinders bind
180 tcBindAndSigs binder_names bind sigs prag_info_fn
182 -- If typechecking the binds fails, then return with each
183 -- binder given type (forall a.a), to minimise subsequent
185 newTcTyVar Nothing mkBoxedTypeKind `thenNF_Tc` \ alpha_tv ->
187 forall_a_a = mkForAllTy alpha_tv (mkTyVarTy alpha_tv)
188 poly_ids = [ mkUserId name forall_a_a (prag_info_fn name)
189 | name <- binder_names]
191 returnTc (EmptyBinds, emptyLIE, poly_ids)
194 -- Create a new identifier for each binder, with each being given
195 -- a type-variable type.
196 newMonoIds binder_names kind (\ mono_ids ->
197 tcTySigs sigs `thenTc` \ sig_info ->
198 tc_bind bind `thenTc` \ (bind', lie) ->
199 returnTc (mono_ids, bind', lie, sig_info)
201 `thenTc` \ (mono_ids, bind', lie, sig_info) ->
203 -- Notice that genBinds gets the old (non-extended) environment
204 genBinds binder_names mono_ids bind' lie sig_info prag_info_fn
207 NonRecBind _ -> mkBoxedTypeKind -- Recursive, so no unboxed types
208 RecBind _ -> mkTypeKind -- Non-recursive, so we permit unboxed types
212 tc_bind :: RenamedBind -> TcM s (TcBind s, LIE s)
214 tc_bind (NonRecBind mono_binds)
215 = tcMonoBinds mono_binds `thenTc` \ (mono_binds2, lie) ->
216 returnTc (NonRecBind mono_binds2, lie)
218 tc_bind (RecBind mono_binds)
219 = tcMonoBinds mono_binds `thenTc` \ (mono_binds2, lie) ->
220 returnTc (RecBind mono_binds2, lie)
224 tcMonoBinds :: RenamedMonoBinds -> TcM s (TcMonoBinds s, LIE s)
226 tcMonoBinds EmptyMonoBinds = returnTc (EmptyMonoBinds, emptyLIE)
228 tcMonoBinds (AndMonoBinds mb1 mb2)
229 = tcMonoBinds mb1 `thenTc` \ (mb1a, lie1) ->
230 tcMonoBinds mb2 `thenTc` \ (mb2a, lie2) ->
231 returnTc (AndMonoBinds mb1a mb2a, lie1 `plusLIE` lie2)
233 tcMonoBinds bind@(PatMonoBind pat grhss_and_binds locn)
237 tcPat pat `thenTc` \ (pat2, lie_pat, pat_ty) ->
239 -- BINDINGS AND GRHSS
240 tcGRHSsAndBinds grhss_and_binds `thenTc` \ (grhss_and_binds2, lie, grhss_ty) ->
242 -- Unify the two sides
243 tcAddErrCtxt (patMonoBindsCtxt bind) $
244 unifyTauTy pat_ty grhss_ty `thenTc_`
247 returnTc (PatMonoBind pat2 grhss_and_binds2 locn,
250 tcMonoBinds (FunMonoBind name matches locn)
252 tcLookupLocalValueOK "tcMonoBinds" name `thenNF_Tc` \ id ->
253 tcMatchesFun name (idType id) matches `thenTc` \ (matches', lie) ->
254 returnTc (FunMonoBind (TcId id) matches' locn, lie)
257 %************************************************************************
259 \subsection{Signatures}
261 %************************************************************************
263 @tcSigs@ checks the signatures for validity, and returns a list of
264 {\em freshly-instantiated} signatures. That is, the types are already
265 split up, and have fresh type variables installed. All non-type-signature
266 "RenamedSigs" are ignored.
269 tcTySigs :: [RenamedSig] -> TcM s [TcSigInfo s]
271 tcTySigs (Sig v ty _ src_loc : other_sigs)
272 = tcAddSrcLoc src_loc (
273 tcPolyType ty `thenTc` \ sigma_ty ->
274 tcInstType [] sigma_ty `thenNF_Tc` \ tc_sigma_ty ->
276 (tyvars, theta, tau_ty) = splitSigmaTy tc_sigma_ty
278 tcLookupLocalValueOK "tcSig1" v `thenNF_Tc` \ val ->
279 unifyTauTy (idType val) tau_ty `thenTc_`
280 returnTc (TySigInfo val tyvars theta tau_ty src_loc)
281 ) `thenTc` \ sig_info1 ->
283 tcTySigs other_sigs `thenTc` \ sig_infos ->
284 returnTc (sig_info1 : sig_infos)
286 tcTySigs (other : sigs) = tcTySigs sigs
287 tcTySigs [] = returnTc []
291 %************************************************************************
293 \subsection{SPECIALIZE pragmas}
295 %************************************************************************
298 @tcPragmaSigs@ munches up the "signatures" that arise through *user*
299 pragmas. It is convenient for them to appear in the @[RenamedSig]@
300 part of a binding because then the same machinery can be used for
301 moving them into place as is done for type signatures.
304 tcPragmaSigs :: [RenamedSig] -- The pragma signatures
305 -> TcM s (Name -> PragmaInfo, -- Maps name to the appropriate PragmaInfo
309 tcPragmaSigs sigs = returnTc ( \name -> NoPragmaInfo, EmptyBinds, emptyLIE )
313 = mapAndUnzip3Tc tcPragmaSig sigs `thenTc` \ (names_w_id_infos, binds, lies) ->
315 name_to_info name = foldr ($) noIdInfo
316 [info_fn | (n,info_fn) <- names_w_id_infos, n==name]
318 returnTc (name_to_info,
319 foldr ThenBinds EmptyBinds binds,
320 foldr plusLIE emptyLIE lies)
323 Here are the easy cases for tcPragmaSigs
326 tcPragmaSig (DeforestSig name loc)
327 = returnTc ((name, addInfo DoDeforest),EmptyBinds,emptyLIE)
328 tcPragmaSig (InlineSig name loc)
329 = returnTc ((name, addInfo_UF (iWantToBeINLINEd UnfoldAlways)), EmptyBinds, emptyLIE)
330 tcPragmaSig (MagicUnfoldingSig name string loc)
331 = returnTc ((name, addInfo_UF (mkMagicUnfolding string)), EmptyBinds, emptyLIE)
334 The interesting case is for SPECIALISE pragmas. There are two forms.
335 Here's the first form:
337 f :: Ord a => [a] -> b -> b
338 {-# SPECIALIZE f :: [Int] -> b -> b #-}
341 For this we generate:
343 f* = /\ b -> let d1 = ...
347 where f* is a SpecPragmaId. The **sole** purpose of SpecPragmaIds is to
348 retain a right-hand-side that the simplifier will otherwise discard as
349 dead code... the simplifier has a flag that tells it not to discard
350 SpecPragmaId bindings.
352 In this case the f* retains a call-instance of the overloaded
353 function, f, (including appropriate dictionaries) so that the
354 specialiser will subsequently discover that there's a call of @f@ at
355 Int, and will create a specialisation for @f@. After that, the
356 binding for @f*@ can be discarded.
358 The second form is this:
360 f :: Ord a => [a] -> b -> b
361 {-# SPECIALIZE f :: [Int] -> b -> b = g #-}
364 Here @g@ is specified as a function that implements the specialised
365 version of @f@. Suppose that g has type (a->b->b); that is, g's type
366 is more general than that required. For this we generate
368 f@Int = /\b -> g Int b
372 Here @f@@Int@ is a SpecId, the specialised version of @f@. It inherits
373 f's export status etc. @f*@ is a SpecPragmaId, as before, which just serves
374 to prevent @f@@Int@ from being discarded prematurely. After specialisation,
375 if @f@@Int@ is going to be used at all it will be used explicitly, so the simplifier can
376 discard the f* binding.
378 Actually, there is really only point in giving a SPECIALISE pragma on exported things,
379 and the simplifer won't discard SpecIds for exporte things anyway, so maybe this is
383 tcPragmaSig (SpecSig name poly_ty maybe_spec_name src_loc)
384 = tcAddSrcLoc src_loc $
385 tcAddErrCtxt (valSpecSigCtxt name spec_ty) $
387 -- Get and instantiate its alleged specialised type
388 tcPolyType poly_ty `thenTc` \ sig_sigma ->
389 tcInstType [] (idType sig_sigma) `thenNF_Tc` \ sig_ty ->
391 (sig_tyvars, sig_theta, sig_tau) = splitSigmaTy sig_ty
392 origin = ValSpecOrigin name
395 -- Check that the SPECIALIZE pragma had an empty context
396 checkTc (null sig_theta)
397 (panic "SPECIALIZE non-empty context (ToDo: msg)") `thenTc_`
399 -- Get and instantiate the type of the id mentioned
400 tcLookupLocalValueOK "tcPragmaSig" name `thenNF_Tc` \ main_id ->
401 tcInstType [] (idType main_id) `thenNF_Tc` \ main_ty ->
403 (main_tyvars, main_rho) = splitForAllTy main_ty
404 (main_theta,main_tau) = splitRhoTy main_rho
405 main_arg_tys = mkTyVarTys main_tyvars
408 -- Check that the specialised type is indeed an instance of
409 -- the type of the main function.
410 unifyTauTy sig_tau main_tau `thenTc_`
411 checkSigTyVars sig_tyvars sig_tau main_tau `thenTc_`
413 -- Check that the type variables of the polymorphic function are
414 -- either left polymorphic, or instantiate to ground type.
415 -- Also check that the overloaded type variables are instantiated to
416 -- ground type; or equivalently that all dictionaries have ground type
417 mapTc zonkTcType main_arg_tys `thenNF_Tc` \ main_arg_tys' ->
418 zonkTcThetaType main_theta `thenNF_Tc` \ main_theta' ->
419 tcAddErrCtxt (specGroundnessCtxt main_arg_tys')
420 (checkTc (all isGroundOrTyVarTy main_arg_tys')) `thenTc_`
421 tcAddErrCtxt (specContextGroundnessCtxt main_theta')
422 (checkTc (and [isGroundTy ty | (_,ty) <- theta'])) `thenTc_`
424 -- Build the SpecPragmaId; it is the thing that makes sure we
425 -- don't prematurely dead-code-eliminate the binding we are really interested in.
426 newSpecPragmaId name sig_ty `thenNF_Tc` \ spec_pragma_id ->
428 -- Build a suitable binding; depending on whether we were given
429 -- a value (Maybe Name) to be used as the specialisation.
431 Nothing -> -- No implementation function specified
433 -- Make a Method inst for the occurrence of the overloaded function
434 newMethodWithGivenTy (OccurrenceOf name)
435 (TcId main_id) main_arg_tys main_rho `thenNF_Tc` \ (lie, meth_id) ->
438 pseudo_bind = VarMonoBind spec_pragma_id pseudo_rhs
439 pseudo_rhs = mkHsTyLam sig_tyvars (HsVar (TcId meth_id))
441 returnTc (pseudo_bind, lie, \ info -> info)
443 Just spec_name -> -- Use spec_name as the specialisation value ...
445 -- Type check a simple occurrence of the specialised Id
446 tcId spec_name `thenTc` \ (spec_body, spec_lie, spec_tau) ->
448 -- Check that it has the correct type, and doesn't constrain the
449 -- signature variables at all
450 unifyTauTy sig_tau spec_tau `thenTc_`
451 checkSigTyVars sig_tyvars sig_tau spec_tau `thenTc_`
453 -- Make a local SpecId to bind to applied spec_id
454 newSpecId main_id main_arg_tys sig_ty `thenNF_Tc` \ local_spec_id ->
457 spec_rhs = mkHsTyLam sig_tyvars spec_body
458 spec_binds = VarMonoBind local_spec_id spec_rhs
460 VarMonoBind spec_pragma_id (HsVar (TcId local_spec_id))
461 spec_info = SpecInfo spec_tys (length main_theta) local_spec_id
463 returnTc ((name, addInfo spec_info), spec_binds, spec_lie)
468 Error contexts and messages
469 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
471 patMonoBindsCtxt bind sty
472 = ppHang (ppPStr SLIT("In a pattern binding:")) 4 (ppr sty bind)
474 --------------------------------------------
475 specContextGroundnessCtxt -- err_ctxt dicts sty
476 = panic "specContextGroundnessCtxt"
479 ppSep [ppBesides [ppStr "In the SPECIALIZE pragma for `", ppr sty name, ppStr "'"],
480 ppBesides [ppStr " specialised to the type `", ppr sty spec_ty, ppStr "'"],
482 ppStr "... not all overloaded type variables were instantiated",
483 ppStr "to ground types:"])
484 4 (ppAboves [ppCat [ppr sty c, ppr sty t]
485 | (c,t) <- map getDictClassAndType dicts])
487 (name, spec_ty, locn, pp_spec_id)
489 ValSpecSigCtxt n ty loc -> (n, ty, loc, \ x -> ppNil)
490 ValSpecSpecIdCtxt n ty spec loc ->
492 \ sty -> ppBesides [ppStr "... type of explicit id `", ppr sty spec, ppStr "'"])
495 -----------------------------------------------
497 = panic "specGroundnessCtxt"
500 valSpecSigCtxt v ty sty
501 = ppHang (ppPStr SLIT("In a SPECIALIZE pragma for a value:"))
502 4 (ppSep [ppBeside (pprNonOp sty v) (ppPStr SLIT(" ::")),