summaryrefslogtreecommitdiff
path: root/ghc/compiler/typecheck/TcBinds.lhs
blob: ffafeb71d7ccd99e92996b76acaf7e38187d03ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
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
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
%
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
%
\section[TcBinds]{TcBinds}

\begin{code}
#include "HsVersions.h"

module TcBinds ( tcBindsAndThen, tcPragmaSigs ) where

IMP_Ubiq()

import HsSyn		( HsBinds(..), Bind(..), Sig(..), MonoBinds(..), 
			  HsExpr, Match, HsType, InPat, OutPat(..),
			  GRHSsAndBinds, ArithSeqInfo, HsLit, Fake,
			  collectBinders )
import RnHsSyn		( SYN_IE(RenamedHsBinds), SYN_IE(RenamedBind), RenamedSig(..), 
			  SYN_IE(RenamedMonoBinds)
			)
import TcHsSyn		( SYN_IE(TcHsBinds), SYN_IE(TcBind), SYN_IE(TcMonoBinds),
			  TcIdOcc(..), SYN_IE(TcIdBndr) )

import TcMonad
import GenSpecEtc	( checkSigTyVars, genBinds, TcSigInfo(..) )
import Inst		( Inst, SYN_IE(LIE), emptyLIE, plusLIE, InstOrigin(..) )
import TcEnv		( tcExtendLocalValEnv, tcLookupLocalValueOK, newMonoIds )
import SpecEnv		( SpecEnv )
IMPORT_DELOOPER(TcLoop)		( tcGRHSsAndBinds )
import TcMatches	( tcMatchesFun )
import TcMonoType	( tcHsType )
import TcPat		( tcPat )
import TcSimplify	( bindInstsOfLocalFuns )
import TcType		( newTcTyVar, tcInstSigType, newTyVarTys )
import Unify		( unifyTauTy )

import Kind		( mkBoxedTypeKind, mkTypeKind )
import Id		( GenId, idType, mkUserLocal, mkUserId )
import IdInfo		( noIdInfo )
import Maybes		( assocMaybe, catMaybes )
import Name		( pprNonSym, getOccName, getSrcLoc, Name )
import PragmaInfo	( PragmaInfo(..) )
import Pretty
import Type		( mkTyVarTy, mkTyVarTys, isTyVarTy,
			  mkSigmaTy, splitSigmaTy,
			  splitRhoTy, mkForAllTy, splitForAllTy )
import Bag		( bagToList )
import Util		( isIn, zipEqual, zipWith3Equal, panic )
\end{code}

%************************************************************************
%*									*
\subsection{Type-checking bindings}
%*									*
%************************************************************************

@tcBindsAndThen@ typechecks a @HsBinds@.  The "and then" part is because
it needs to know something about the {\em usage} of the things bound,
so that it can create specialisations of them.  So @tcBindsAndThen@
takes a function which, given an extended environment, E, typechecks
the scope of the bindings returning a typechecked thing and (most
important) an LIE.  It is this LIE which is then used as the basis for
specialising the things bound.

@tcBindsAndThen@ also takes a "combiner" which glues together the
bindings and the "thing" to make a new "thing".

The real work is done by @tcBindAndThen@.

Recursive and non-recursive binds are handled in essentially the same
way: because of uniques there are no scoping issues left.  The only
difference is that non-recursive bindings can bind primitive values.

Even for non-recursive binding groups we add typings for each binder
to the LVE for the following reason.  When each individual binding is
checked the type of its LHS is unified with that of its RHS; and
type-checking the LHS of course requires that the binder is in scope.

At the top-level the LIE is sure to contain nothing but constant
dictionaries, which we resolve at the module level.

\begin{code}
tcBindsAndThen
	:: (TcHsBinds s -> thing -> thing)		-- Combinator
	-> RenamedHsBinds
	-> TcM s (thing, LIE s, thing_ty)
	-> TcM s (thing, LIE s, thing_ty)

