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, HsType, InPat, OutPat(..),
15 GRHSsAndBinds, ArithSeqInfo, HsLit, Fake,
17 import RnHsSyn ( SYN_IE(RenamedHsBinds), SYN_IE(RenamedBind), RenamedSig(..),
18 SYN_IE(RenamedMonoBinds)
20 import TcHsSyn ( SYN_IE(TcHsBinds), SYN_IE(TcBind), SYN_IE(TcMonoBinds),
21 TcIdOcc(..), SYN_IE(TcIdBndr) )
24 import GenSpecEtc ( checkSigTyVars, genBinds, TcSigInfo(..) )
25 import Inst ( Inst, SYN_IE(LIE), emptyLIE, plusLIE, InstOrigin(..) )
26 import TcEnv ( tcExtendLocalValEnv, tcLookupLocalValueOK, newMonoIds )
27 import SpecEnv ( SpecEnv )
28 IMPORT_DELOOPER(TcLoop) ( tcGRHSsAndBinds )
29 import TcMatches ( tcMatchesFun )
30 import TcMonoType ( tcHsType )
31 import TcPat ( tcPat )
32 import TcSimplify ( bindInstsOfLocalFuns )
33 import TcType ( newTcTyVar, tcInstSigType, newTyVarTys )
34 import Unify ( unifyTauTy )
36 import Kind ( mkBoxedTypeKind, mkTypeKind )
37 import Id ( GenId, idType, mkUserLocal, mkUserId )
38 import IdInfo ( noIdInfo )
39 import Maybes ( assocMaybe, catMaybes )
40 import Name ( pprNonSym, getOccName, getSrcLoc, Name )
41 import PragmaInfo ( PragmaInfo(..) )
43 import Type ( mkTyVarTy, mkTyVarTys, isTyVarTy,
44 mkSigmaTy, splitSigmaTy,
45 splitRhoTy, mkForAllTy, splitForAllTy )
46 import Bag ( bagToList )
47 import Util ( isIn, zipEqual, zipWith3Equal, panic )
50 %************************************************************************
52 \subsection{Type-checking bindings}
54 %************************************************************************
56 @tcBindsAndThen@ typechecks a @HsBinds@. The "and then" part is because
57 it needs to know something about the {\em usage} of the things bound,
58 so that it can create specialisations of them. So @tcBindsAndThen@
59 takes a function which, given an extended environment, E, typechecks
60 the scope of the bindings returning a typechecked thing and (most
61 important) an LIE. It is this LIE which is then used as the basis for
62 specialising the things bound.
64 @tcBindsAndThen@ also takes a "combiner" which glues together the
65 bindings and the "thing" to make a new "thing".
67 The real work is done by @tcBindAndThen@.
69 Recursive and non-recursive binds are handled in essentially the same
70 way: because of uniques there are no scoping issues left. The only
71 difference is that non-recursive bindings can bind primitive values.
73 Even for non-recursive binding groups we add typings for each binder
74 to the LVE for the following reason. When each individual binding is
75 checked the type of its LHS is unified with that of its RHS; and
76 type-checking the LHS of course requires that the binder is in scope.
78 At the top-level the LIE is sure to contain nothing but constant
79 dictionaries, which we resolve at the module level.
83 :: (TcHsBinds s -> thing -> thing) -- Combinator
85 -> TcM s (thing, LIE s, thing_ty)
86 -> TcM s (thing, LIE s, thing_ty)
88 tcBindsAndThen combiner EmptyBinds do_next
89 = do_next `thenTc` \ (thing, lie, thing_ty) ->
90 returnTc (combiner EmptyBinds thing, lie, thing_ty)
92 tcBindsAndThen combiner (SingleBind bind) do_next
93 = tcBindAndThen combiner bind [] do_next
95 tcBindsAndThen combiner (BindWith bind sigs) do_next
96 = tcBindAndThen combiner bind sigs do_next
98 tcBindsAndThen combiner (ThenBinds binds1 binds2) do_next
99 = tcBindsAndThen combiner binds1 (tcBindsAndThen combiner binds2 do_next)
102 An aside. The original version of @tcBindsAndThen@ which lacks a
103 combiner function, appears below. Though it is perfectly well
104 behaved, it cannot be typed by Haskell, because the recursive call is
105 at a different type to the definition itself. There aren't too many
106 examples of this, which is why I thought it worth preserving! [SLPJ]
111 -> TcM s (thing, LIE s, thing_ty))
112 -> TcM s ((TcHsBinds s, thing), LIE s, thing_ty)
114 tcBindsAndThen EmptyBinds do_next
115 = do_next `thenTc` \ (thing, lie, thing_ty) ->
116 returnTc ((EmptyBinds, thing), lie, thing_ty)
118 tcBindsAndThen (SingleBind bind) do_next
119 = tcBindAndThen bind [] do_next
121 tcBindsAndThen (BindWith bind sigs) do_next
122 = tcBindAndThen bind sigs do_next
124 tcBindsAndThen (ThenBinds binds1 binds2) do_next
125 = tcBindsAndThen binds1 (tcBindsAndThen binds2 do_next)
126 `thenTc` \ ((binds1', (binds2', thing')), lie1, thing_ty) ->
128 returnTc ((binds1' `ThenBinds` binds2', thing'), lie1, thing_ty)
131 %************************************************************************
135 %************************************************************************
139 :: (TcHsBinds s -> thing -> thing) -- Combinator
140 -> RenamedBind -- The Bind to typecheck
141 -> [RenamedSig] -- ...and its signatures
142 -> TcM s (thing, LIE s, thing_ty) -- Thing to type check in
144 -> TcM s (thing, LIE s, thing_ty) -- Results, incl the
146 tcBindAndThen combiner bind sigs do_next
147 = fixTc (\ ~(prag_info_fn, _) ->
148 -- This is the usual prag_info fix; the PragmaInfo field of an Id
149 -- is not inspected till ages later in the compiler, so there
150 -- should be no black-hole problems here.
152 tcBindAndSigs binder_names bind
153 sigs prag_info_fn `thenTc` \ (poly_binds, poly_lie, poly_ids) ->
155 -- Extend the environment to bind the new polymorphic Ids
156 tcExtendLocalValEnv binder_names poly_ids $
158 -- Build bindings and IdInfos corresponding to user pragmas
159 tcPragmaSigs sigs `thenTc` \ (prag_info_fn, prag_binds, prag_lie) ->
161 -- Now do whatever happens next, in the augmented envt
162 do_next `thenTc` \ (thing, thing_lie, thing_ty) ->
164 -- Create specialisations of functions bound here
165 bindInstsOfLocalFuns (prag_lie `plusLIE` thing_lie)
166 poly_ids `thenTc` \ (lie2, inst_mbinds) ->
170 final_lie = lie2 `plusLIE` poly_lie
171 final_binds = poly_binds `ThenBinds`
172 SingleBind (NonRecBind inst_mbinds) `ThenBinds`
175 returnTc (prag_info_fn, (combiner final_binds thing, final_lie, thing_ty))
176 ) `thenTc` \ (_, result) ->
179 binder_names = map fst (bagToList (collectBinders bind))
182 tcBindAndSigs binder_names bind sigs prag_info_fn
184 -- If typechecking the binds fails, then return with each
185 -- binder given type (forall a.a), to minimise subsequent
187 newTcTyVar mkBoxedTypeKind `thenNF_Tc` \ alpha_tv ->
189 forall_a_a = mkForAllTy alpha_tv (mkTyVarTy alpha_tv)
190 poly_ids = [ mkUserId name forall_a_a (prag_info_fn name)
191 | name <- binder_names]
193 returnTc (EmptyBinds, emptyLIE, poly_ids)
196 -- Create a new identifier for each binder, with each being given
197 -- a fresh unique, and a type-variable type.
198 tcGetUniques no_of_binders `thenNF_Tc` \ uniqs ->
199 newTyVarTys no_of_binders kind `thenNF_Tc` \ tys ->
201 mono_ids = zipWith3Equal "tcBindAndSigs" mk_id binder_names uniqs tys
202 mk_id name uniq ty = mkUserLocal (getOccName name) uniq ty (getSrcLoc name)
204 tcExtendLocalValEnv binder_names mono_ids (
205 tcTySigs sigs `thenTc` \ sig_info ->
206 tc_bind bind `thenTc` \ (bind', lie) ->
207 returnTc (bind', lie, sig_info)
209 `thenTc` \ (bind', lie, sig_info) ->
211 -- Notice that genBinds gets the old (non-extended) environment
212 genBinds binder_names mono_ids bind' lie sig_info prag_info_fn
214 no_of_binders = length binder_names
216 NonRecBind _ -> mkTypeKind -- Recursive, so no unboxed types
217 RecBind _ -> mkBoxedTypeKind -- Non-recursive, so we permit unboxed types
227 (TcIdBndr s) -- Polymorpic version
228 (TcIdBndr s) -- Monomorphic verstion
229 [TcType s] [TcIdOcc s] -- Instance information for the monomorphic version
233 -- Deal with type signatures
234 tcTySigs sigs `thenTc` \ sig_infos ->
236 sig_binders = [binder | SigInfo binder _ _ _ _ <- sig_infos]
237 poly_sigs = [(name,poly) | SigInfo name poly _ _ _ <- sig_infos]
238 mono_sigs = [(name,mono) | SigInfo name _ mono _ _ <- sig_infos]
239 nosig_binders = binders `minusList` sig_binders
243 -- Typecheck the binding group
244 tcExtendLocalEnv poly_sigs (
245 newLocalIds nosig_binders kind (\ nosig_local_ids ->
246 tcMonoBinds mono_sigs mono_binds `thenTc` \ binds_w_lies ->
247 returnTc (nosig_local_ids, binds_w_lies)
248 )) `thenTc` \ (nosig_local_ids, binds_w_lies) ->
251 -- Decide what to generalise over
252 getImplicitStuffToGen sig_ids binds_w_lies
253 `thenTc` \ (tyvars_not_to_gen, tyvars_to_gen, lie_to_gen) ->
256 *** CHECK FOR UNBOXED TYVARS HERE! ***
260 -- Make poly_ids for all the binders that don't have type signatures
262 tys_to_gen = mkTyVarTys tyvars_to_gen
263 dicts_to_gen = map instToId (bagToList lie_to_gen)
264 dict_tys = map tcIdType dicts_to_gen
266 mk_poly binder local_id = mkUserId (getName binder) ty noPragmaInfo
268 ty = mkForAllTys tyvars_to_gen $
272 more_sig_infos = [ SigInfo binder (mk_poly binder local_id)
273 local_id tys_to_gen dicts_to_gen lie_to_gen
274 | (binder, local_id) <- zipEqual "???" nosig_binders nosig_local_ids
277 all_sig_infos = sig_infos ++ more_sig_infos -- Contains a "signature" for each binder
281 -- Now generalise the bindings
283 -- local_binds is a bunch of bindings of the form
284 -- f_mono = f_poly tyvars dicts
285 -- one for each binder, f, that lacks a type signature.
286 -- This bunch of bindings is put at the top of the RHS of every
287 -- binding in the group, so as to bind all the f_monos.
289 local_binds = [ (local_id, mkHsDictApp (mkHsTyApp (HsVar local_id) tys_to_gen) dicts_to_gen)
290 | local_id <- nosig_local_ids
293 find_sig lid = head [ (pid, tvs, ds, lie)
294 | SigInfo _ pid lid' tvs ds lie,
299 = tcSimplifyWithExtraGlobals tyvars_not_to_gen tyvars_to_gen avail lie
300 `thenTc` \ (lie_free, dict_binds) ->
301 returnTc (AbsBind tyvars_to_gen_here
303 (zipEqual "gen_bind" local_ids poly_ids)
304 (dict_binds ++ local_binds)
308 local_ids = bindersOf bind
309 local_sigs = [sig | sig@(SigInfo _ _ local_id _ _) <- all_sig_infos,
310 local_id `elem` local_ids
313 (tyvars_to_gen_here, dicts, avail)
314 = case (local_ids, sigs) of
316 ([local_id], [SigInfo _ _ _ tyvars_to_gen dicts lie])
317 -> (tyvars_to_gen, dicts, lie)
319 other -> (tyvars_to_gen, dicts, avail)
322 @getImplicitStuffToGen@ decides what type variables
323 and LIE to generalise over.
325 For a "restricted group" -- see the monomorphism restriction
326 for a definition -- we bind no dictionaries, and
327 remove from tyvars_to_gen any constrained type variables
329 *Don't* simplify dicts at this point, because we aren't going
330 to generalise over these dicts. By the time we do simplify them
331 we may well know more. For example (this actually came up)
333 f x = array ... xs where xs = [1,2,3,4,5]
334 We don't want to generate lots of (fromInt Int 1), (fromInt Int 2)
335 stuff. If we simplify only at the f-binding (not the xs-binding)
336 we'll know that the literals are all Ints, and we can just produce
339 Find all the type variables involved in overloading, the "constrained_tyvars".
340 These are the ones we *aren't* going to generalise.
341 We must be careful about doing this:
342 (a) If we fail to generalise a tyvar which is not actually
343 constrained, then it will never, ever get bound, and lands
344 up printed out in interface files! Notorious example:
345 instance Eq a => Eq (Foo a b) where ..
346 Here, b is not constrained, even though it looks as if it is.
347 Another, more common, example is when there's a Method inst in
348 the LIE, whose type might very well involve non-overloaded
350 (b) On the other hand, we mustn't generalise tyvars which are constrained,
351 because we are going to pass on out the unmodified LIE, with those
352 tyvars in it. They won't be in scope if we've generalised them.
354 So we are careful, and do a complete simplification just to find the
355 constrained tyvars. We don't use any of the results, except to
356 find which tyvars are constrained.
359 getImplicitStuffToGen is_restricted sig_ids binds_w_lies
360 | isUnRestrictedGroup tysig_vars bind
361 = tcSimplify tyvars_to_gen lie `thenTc` \ (_, _, dicts_to_gen) ->
362 returnNF_Tc (emptyTyVarSet, tyvars_to_gen, dicts_to_gen)
365 = tcSimplify tyvars_to_gen lie `thenTc` \ (_, _, constrained_dicts) ->
367 -- ASSERT: dicts_sig is already zonked!
368 constrained_tyvars = foldBag unionTyVarSets tyVarsOfInst emptyTyVarSet constrained_dicts
369 reduced_tyvars_to_gen = tyvars_to_gen `minusTyVarSet` constrained_tyvars
371 returnTc (constrained_tyvars, reduced_tyvars_to_gen, emptyLIE)
374 sig_vars = [sig_var | (TySigInfo sig_var _ _ _ _) <- ty_sigs]
376 (tyvars_to_gen, lie) = foldBag (\(tv1,lie2) (tv2,lie2) -> (tv1 `unionTyVarSets` tv2,
377 lie1 `plusLIE` lie2))
379 (emptyTyVarSet, emptyLIE)
382 = case bindersOf bind of
383 [local_id] | local_id `in` sig_ids -> -- A simple binding with
385 (emptyTyVarSet, emptyLIE)
387 local_ids -> -- Complex binding or no type sig
388 (foldr (unionTyVarSets . tcIdType) emptyTyVarSet local_ids,
396 tc_bind :: RenamedBind -> TcM s (TcBind s, LIE s)
398 tc_bind (NonRecBind mono_binds)
399 = tcMonoBinds mono_binds `thenTc` \ (mono_binds2, lie) ->
400 returnTc (NonRecBind mono_binds2, lie)
402 tc_bind (RecBind mono_binds)
403 = tcMonoBinds mono_binds `thenTc` \ (mono_binds2, lie) ->
404 returnTc (RecBind mono_binds2, lie)
408 tcMonoBinds :: RenamedMonoBinds -> TcM s (TcMonoBinds s, LIE s)
410 tcMonoBinds EmptyMonoBinds = returnTc (EmptyMonoBinds, emptyLIE)
412 tcMonoBinds (AndMonoBinds mb1 mb2)
413 = tcMonoBinds mb1 `thenTc` \ (mb1a, lie1) ->
414 tcMonoBinds mb2 `thenTc` \ (mb2a, lie2) ->
415 returnTc (AndMonoBinds mb1a mb2a, lie1 `plusLIE` lie2)
417 tcMonoBinds bind@(PatMonoBind pat grhss_and_binds locn)
421 tcPat pat `thenTc` \ (pat2, lie_pat, pat_ty) ->
423 -- BINDINGS AND GRHSS
424 tcGRHSsAndBinds grhss_and_binds `thenTc` \ (grhss_and_binds2, lie, grhss_ty) ->
426 -- Unify the two sides
427 tcAddErrCtxt (patMonoBindsCtxt bind) $
428 unifyTauTy pat_ty grhss_ty `thenTc_`
431 returnTc (PatMonoBind pat2 grhss_and_binds2 locn,
434 tcMonoBinds (FunMonoBind name inf matches locn)
436 tcLookupLocalValueOK "tcMonoBinds" name `thenNF_Tc` \ id ->
437 tcMatchesFun name (idType id) matches `thenTc` \ (matches', lie) ->
438 returnTc (FunMonoBind (TcId id) inf matches' locn, lie)
441 %************************************************************************
443 \subsection{Signatures}
445 %************************************************************************
447 @tcSigs@ checks the signatures for validity, and returns a list of
448 {\em freshly-instantiated} signatures. That is, the types are already
449 split up, and have fresh type variables installed. All non-type-signature
450 "RenamedSigs" are ignored.
453 tcTySigs :: [RenamedSig] -> TcM s [TcSigInfo s]
455 tcTySigs (Sig v ty src_loc : other_sigs)
456 = tcAddSrcLoc src_loc (
457 tcHsType ty `thenTc` \ sigma_ty ->
458 tcInstSigType sigma_ty `thenNF_Tc` \ sigma_ty' ->
460 (tyvars', theta', tau') = splitSigmaTy sigma_ty'
463 tcLookupLocalValueOK "tcSig1" v `thenNF_Tc` \ val ->
464 unifyTauTy (idType val) tau' `thenTc_`
466 returnTc (TySigInfo val tyvars' theta' tau' src_loc)
467 ) `thenTc` \ sig_info1 ->
469 tcTySigs other_sigs `thenTc` \ sig_infos ->
470 returnTc (sig_info1 : sig_infos)
472 tcTySigs (other : sigs) = tcTySigs sigs
473 tcTySigs [] = returnTc []
477 %************************************************************************
479 \subsection{SPECIALIZE pragmas}
481 %************************************************************************
484 @tcPragmaSigs@ munches up the "signatures" that arise through *user*
485 pragmas. It is convenient for them to appear in the @[RenamedSig]@
486 part of a binding because then the same machinery can be used for
487 moving them into place as is done for type signatures.
490 tcPragmaSigs :: [RenamedSig] -- The pragma signatures
491 -> TcM s (Name -> PragmaInfo, -- Maps name to the appropriate PragmaInfo
495 tcPragmaSigs sigs = returnTc ( \name -> NoPragmaInfo, EmptyBinds, emptyLIE )
499 = mapAndUnzip3Tc tcPragmaSig sigs `thenTc` \ (names_w_id_infos, binds, lies) ->
501 name_to_info name = foldr ($) noIdInfo
502 [info_fn | (n,info_fn) <- names_w_id_infos, n==name]
504 returnTc (name_to_info,
505 foldr ThenBinds EmptyBinds binds,
506 foldr plusLIE emptyLIE lies)
509 Here are the easy cases for tcPragmaSigs
512 tcPragmaSig (DeforestSig name loc)
513 = returnTc ((name, addDeforestInfo DoDeforest),EmptyBinds,emptyLIE)
514 tcPragmaSig (InlineSig name loc)
515 = returnTc ((name, addUnfoldInfo (iWantToBeINLINEd UnfoldAlways)), EmptyBinds, emptyLIE)
516 tcPragmaSig (MagicUnfoldingSig name string loc)
517 = returnTc ((name, addUnfoldInfo (mkMagicUnfolding string)), EmptyBinds, emptyLIE)
520 The interesting case is for SPECIALISE pragmas. There are two forms.
521 Here's the first form:
523 f :: Ord a => [a] -> b -> b
524 {-# SPECIALIZE f :: [Int] -> b -> b #-}
527 For this we generate:
529 f* = /\ b -> let d1 = ...
533 where f* is a SpecPragmaId. The **sole** purpose of SpecPragmaIds is to
534 retain a right-hand-side that the simplifier will otherwise discard as
535 dead code... the simplifier has a flag that tells it not to discard
536 SpecPragmaId bindings.
538 In this case the f* retains a call-instance of the overloaded
539 function, f, (including appropriate dictionaries) so that the
540 specialiser will subsequently discover that there's a call of @f@ at
541 Int, and will create a specialisation for @f@. After that, the
542 binding for @f*@ can be discarded.
544 The second form is this:
546 f :: Ord a => [a] -> b -> b
547 {-# SPECIALIZE f :: [Int] -> b -> b = g #-}
550 Here @g@ is specified as a function that implements the specialised
551 version of @f@. Suppose that g has type (a->b->b); that is, g's type
552 is more general than that required. For this we generate
554 f@Int = /\b -> g Int b
558 Here @f@@Int@ is a SpecId, the specialised version of @f@. It inherits
559 f's export status etc. @f*@ is a SpecPragmaId, as before, which just serves
560 to prevent @f@@Int@ from being discarded prematurely. After specialisation,
561 if @f@@Int@ is going to be used at all it will be used explicitly, so the simplifier can
562 discard the f* binding.
564 Actually, there is really only point in giving a SPECIALISE pragma on exported things,
565 and the simplifer won't discard SpecIds for exporte things anyway, so maybe this is
569 tcPragmaSig (SpecSig name poly_ty maybe_spec_name src_loc)
570 = tcAddSrcLoc src_loc $
571 tcAddErrCtxt (valSpecSigCtxt name spec_ty) $
573 -- Get and instantiate its alleged specialised type
574 tcHsType poly_ty `thenTc` \ sig_sigma ->
575 tcInstSigType sig_sigma `thenNF_Tc` \ sig_ty ->
577 (sig_tyvars, sig_theta, sig_tau) = splitSigmaTy sig_ty
578 origin = ValSpecOrigin name
581 -- Check that the SPECIALIZE pragma had an empty context
582 checkTc (null sig_theta)
583 (panic "SPECIALIZE non-empty context (ToDo: msg)") `thenTc_`
585 -- Get and instantiate the type of the id mentioned
586 tcLookupLocalValueOK "tcPragmaSig" name `thenNF_Tc` \ main_id ->
587 tcInstSigType [] (idType main_id) `thenNF_Tc` \ main_ty ->
589 (main_tyvars, main_rho) = splitForAllTy main_ty
590 (main_theta,main_tau) = splitRhoTy main_rho
591 main_arg_tys = mkTyVarTys main_tyvars
594 -- Check that the specialised type is indeed an instance of
595 -- the type of the main function.
596 unifyTauTy sig_tau main_tau `thenTc_`
597 checkSigTyVars sig_tyvars sig_tau `thenTc_`
599 -- Check that the type variables of the polymorphic function are
600 -- either left polymorphic, or instantiate to ground type.
601 -- Also check that the overloaded type variables are instantiated to
602 -- ground type; or equivalently that all dictionaries have ground type
603 mapTc zonkTcType main_arg_tys `thenNF_Tc` \ main_arg_tys' ->
604 zonkTcThetaType main_theta `thenNF_Tc` \ main_theta' ->
605 tcAddErrCtxt (specGroundnessCtxt main_arg_tys')
606 (checkTc (all isGroundOrTyVarTy main_arg_tys')) `thenTc_`
607 tcAddErrCtxt (specContextGroundnessCtxt main_theta')
608 (checkTc (and [isGroundTy ty | (_,ty) <- theta'])) `thenTc_`
610 -- Build the SpecPragmaId; it is the thing that makes sure we
611 -- don't prematurely dead-code-eliminate the binding we are really interested in.
612 newSpecPragmaId name sig_ty `thenNF_Tc` \ spec_pragma_id ->
614 -- Build a suitable binding; depending on whether we were given
615 -- a value (Maybe Name) to be used as the specialisation.
617 Nothing -> -- No implementation function specified
619 -- Make a Method inst for the occurrence of the overloaded function
620 newMethodWithGivenTy (OccurrenceOf name)
621 (TcId main_id) main_arg_tys main_rho `thenNF_Tc` \ (lie, meth_id) ->
624 pseudo_bind = VarMonoBind spec_pragma_id pseudo_rhs
625 pseudo_rhs = mkHsTyLam sig_tyvars (HsVar (TcId meth_id))
627 returnTc (pseudo_bind, lie, \ info -> info)
629 Just spec_name -> -- Use spec_name as the specialisation value ...
631 -- Type check a simple occurrence of the specialised Id
632 tcId spec_name `thenTc` \ (spec_body, spec_lie, spec_tau) ->
634 -- Check that it has the correct type, and doesn't constrain the
635 -- signature variables at all
636 unifyTauTy sig_tau spec_tau `thenTc_`
637 checkSigTyVars sig_tyvars sig_tau `thenTc_`
639 -- Make a local SpecId to bind to applied spec_id
640 newSpecId main_id main_arg_tys sig_ty `thenNF_Tc` \ local_spec_id ->
643 spec_rhs = mkHsTyLam sig_tyvars spec_body
644 spec_binds = VarMonoBind local_spec_id spec_rhs
646 VarMonoBind spec_pragma_id (HsVar (TcId local_spec_id))
647 spec_info = SpecInfo spec_tys (length main_theta) local_spec_id
649 returnTc ((name, addSpecInfo spec_info), spec_binds, spec_lie)
654 %************************************************************************
656 \subsection[TcBinds-monomorphism]{The monomorphism restriction}
658 %************************************************************************
663 {- In GenSpec at the moment
665 isUnRestrictedGroup :: [TcIdBndr s] -- Signatures given for these
669 isUnRestrictedGroup sigs EmptyBind = True
670 isUnRestrictedGroup sigs (NonRecBind monobinds) = isUnResMono sigs monobinds
671 isUnRestrictedGroup sigs (RecBind monobinds) = isUnResMono sigs monobinds
673 is_elem v vs = isIn "isUnResMono" v vs
675 isUnResMono sigs (PatMonoBind (VarPat (TcId v)) _ _) = v `is_elem` sigs
676 isUnResMono sigs (PatMonoBind other _ _) = False
677 isUnResMono sigs (VarMonoBind (TcId v) _) = v `is_elem` sigs
678 isUnResMono sigs (FunMonoBind _ _ _ _) = True
679 isUnResMono sigs (AndMonoBinds mb1 mb2) = isUnResMono sigs mb1 &&
681 isUnResMono sigs EmptyMonoBinds = True
686 %************************************************************************
688 \subsection[TcBinds-errors]{Error contexts and messages}
690 %************************************************************************
694 patMonoBindsCtxt bind sty
695 = ppHang (ppPStr SLIT("In a pattern binding:")) 4 (ppr sty bind)
697 --------------------------------------------
698 specContextGroundnessCtxt -- err_ctxt dicts sty
699 = panic "specContextGroundnessCtxt"
702 ppSep [ppBesides [ppStr "In the SPECIALIZE pragma for `", ppr sty name, ppStr "'"],
703 ppBesides [ppStr " specialised to the type `", ppr sty spec_ty, ppStr "'"],
705 ppStr "... not all overloaded type variables were instantiated",
706 ppStr "to ground types:"])
707 4 (ppAboves [ppCat [ppr sty c, ppr sty t]
708 | (c,t) <- map getDictClassAndType dicts])
710 (name, spec_ty, locn, pp_spec_id)
712 ValSpecSigCtxt n ty loc -> (n, ty, loc, \ x -> ppNil)
713 ValSpecSpecIdCtxt n ty spec loc ->
715 \ sty -> ppBesides [ppStr "... type of explicit id `", ppr sty spec, ppStr "'"])
718 -----------------------------------------------
720 = panic "specGroundnessCtxt"
723 valSpecSigCtxt v ty sty
724 = ppHang (ppPStr SLIT("In a SPECIALIZE pragma for a value:"))
725 4 (ppSep [ppBeside (pprNonSym sty v) (ppPStr SLIT(" ::")),