tcBindsAndThen combiner EmptyBinds do_next
  = do_next 	`thenTc` \ (thing, lie, thing_ty) ->
    returnTc (combiner EmptyBinds thing, lie, thing_ty)

tcBindsAndThen combiner (SingleBind bind) do_next
  = tcBindAndThen combiner bind [] do_next

tcBindsAndThen combiner (BindWith bind sigs) do_next
  = tcBindAndThen combiner bind sigs do_next

tcBindsAndThen combiner (ThenBinds binds1 binds2) do_next
  = tcBindsAndThen combiner binds1 (tcBindsAndThen combiner binds2 do_next)
\end{code}

An aside.  The original version of @tcBindsAndThen@ which lacks a
combiner function, appears below.  Though it is perfectly well
behaved, it cannot be typed by Haskell, because the recursive call is
at a different type to the definition itself.  There aren't too many
examples of this, which is why I thought it worth preserving! [SLPJ]

\begin{pseudocode}
tcBindsAndThen
	:: RenamedHsBinds
	-> TcM s (thing, LIE s, thing_ty))
	-> TcM s ((TcHsBinds s, thing), LIE s, thing_ty)

tcBindsAndThen EmptyBinds do_next
  = do_next 		`thenTc` \ (thing, lie, thing_ty) ->
    returnTc ((EmptyBinds, thing), lie, thing_ty)

tcBindsAndThen (SingleBind bind) do_next
  = tcBindAndThen bind [] do_next

tcBindsAndThen (BindWith bind sigs) do_next
  = tcBindAndThen bind sigs do_next

tcBindsAndThen (ThenBinds binds1 binds2) do_next
  = tcBindsAndThen binds1 (tcBindsAndThen binds2 do_next)
	`thenTc` \ ((binds1', (binds2', thing')), lie1, thing_ty) ->

    returnTc ((binds1' `ThenBinds` binds2', thing'), lie1, thing_ty)
\end{pseudocode}

%************************************************************************
%*									*
\subsection{Bind}
%*									*
%************************************************************************

\begin{code}
tcBindAndThen
	:: (TcHsBinds s -> thing -> thing)		  -- Combinator
	-> RenamedBind					  -- The Bind to typecheck
	-> [RenamedSig]					  -- ...and its signatures
	-> TcM s (thing, LIE s, thing_ty)		  -- Thing to type check in
							  -- augmented envt
	-> TcM s (thing, LIE s, thing_ty)		  -- Results, incl the

tcBindAndThen combiner bind sigs do_next
  = fixTc (\ ~(prag_info_fn, _) ->
	-- This is the usual prag_info fix; the PragmaInfo field of an Id
	-- is not inspected till ages later in the compiler, so there
	-- should be no black-hole problems here.
    
    tcBindAndSigs binder_names bind 
		  sigs prag_info_fn	`thenTc` \ (poly_binds, poly_lie, poly_ids) ->

	-- Extend the environment to bind the new polymorphic Ids
    tcExtendLocalValEnv binder_names poly_ids $

	-- Build bindings and IdInfos corresponding to user pragmas
    tcPragmaSigs sigs			`thenTc` \ (prag_info_fn, prag_binds, prag_lie) ->

	-- Now do whatever happens next, in the augmented envt
    do_next				`thenTc` \ (thing, thing_lie, thing_ty) ->

	-- Create specialisations of functions bound here
    bindInstsOfLocalFuns (prag_lie `plusLIE` thing_lie)
			  poly_ids	`thenTc` \ (lie2, inst_mbinds) ->

	-- All done
    let
 	final_lie   = lie2 `plusLIE` poly_lie
	final_binds = poly_binds `ThenBinds`
		      SingleBind (NonRecBind inst_mbinds) `ThenBinds`
		      prag_binds
    in
    returnTc (prag_info_fn, (combiner final_binds thing, final_lie, thing_ty))
    )					`thenTc` \ (_, result) ->
    returnTc result
  where
    binder_names = map fst (bagToList (collectBinders bind))


tcBindAndSigs binder_names bind sigs prag_info_fn
  = recoverTc (
	-- If typechecking the binds fails, then return with each
	-- binder given type (forall a.a), to minimise subsequent
	-- error messages
	newTcTyVar mkBoxedTypeKind		`thenNF_Tc` \ alpha_tv ->
	let
	  forall_a_a = mkForAllTy alpha_tv (mkTyVarTy alpha_tv)
	  poly_ids   = [ mkUserId name forall_a_a (prag_info_fn name)
		       | name <- binder_names]
	in
	returnTc (EmptyBinds, emptyLIE, poly_ids)
    ) $

	-- Create a new identifier for each binder, with each being given
	-- a fresh unique, and a type-variable type.
    tcGetUniques no_of_binders			`thenNF_Tc` \ uniqs ->
    newTyVarTys no_of_binders kind		`thenNF_Tc` \ tys ->
    let
	mono_ids           = zipWith3Equal "tcBindAndSigs" mk_id binder_names uniqs tys
	mk_id name uniq ty = mkUserLocal (getOccName name) uniq ty (getSrcLoc name)
    in
    tcExtendLocalValEnv binder_names mono_ids (
	    tcTySigs sigs		`thenTc` \ sig_info ->
	    tc_bind bind		`thenTc` \ (bind', lie) ->
	    returnTc (bind', lie, sig_info)
    )
	    `thenTc` \ (bind', lie, sig_info) ->

	    -- Notice that genBinds gets the old (non-extended) environment
    genBinds binder_names mono_ids bind' lie sig_info prag_info_fn
  where
    no_of_binders = length binder_names
    kind = case bind of
	  	NonRecBind _ -> mkTypeKind	-- Recursive, so no unboxed types
		RecBind _    -> mkBoxedTypeKind	-- Non-recursive, so we permit unboxed types
\end{code}


===========
\begin{code}
{-

data SigInfo
  = SigInfo	Name
		(TcIdBndr s)		-- Polymorpic version
		(TcIdBndr s)		-- Monomorphic verstion
		[TcType s] [TcIdOcc s] 	-- Instance information for the monomorphic version



	-- Deal with type signatures
    tcTySigs sigs		`thenTc` \ sig_infos ->
    let
	sig_binders   = [binder      | SigInfo binder _ _ _ _  <- sig_infos]
	poly_sigs     = [(name,poly) | SigInfo name poly _ _ _ <- sig_infos]
	mono_sigs     = [(name,mono) | SigInfo name _ mono _ _ <- sig_infos]
	nosig_binders = binders `minusList` sig_binders
    in


	-- Typecheck the binding group
    tcExtendLocalEnv poly_sigs		(
    newLocalIds nosig_binders kind	(\ nosig_local_ids ->
	    tcMonoBinds mono_sigs mono_binds	`thenTc` \ binds_w_lies ->
	    returnTc (nosig_local_ids, binds_w_lies)
    ))					`thenTc` \ (nosig_local_ids, binds_w_lies) ->


	-- Decide what to generalise over
    getImplicitStuffToGen sig_ids binds_w_lies	
			`thenTc` \ (tyvars_not_to_gen, tyvars_to_gen, lie_to_gen) ->


	*** CHECK FOR UNBOXED TYVARS HERE! ***



	-- Make poly_ids for all the binders that don't have type signatures
    let
	tys_to_gen   = mkTyVarTys tyvars_to_gen
	dicts_to_gen = map instToId (bagToList lie_to_gen)
	dict_tys     = map tcIdType dicts_to_gen

	mk_poly binder local_id = mkUserId (getName binder) ty noPragmaInfo
		       where
			  ty = mkForAllTys tyvars_to_gen $
			       mkFunTys dict_tys $
			       tcIdType local_id

	more_sig_infos = [ SigInfo binder (mk_poly binder local_id) 
				   local_id tys_to_gen dicts_to_gen lie_to_gen
			 | (binder, local_id) <- zipEqual "???" nosig_binders nosig_local_ids
			 ]

	all_sig_infos = sig_infos ++ more_sig_infos	-- Contains a "signature" for each binder
    in


	-- Now generalise the bindings
    let
	-- local_binds is a bunch of bindings of the form
	--	f_mono = f_poly tyvars dicts
	-- one for each binder, f, that lacks a type signature.
	-- This bunch of bindings is put at the top of the RHS of every
	-- binding in the group, so as to bind all the f_monos.
		
	local_binds = [ (local_id, mkHsDictApp (mkHsTyApp (HsVar local_id) tys_to_gen) dicts_to_gen)
		      | local_id <- nosig_local_ids
		      ]

        find_sig lid = head [ (pid, tvs, ds, lie) 
		          | SigInfo _ pid lid' tvs ds lie, 
			    lid==lid'
			  ]

      gen_bind (bind, lie)
	= tcSimplifyWithExtraGlobals tyvars_not_to_gen tyvars_to_gen avail lie
				    `thenTc` \ (lie_free, dict_binds) ->
	  returnTc (AbsBind tyvars_to_gen_here
			    dicts
			    (zipEqual "gen_bind" local_ids poly_ids)
			    (dict_binds ++ local_binds)
			    bind,
		    lie_free)
	where
	  local_ids  = bindersOf bind
	  local_sigs = [sig | sig@(SigInfo _ _ local_id _ _) <- all_sig_infos,
			      local_id `elem` local_ids
		       ]

	  (tyvars_to_gen_here, dicts, avail) 
		= case (local_ids, sigs) of

		    ([local_id], [SigInfo _ _ _ tyvars_to_gen dicts lie])
			  -> (tyvars_to_gen, dicts, lie)

		    other -> (tyvars_to_gen, dicts, avail)
\end{code}

@getImplicitStuffToGen@ decides what type variables
and LIE to generalise over.

For a "restricted group" -- see the monomorphism restriction
for a definition -- we bind no dictionaries, and
remove from tyvars_to_gen any constrained type variables

*Don't* simplify dicts at this point, because we aren't going
to generalise over these dicts.  By the time we do simplify them
we may well know more.  For example (this actually came up)
	f :: Array Int Int
	f x = array ... xs where xs = [1,2,3,4,5]
We don't want to generate lots of (fromInt Int 1), (fromInt Int 2)
stuff.  If we simplify only at the f-binding (not the xs-binding)
we'll know that the literals are all Ints, and we can just produce
Int literals!

Find all the type variables involved in overloading, the "constrained_tyvars".
These are the ones we *aren't* going to generalise.
We must be careful about doing this:
 (a) If we fail to generalise a tyvar which is not actually
	constrained, then it will never, ever get bound, and lands
	up printed out in interface files!  Notorious example:
		instance Eq a => Eq (Foo a b) where ..
	Here, b is not constrained, even though it looks as if it is.
	Another, more common, example is when there's a Method inst in
	the LIE, whose type might very well involve non-overloaded
	type variables.
 (b) On the other hand, we mustn't generalise tyvars which are constrained,
	because we are going to pass on out the unmodified LIE, with those
	tyvars in it.  They won't be in scope if we've generalised them.

So we are careful, and do a complete simplification just to find the
constrained tyvars. We don't use any of the results, except to
find which tyvars are constrained.

\begin{code}
getImplicitStuffToGen is_restricted sig_ids binds_w_lies
  | isUnRestrictedGroup tysig_vars bind
  = tcSimplify tyvars_to_gen lie	`thenTc` \ (_, _, dicts_to_gen) ->
    returnNF_Tc (emptyTyVarSet, tyvars_to_gen, dicts_to_gen)

  | otherwise
  = tcSimplify tyvars_to_gen lie	    `thenTc` \ (_, _, constrained_dicts) ->
     let
	  -- ASSERT: dicts_sig is already zonked!
	  constrained_tyvars    = foldBag unionTyVarSets tyVarsOfInst emptyTyVarSet constrained_dicts
	  reduced_tyvars_to_gen = tyvars_to_gen `minusTyVarSet` constrained_tyvars
     in
     returnTc (constrained_tyvars, reduced_tyvars_to_gen, emptyLIE)

  where
    sig_vars   = [sig_var | (TySigInfo sig_var _ _ _ _) <- ty_sigs]

    (tyvars_to_gen, lie) = foldBag (\(tv1,lie2) (tv2,lie2) -> (tv1 `unionTyVarSets` tv2,
							       lie1 `plusLIE` lie2))
				    get
				    (emptyTyVarSet, emptyLIE)
				    binds_w_lies
    get (bind, lie)
      = case bindersOf bind of
	  [local_id] | local_id `in` sig_ids -> 	-- A simple binding with
							-- a type signature
			(emptyTyVarSet, emptyLIE)

	  local_ids ->					-- Complex binding or no type sig
			(foldr (unionTyVarSets . tcIdType) emptyTyVarSet local_ids, 
			 lie)
-}
\end{code}
			   


\begin{code}
tc_bind :: RenamedBind -> TcM s (TcBind s, LIE s)

tc_bind (NonRecBind mono_binds)
  = tcMonoBinds mono_binds	`thenTc` \ (mono_binds2, lie) ->
    returnTc  (NonRecBind mono_binds2, lie)

tc_bind (RecBind mono_binds)
  = tcMonoBinds mono_binds	`thenTc` \ (mono_binds2, lie) ->
    returnTc  (RecBind mono_binds2, lie)
\end{code}

\begin{code}
tcMonoBinds :: RenamedMonoBinds -> TcM s (TcMonoBinds s, LIE s)

tcMonoBinds EmptyMonoBinds = returnTc (EmptyMonoBinds, emptyLIE)

tcMonoBinds (AndMonoBinds mb1 mb2)
  = tcMonoBinds mb1		`thenTc` \ (mb1a, lie1) ->
    tcMonoBinds mb2		`thenTc` \ (mb2a, lie2) ->
    returnTc (AndMonoBinds mb1a mb2a, lie1 `plusLIE` lie2)

tcMonoBinds bind@(PatMonoBind pat grhss_and_binds locn)
  = tcAddSrcLoc locn		 $

	-- LEFT HAND SIDE
    tcPat pat	     			`thenTc` \ (pat2, lie_pat, pat_ty) ->

	-- BINDINGS AND GRHSS
    tcGRHSsAndBinds grhss_and_binds	`thenTc` \ (grhss_and_binds2, lie, grhss_ty) ->

	-- Unify the two sides
    tcAddErrCtxt (patMonoBindsCtxt bind) $
	unifyTauTy pat_ty grhss_ty			`thenTc_`

	-- RETURN
    returnTc (PatMonoBind pat2 grhss_and_binds2 locn,
	      plusLIE lie_pat lie)

tcMonoBinds (FunMonoBind name inf matches locn)
  = tcAddSrcLoc locn				$
    tcLookupLocalValueOK "tcMonoBinds" name	`thenNF_Tc` \ id ->
    tcMatchesFun name (idType id) matches	`thenTc` \ (matches', lie) ->
    returnTc (FunMonoBind (TcId id) inf matches' locn, lie)
\end{code}

%************************************************************************
%*									*
\subsection{Signatures}
%*									*
%************************************************************************

@tcSigs@ checks the signatures for validity, and returns a list of
{\em freshly-instantiated} signatures.  That is, the types are already
split up, and have fresh type variables installed.  All non-type-signature
"RenamedSigs" are ignored.

\begin{code}
tcTySigs :: [RenamedSig] -> TcM s [TcSigInfo s]

tcTySigs (Sig v ty src_loc : other_sigs)
 = tcAddSrcLoc src_loc (
	tcHsType ty			`thenTc` \ sigma_ty ->
	tcInstSigType sigma_ty		`thenNF_Tc` \ sigma_ty' ->
	let
	    (tyvars', theta', tau') = splitSigmaTy sigma_ty'
	in

	tcLookupLocalValueOK "tcSig1" v	`thenNF_Tc` \ val ->
	unifyTauTy (idType val) tau'	`thenTc_`

	returnTc (TySigInfo val tyvars' theta' tau' src_loc)
   )		`thenTc` \ sig_info1 ->

   tcTySigs other_sigs	`thenTc` \ sig_infos ->
   returnTc (sig_info1 : sig_infos)

tcTySigs (other : sigs) = tcTySigs sigs
tcTySigs []		= returnTc []
\end{code}


%************************************************************************
%*									*
\subsection{SPECIALIZE pragmas}
%*									*
%************************************************************************


@tcPragmaSigs@ munches up the "signatures" that arise through *user*
pragmas.  It is convenient for them to appear in the @[RenamedSig]@
part of a binding because then the same machinery can be used for
moving them into place as is done for type signatures.

\begin{code}
tcPragmaSigs :: [RenamedSig]			-- The pragma signatures
	     -> TcM s (Name -> PragmaInfo,	-- Maps name to the appropriate PragmaInfo
		       TcHsBinds s,
		       LIE s)

tcPragmaSigs sigs = returnTc ( \name -> NoPragmaInfo, EmptyBinds, emptyLIE )

{- 
tcPragmaSigs sigs
  = mapAndUnzip3Tc tcPragmaSig sigs	`thenTc` \ (names_w_id_infos, binds, lies) ->
    let
	name_to_info name = foldr ($) noIdInfo
				  [info_fn | (n,info_fn) <- names_w_id_infos, n==name]
    in
    returnTc (name_to_info,
	      foldr ThenBinds EmptyBinds binds,
	      foldr plusLIE emptyLIE lies)
\end{code}

Here are the easy cases for tcPragmaSigs

\begin{code}
tcPragmaSig (DeforestSig name loc)
  = returnTc ((name, addDeforestInfo DoDeforest),EmptyBinds,emptyLIE)
tcPragmaSig (InlineSig name loc)
  = returnTc ((name, addUnfoldInfo (iWantToBeINLINEd UnfoldAlways)), EmptyBinds, emptyLIE)
tcPragmaSig (MagicUnfoldingSig name string loc)
  = returnTc ((name, addUnfoldInfo (mkMagicUnfolding string)), EmptyBinds, emptyLIE)
\end{code}

The interesting case is for SPECIALISE pragmas.  There are two forms.
Here's the first form:
\begin{verbatim}
	f :: Ord a => [a] -> b -> b
	{-# SPECIALIZE f :: [Int] -> b -> b #-}
\end{verbatim}

For this we generate:
\begin{verbatim}
	f* = /\ b -> let d1 = ...
		     in f Int b d1
\end{verbatim}

where f* is a SpecPragmaId.  The **sole** purpose of SpecPragmaIds is to
retain a right-hand-side that the simplifier will otherwise discard as
dead code... the simplifier has a flag that tells it not to discard
SpecPragmaId bindings.

In this case the f* retains a call-instance of the overloaded
function, f, (including appropriate dictionaries) so that the
specialiser will subsequently discover that there's a call of @f@ at
Int, and will create a specialisation for @f@.  After that, the
binding for @f*@ can be discarded.

The second form is this:
\begin{verbatim}
	f :: Ord a => [a] -> b -> b
	{-# SPECIALIZE f :: [Int] -> b -> b = g #-}
\end{verbatim}

Here @g@ is specified as a function that implements the specialised
version of @f@.  Suppose that g has type (a->b->b); that is, g's type
is more general than that required.  For this we generate
\begin{verbatim}
	f@Int = /\b -> g Int b
	f* = f@Int
\end{verbatim}

Here @f@@Int@ is a SpecId, the specialised version of @f@.  It inherits
f's export status etc.  @f*@ is a SpecPragmaId, as before, which just serves
to prevent @f@@Int@ from being discarded prematurely.  After specialisation,
if @f@@Int@ is going to be used at all it will be used explicitly, so the simplifier can
discard the f* binding.

Actually, there is really only point in giving a SPECIALISE pragma on exported things,
and the simplifer won't discard SpecIds for exporte things anyway, so maybe this is
a bit of overkill.

\begin{code}
tcPragmaSig (SpecSig name poly_ty maybe_spec_name src_loc)
  = tcAddSrcLoc src_loc		 		$
    tcAddErrCtxt (valSpecSigCtxt name spec_ty)	$

	-- Get and instantiate its alleged specialised type
    tcHsType poly_ty				`thenTc` \ sig_sigma ->
    tcInstSigType  sig_sigma			`thenNF_Tc` \ sig_ty ->
    let
	(sig_tyvars, sig_theta, sig_tau) = splitSigmaTy sig_ty
	origin = ValSpecOrigin name
    in

	-- Check that the SPECIALIZE pragma had an empty context
    checkTc (null sig_theta)
	    (panic "SPECIALIZE non-empty context (ToDo: msg)") `thenTc_`

	-- Get and instantiate the type of the id mentioned
    tcLookupLocalValueOK "tcPragmaSig" name	`thenNF_Tc` \ main_id ->
    tcInstSigType [] (idType main_id)		`thenNF_Tc` \ main_ty ->
    let
	(main_tyvars, main_rho) = splitForAllTy main_ty
	(main_theta,main_tau)   = splitRhoTy main_rho
	main_arg_tys	        = mkTyVarTys main_tyvars
    in

	-- Check that the specialised type is indeed an instance of
	-- the type of the main function.
    unifyTauTy sig_tau main_tau		`thenTc_`
    checkSigTyVars sig_tyvars sig_tau	`thenTc_`

	-- Check that the type variables of the polymorphic function are
	-- either left polymorphic, or instantiate to ground type.
	-- Also check that the overloaded type variables are instantiated to
	-- ground type; or equivalently that all dictionaries have ground type
    mapTc zonkTcType main_arg_tys	`thenNF_Tc` \ main_arg_tys' ->
    zonkTcThetaType main_theta		`thenNF_Tc` \ main_theta' ->
    tcAddErrCtxt (specGroundnessCtxt main_arg_tys')
	      (checkTc (all isGroundOrTyVarTy main_arg_tys'))      	`thenTc_`
    tcAddErrCtxt (specContextGroundnessCtxt main_theta')
	      (checkTc (and [isGroundTy ty | (_,ty) <- theta']))	`thenTc_`

	-- Build the SpecPragmaId; it is the thing that makes sure we
	-- don't prematurely dead-code-eliminate the binding we are really interested in.
    newSpecPragmaId name sig_ty		`thenNF_Tc` \ spec_pragma_id ->

	-- Build a suitable binding; depending on whether we were given
	-- a value (Maybe Name) to be used as the specialisation.
    case using of
      Nothing ->		-- No implementation function specified

		-- Make a Method inst for the occurrence of the overloaded function
	newMethodWithGivenTy (OccurrenceOf name)
		  (TcId main_id) main_arg_tys main_rho	`thenNF_Tc` \ (lie, meth_id) ->

	let
	    pseudo_bind = VarMonoBind spec_pragma_id pseudo_rhs
	    pseudo_rhs  = mkHsTyLam sig_tyvars (HsVar (TcId meth_id))
	in
	returnTc (pseudo_bind, lie, \ info -> info)

      Just spec_name ->		-- Use spec_name as the specialisation value ...

		-- Type check a simple occurrence of the specialised Id
	tcId spec_name		`thenTc` \ (spec_body, spec_lie, spec_tau) ->

		-- Check that it has the correct type, and doesn't constrain the
		-- signature variables at all
	unifyTauTy sig_tau spec_tau   	 	`thenTc_`
	checkSigTyVars sig_tyvars sig_tau	`thenTc_`

	    -- Make a local SpecId to bind to applied spec_id
	newSpecId main_id main_arg_tys sig_ty	`thenNF_Tc` \ local_spec_id ->

	let
	    spec_rhs   = mkHsTyLam sig_tyvars spec_body
	    spec_binds = VarMonoBind local_spec_id spec_rhs
			   `AndMonoBinds`
	   		 VarMonoBind spec_pragma_id (HsVar (TcId local_spec_id))
	    spec_info  = SpecInfo spec_tys (length main_theta) local_spec_id
	in
	returnTc ((name, addSpecInfo spec_info), spec_binds, spec_lie)
-}
\end{code}


%************************************************************************
%*									*
\subsection[TcBinds-monomorphism]{The monomorphism restriction}
%*									*
%************************************************************************

Not exported:

\begin{code}
{-	 In GenSpec at the moment

isUnRestrictedGroup :: [TcIdBndr s]		-- Signatures given for these
		    -> TcBind s
		    -> Bool

isUnRestrictedGroup sigs EmptyBind              = True
isUnRestrictedGroup sigs (NonRecBind monobinds) = isUnResMono sigs monobinds
isUnRestrictedGroup sigs (RecBind monobinds)    = isUnResMono sigs monobinds

is_elem v vs = isIn "isUnResMono" v vs

isUnResMono sigs (PatMonoBind (VarPat (TcId v)) _ _)	= v `is_elem` sigs
isUnResMono sigs (PatMonoBind other      _ _)		= False
isUnResMono sigs (VarMonoBind (TcId v) _)		= v `is_elem` sigs
isUnResMono sigs (FunMonoBind _ _ _ _)			= True
isUnResMono sigs (AndMonoBinds mb1 mb2)			= isUnResMono sigs mb1 &&
							  isUnResMono sigs mb2
isUnResMono sigs EmptyMonoBinds				= True
-}
\end{code}


%************************************************************************
%*									*
\subsection[TcBinds-errors]{Error contexts and messages}
%*									*
%************************************************************************


\begin{code}
patMonoBindsCtxt bind sty
  = ppHang (ppPStr SLIT("In a pattern binding:")) 4 (ppr sty bind)

--------------------------------------------
specContextGroundnessCtxt -- err_ctxt dicts sty
  = panic "specContextGroundnessCtxt"
{-
  = ppHang (
    	ppSep [ppBesides [ppStr "In the SPECIALIZE pragma for `", ppr sty name, ppStr "'"],
	       ppBesides [ppStr " specialised to the type `", ppr sty spec_ty,  ppStr "'"],
	       pp_spec_id sty,
	       ppStr "... not all overloaded type variables were instantiated",
	       ppStr "to ground types:"])
      4 (ppAboves [ppCat [ppr sty c, ppr sty t]
		  | (c,t) <- map getDictClassAndType dicts])
  where
    (name, spec_ty, locn, pp_spec_id)
      = case err_ctxt of
	  ValSpecSigCtxt    n ty loc      -> (n, ty, loc, \ x -> ppNil)
	  ValSpecSpecIdCtxt n ty spec loc ->
	    (n, ty, loc,
	     \ sty -> ppBesides [ppStr "... type of explicit id `", ppr sty spec, ppStr "'"])
-}

-----------------------------------------------
specGroundnessCtxt
  = panic "specGroundnessCtxt"


valSpecSigCtxt v ty sty
  = ppHang (ppPStr SLIT("In a SPECIALIZE pragma for a value:"))
	 4 (ppSep [ppBeside (pprNonSym sty v) (ppPStr SLIT(" ::")),
		  ppr sty ty])
\end{code}