[project @ 2003-04-10 15:46:11 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / Inst.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[Inst]{The @Inst@ type: dictionaries or method instances}
5
6 \begin{code}
7 module Inst ( 
8         LIE, emptyLIE, unitLIE, plusLIE, consLIE, 
9         plusLIEs, mkLIE, isEmptyLIE, lieToList, listToLIE,
10         showLIE,
11
12         Inst, 
13         pprInst, pprInsts, pprInstsInFull, tidyInsts, tidyMoreInsts,
14
15         newDictsFromOld, newDicts, cloneDict, 
16         newOverloadedLit, newIPDict, 
17         newMethod, newMethodFromName, newMethodWithGivenTy, 
18         tcInstClassOp, tcInstCall, tcInstDataCon, tcSyntaxName,
19
20         tyVarsOfInst, tyVarsOfInsts, tyVarsOfLIE, 
21         ipNamesOfInst, ipNamesOfInsts, fdPredsOfInst, fdPredsOfInsts,
22         instLoc, getDictClassTys, dictPred,
23
24         lookupInst, LookupInstResult(..),
25
26         isDict, isClassDict, isMethod, 
27         isLinearInst, linearInstType, isIPDict, isInheritableInst,
28         isTyVarDict, isStdClassTyVarDict, isMethodFor, 
29         instBindingRequired, instCanBeGeneralised,
30
31         zonkInst, zonkInsts,
32         instToId, instName,
33
34         InstOrigin(..), InstLoc(..), pprInstLoc
35     ) where
36
37 #include "HsVersions.h"
38
39 import {-# SOURCE #-}   TcExpr( tcExpr )
40
41 import HsSyn    ( HsLit(..), HsOverLit(..), HsExpr(..) )
42 import TcHsSyn  ( TcExpr, TcId, TcIdSet, 
43                   mkHsTyApp, mkHsDictApp, mkHsConApp, zonkId,
44                   mkCoercion, ExprCoFn
45                 )
46 import TcRnMonad
47 import TcEnv    ( tcGetInstEnv, tcLookupId, tcLookupTyCon, checkWellStaged, topIdLvl )
48 import InstEnv  ( InstLookupResult(..), lookupInstEnv )
49 import TcMType  ( zonkTcType, zonkTcTypes, zonkTcPredType, zapToType,
50                   zonkTcThetaType, tcInstTyVar, tcInstType, tcInstTyVars
51                 )
52 import TcType   ( Type, TcType, TcThetaType, TcTyVarSet,
53                   SourceType(..), PredType, TyVarDetails(VanillaTv),
54                   tcSplitForAllTys, tcSplitForAllTys, mkTyConApp,
55                   tcSplitPhiTy, mkGenTyConApp,
56                   isIntTy,isFloatTy, isIntegerTy, isDoubleTy,
57                   tcIsTyVarTy, mkPredTy, mkTyVarTy, mkTyVarTys,
58                   tyVarsOfType, tyVarsOfTypes, tyVarsOfPred, tidyPred,
59                   isClassPred, isTyVarClassPred, isLinearPred, predHasFDs,
60                   getClassPredTys, getClassPredTys_maybe, mkPredName,
61                   isInheritablePred, isIPPred, 
62                   tidyType, tidyTypes, tidyFreeTyVars, tcSplitSigmaTy
63                 )
64 import CoreFVs  ( idFreeTyVars )
65 import DataCon  ( DataCon,dataConSig )
66 import Id       ( Id, idName, idType, mkUserLocal, mkSysLocal, mkLocalId, setIdUnique )
67 import PrelInfo ( isStandardClass, isCcallishClass, isNoDictClass )
68 import Name     ( Name, mkMethodOcc, getOccName )
69 import PprType  ( pprPred, pprParendType )      
70 import Subst    ( substTy, substTyWith, substTheta, mkTyVarSubst )
71 import Literal  ( inIntRange )
72 import Var      ( TyVar )
73 import VarEnv   ( TidyEnv, emptyTidyEnv, lookupSubstEnv, SubstResult(..) )
74 import VarSet   ( elemVarSet, emptyVarSet, unionVarSet )
75 import TysWiredIn ( floatDataCon, doubleDataCon )
76 import PrelNames( fromIntegerName, fromRationalName, rationalTyConName )
77 import BasicTypes( IPName(..), mapIPName, ipNameName )
78 import UniqSupply( uniqsFromSupply )
79 import Outputable
80 \end{code}
81
82
83 Selection
84 ~~~~~~~~~
85 \begin{code}
86 instName :: Inst -> Name
87 instName inst = idName (instToId inst)
88
89 instToId :: Inst -> TcId
90 instToId (Dict id _ _)         = id
91 instToId (Method id _ _ _ _ _) = id
92 instToId (LitInst id _ _ _)    = id
93
94 instLoc (Dict _ _         loc) = loc
95 instLoc (Method _ _ _ _ _ loc) = loc
96 instLoc (LitInst _ _ _    loc) = loc
97
98 dictPred (Dict _ pred _ ) = pred
99 dictPred inst             = pprPanic "dictPred" (ppr inst)
100
101 getDictClassTys (Dict _ pred _) = getClassPredTys pred
102
103 -- fdPredsOfInst is used to get predicates that contain functional 
104 -- dependencies; i.e. should participate in improvement
105 fdPredsOfInst (Dict _ pred _) | predHasFDs pred = [pred]
106                               | otherwise       = []
107 fdPredsOfInst (Method _ _ _ theta _ _) = filter predHasFDs theta
108 fdPredsOfInst other                    = []
109
110 fdPredsOfInsts :: [Inst] -> [PredType]
111 fdPredsOfInsts insts = concatMap fdPredsOfInst insts
112
113 isInheritableInst (Dict _ pred _)          = isInheritablePred pred
114 isInheritableInst (Method _ _ _ theta _ _) = all isInheritablePred theta
115 isInheritableInst other                    = True
116
117
118 ipNamesOfInsts :: [Inst] -> [Name]
119 ipNamesOfInst  :: Inst   -> [Name]
120 -- Get the implicit parameters mentioned by these Insts
121 -- NB: ?x and %x get different Names
122 ipNamesOfInsts insts = [n | inst <- insts, n <- ipNamesOfInst inst]
123
124 ipNamesOfInst (Dict _ (IParam n _) _)  = [ipNameName n]
125 ipNamesOfInst (Method _ _ _ theta _ _) = [ipNameName n | IParam n _ <- theta]
126 ipNamesOfInst other                    = []
127
128 tyVarsOfInst :: Inst -> TcTyVarSet
129 tyVarsOfInst (LitInst _ _ ty _)      = tyVarsOfType  ty
130 tyVarsOfInst (Dict _ pred _)         = tyVarsOfPred pred
131 tyVarsOfInst (Method _ id tys _ _ _) = tyVarsOfTypes tys `unionVarSet` idFreeTyVars id
132                                          -- The id might have free type variables; in the case of
133                                          -- locally-overloaded class methods, for example
134
135
136 tyVarsOfInsts insts = foldr (unionVarSet . tyVarsOfInst) emptyVarSet insts
137 tyVarsOfLIE   lie   = tyVarsOfInsts (lieToList lie)
138 \end{code}
139
140 Predicates
141 ~~~~~~~~~~
142 \begin{code}
143 isDict :: Inst -> Bool
144 isDict (Dict _ _ _) = True
145 isDict other        = False
146
147 isClassDict :: Inst -> Bool
148 isClassDict (Dict _ pred _) = isClassPred pred
149 isClassDict other           = False
150
151 isTyVarDict :: Inst -> Bool
152 isTyVarDict (Dict _ pred _) = isTyVarClassPred pred
153 isTyVarDict other           = False
154
155 isIPDict :: Inst -> Bool
156 isIPDict (Dict _ pred _) = isIPPred pred
157 isIPDict other           = False
158
159 isMethod :: Inst -> Bool
160 isMethod (Method _ _ _ _ _ _) = True
161 isMethod other                = False
162
163 isMethodFor :: TcIdSet -> Inst -> Bool
164 isMethodFor ids (Method uniq id tys _ _ loc) = id `elemVarSet` ids
165 isMethodFor ids inst                         = False
166
167 isLinearInst :: Inst -> Bool
168 isLinearInst (Dict _ pred _) = isLinearPred pred
169 isLinearInst other           = False
170         -- We never build Method Insts that have
171         -- linear implicit paramters in them.
172         -- Hence no need to look for Methods
173         -- See TcExpr.tcId 
174
175 linearInstType :: Inst -> TcType        -- %x::t  -->  t
176 linearInstType (Dict _ (IParam _ ty) _) = ty
177
178
179 isStdClassTyVarDict (Dict _ pred _) = case getClassPredTys_maybe pred of
180                                         Just (clas, [ty]) -> isStandardClass clas && tcIsTyVarTy ty
181                                         other             -> False
182 \end{code}
183
184 Two predicates which deal with the case where class constraints don't
185 necessarily result in bindings.  The first tells whether an @Inst@
186 must be witnessed by an actual binding; the second tells whether an
187 @Inst@ can be generalised over.
188
189 \begin{code}
190 instBindingRequired :: Inst -> Bool
191 instBindingRequired (Dict _ (ClassP clas _) _) = not (isNoDictClass clas)
192 instBindingRequired other                      = True
193
194 instCanBeGeneralised :: Inst -> Bool
195 instCanBeGeneralised (Dict _ (ClassP clas _) _) = not (isCcallishClass clas)
196 instCanBeGeneralised other                      = True
197 \end{code}
198
199
200 %************************************************************************
201 %*                                                                      *
202 \subsection{Building dictionaries}
203 %*                                                                      *
204 %************************************************************************
205
206 \begin{code}
207 newDicts :: InstOrigin
208          -> TcThetaType
209          -> TcM [Inst]
210 newDicts orig theta
211   = getInstLoc orig             `thenM` \ loc ->
212     newDictsAtLoc loc theta
213
214 cloneDict :: Inst -> TcM Inst
215 cloneDict (Dict id ty loc) = newUnique  `thenM` \ uniq ->
216                              returnM (Dict (setIdUnique id uniq) ty loc)
217
218 newDictsFromOld :: Inst -> TcThetaType -> TcM [Inst]
219 newDictsFromOld (Dict _ _ loc) theta = newDictsAtLoc loc theta
220
221 -- Local function, similar to newDicts, 
222 -- but with slightly different interface
223 newDictsAtLoc :: InstLoc
224               -> TcThetaType
225               -> TcM [Inst]
226 newDictsAtLoc inst_loc theta
227   = newUniqueSupply             `thenM` \ us ->
228     returnM (zipWith mk_dict (uniqsFromSupply us) theta)
229   where
230     mk_dict uniq pred = Dict (mkLocalId (mkPredName uniq loc pred) (mkPredTy pred))
231                              pred inst_loc
232     loc = instLocSrcLoc inst_loc
233
234 -- For vanilla implicit parameters, there is only one in scope
235 -- at any time, so we used to use the name of the implicit parameter itself
236 -- But with splittable implicit parameters there may be many in 
237 -- scope, so we make up a new name.
238 newIPDict :: InstOrigin -> IPName Name -> Type 
239           -> TcM (IPName Id, Inst)
240 newIPDict orig ip_name ty
241   = getInstLoc orig                     `thenM` \ inst_loc@(InstLoc _ loc _) ->
242     newUnique                           `thenM` \ uniq ->
243     let
244         pred = IParam ip_name ty
245         id   = mkLocalId (mkPredName uniq loc pred) (mkPredTy pred)
246     in
247     returnM (mapIPName (\n -> id) ip_name, Dict id pred inst_loc)
248 \end{code}
249
250
251
252 %************************************************************************
253 %*                                                                      *
254 \subsection{Building methods (calls of overloaded functions)}
255 %*                                                                      *
256 %************************************************************************
257
258
259 \begin{code}
260 tcInstCall :: InstOrigin  -> TcType -> TcM (ExprCoFn, TcType)
261 tcInstCall orig fun_ty  -- fun_ty is usually a sigma-type
262   = tcInstType VanillaTv fun_ty `thenM` \ (tyvars, theta, tau) ->
263     newDicts orig theta         `thenM` \ dicts ->
264     extendLIEs dicts            `thenM_`
265     let
266         inst_fn e = mkHsDictApp (mkHsTyApp e (mkTyVarTys tyvars)) (map instToId dicts)
267     in
268     returnM (mkCoercion inst_fn, tau)
269
270 tcInstDataCon :: InstOrigin -> DataCon
271               -> TcM ([TcType], -- Types to instantiate at
272                       [Inst],   -- Existential dictionaries to apply to
273                       [TcType], -- Argument types of constructor
274                       TcType,   -- Result type
275                       [TyVar])  -- Existential tyvars
276 tcInstDataCon orig data_con
277   = let 
278         (tvs, stupid_theta, ex_tvs, ex_theta, arg_tys, tycon) = dataConSig data_con
279              -- We generate constraints for the stupid theta even when 
280              -- pattern matching (as the Report requires)
281     in
282     tcInstTyVars VanillaTv (tvs ++ ex_tvs)      `thenM` \ (all_tvs', ty_args', tenv) ->
283     let
284         stupid_theta' = substTheta tenv stupid_theta
285         ex_theta'     = substTheta tenv ex_theta
286         arg_tys'      = map (substTy tenv) arg_tys
287
288         n_normal_tvs  = length tvs
289         ex_tvs'       = drop n_normal_tvs all_tvs'
290         result_ty     = mkTyConApp tycon (take n_normal_tvs ty_args')
291     in
292     newDicts orig stupid_theta' `thenM` \ stupid_dicts ->
293     newDicts orig ex_theta'     `thenM` \ ex_dicts ->
294
295         -- Note that we return the stupid theta *only* in the LIE;
296         -- we don't otherwise use it at all
297     extendLIEs stupid_dicts     `thenM_`
298
299     returnM (ty_args', ex_dicts, arg_tys', result_ty, ex_tvs')
300
301 newMethodFromName :: InstOrigin -> TcType -> Name -> TcM TcId
302 newMethodFromName origin ty name
303   = tcLookupId name             `thenM` \ id ->
304         -- Use tcLookupId not tcLookupGlobalId; the method is almost
305         -- always a class op, but with -fno-implicit-prelude GHC is
306         -- meant to find whatever thing is in scope, and that may
307         -- be an ordinary function. 
308     getInstLoc origin           `thenM` \ loc ->
309     tcInstClassOp loc id [ty]   `thenM` \ inst ->
310     extendLIE inst              `thenM_`
311     returnM (instToId inst)
312
313 newMethodWithGivenTy orig id tys theta tau
314   = getInstLoc orig                     `thenM` \ loc ->
315     newMethod loc id tys theta tau      `thenM` \ inst ->
316     extendLIE inst                      `thenM_`
317     returnM (instToId inst)
318
319 --------------------------------------------
320 -- tcInstClassOp, and newMethod do *not* drop the 
321 -- Inst into the LIE; they just returns the Inst
322 -- This is important because they are used by TcSimplify
323 -- to simplify Insts
324
325 tcInstClassOp :: InstLoc -> Id -> [TcType] -> TcM Inst
326 tcInstClassOp inst_loc sel_id tys
327   = let
328         (tyvars,rho) = tcSplitForAllTys (idType sel_id)
329         rho_ty       = ASSERT( length tyvars == length tys )
330                        substTyWith tyvars tys rho
331         (preds,tau)  = tcSplitPhiTy rho_ty
332     in
333     newMethod inst_loc sel_id tys preds tau
334
335 ---------------------------
336 newMethod inst_loc id tys theta tau
337   = newUnique           `thenM` \ new_uniq ->
338     let
339         meth_id = mkUserLocal (mkMethodOcc (getOccName id)) new_uniq tau loc
340         inst    = Method meth_id id tys theta tau inst_loc
341         loc     = instLocSrcLoc inst_loc
342     in
343     returnM inst
344 \end{code}
345
346 In newOverloadedLit we convert directly to an Int or Integer if we
347 know that's what we want.  This may save some time, by not
348 temporarily generating overloaded literals, but it won't catch all
349 cases (the rest are caught in lookupInst).
350
351 \begin{code}
352 newOverloadedLit :: InstOrigin
353                  -> HsOverLit
354                  -> TcType
355                  -> TcM TcExpr
356 newOverloadedLit orig lit expected_ty
357   = zapToType expected_ty       `thenM_` 
358         -- The expected type might be a 'hole' type variable, 
359         -- in which case we must zap it to an ordinary type variable
360     new_over_lit orig lit expected_ty
361
362 new_over_lit orig lit@(HsIntegral i fi) expected_ty
363   | fi /= fromIntegerName       -- Do not generate a LitInst for rebindable
364                                 -- syntax.  Reason: tcSyntaxName does unification
365                                 -- which is very inconvenient in tcSimplify
366   = tcSyntaxName orig expected_ty fromIntegerName fi    `thenM` \ (expr, _) ->
367     returnM (HsApp expr (HsLit (HsInteger i)))
368
369   | Just expr <- shortCutIntLit i expected_ty 
370   = returnM expr
371
372   | otherwise
373   = newLitInst orig lit expected_ty
374
375 new_over_lit orig lit@(HsFractional r fr) expected_ty
376   | fr /= fromRationalName      -- c.f. HsIntegral case
377   = tcSyntaxName orig expected_ty fromRationalName fr   `thenM` \ (expr, _) ->
378     mkRatLit r                                          `thenM` \ rat_lit ->
379     returnM (HsApp expr rat_lit)
380
381   | Just expr <- shortCutFracLit r expected_ty 
382   = returnM expr
383
384   | otherwise
385   = newLitInst orig lit expected_ty
386
387 newLitInst orig lit expected_ty
388   = getInstLoc orig             `thenM` \ loc ->
389     newUnique                   `thenM` \ new_uniq ->
390     let
391         lit_inst = LitInst lit_id lit expected_ty loc
392         lit_id   = mkSysLocal FSLIT("lit") new_uniq expected_ty
393     in
394     extendLIE lit_inst          `thenM_`
395     returnM (HsVar (instToId lit_inst))
396
397 shortCutIntLit :: Integer -> TcType -> Maybe TcExpr
398 shortCutIntLit i ty
399   | isIntTy ty && inIntRange i                  -- Short cut for Int
400   = Just (HsLit (HsInt i))
401   | isIntegerTy ty                              -- Short cut for Integer
402   = Just (HsLit (HsInteger i))
403   | otherwise = Nothing
404
405 shortCutFracLit :: Rational -> TcType -> Maybe TcExpr
406 shortCutFracLit f ty
407   | isFloatTy ty 
408   = Just (mkHsConApp floatDataCon [] [HsLit (HsFloatPrim f)])
409   | isDoubleTy ty
410   = Just (mkHsConApp doubleDataCon [] [HsLit (HsDoublePrim f)])
411   | otherwise = Nothing
412
413 mkRatLit :: Rational -> TcM TcExpr
414 mkRatLit r
415   = tcLookupTyCon rationalTyConName                     `thenM` \ rat_tc ->
416     let
417         rational_ty  = mkGenTyConApp rat_tc []
418     in
419     returnM (HsLit (HsRat r rational_ty))
420 \end{code}
421
422
423 %************************************************************************
424 %*                                                                      *
425 \subsection{Zonking}
426 %*                                                                      *
427 %************************************************************************
428
429 Zonking makes sure that the instance types are fully zonked,
430 but doesn't do the same for any of the Ids in an Inst.  There's no
431 need, and it's a lot of extra work.
432
433 \begin{code}
434 zonkInst :: Inst -> TcM Inst
435 zonkInst (Dict id pred loc)
436   = zonkTcPredType pred                 `thenM` \ new_pred ->
437     returnM (Dict id new_pred loc)
438
439 zonkInst (Method m id tys theta tau loc) 
440   = zonkId id                   `thenM` \ new_id ->
441         -- Essential to zonk the id in case it's a local variable
442         -- Can't use zonkIdOcc because the id might itself be
443         -- an InstId, in which case it won't be in scope
444
445     zonkTcTypes tys             `thenM` \ new_tys ->
446     zonkTcThetaType theta       `thenM` \ new_theta ->
447     zonkTcType tau              `thenM` \ new_tau ->
448     returnM (Method m new_id new_tys new_theta new_tau loc)
449
450 zonkInst (LitInst id lit ty loc)
451   = zonkTcType ty                       `thenM` \ new_ty ->
452     returnM (LitInst id lit new_ty loc)
453
454 zonkInsts insts = mappM zonkInst insts
455 \end{code}
456
457
458 %************************************************************************
459 %*                                                                      *
460 \subsection{Printing}
461 %*                                                                      *
462 %************************************************************************
463
464 ToDo: improve these pretty-printing things.  The ``origin'' is really only
465 relevant in error messages.
466
467 \begin{code}
468 instance Outputable Inst where
469     ppr inst = pprInst inst
470
471 pprInsts :: [Inst] -> SDoc
472 pprInsts insts  = parens (sep (punctuate comma (map pprInst insts)))
473
474 pprInstsInFull insts
475   = vcat (map go insts)
476   where
477     go inst = sep [quotes (ppr inst), nest 2 (pprInstLoc (instLoc inst))]
478
479 pprInst (LitInst u lit ty loc)
480   = hsep [ppr lit, ptext SLIT("at"), ppr ty, show_uniq u]
481
482 pprInst (Dict u pred loc) = pprPred pred <+> show_uniq u
483
484 pprInst m@(Method u id tys theta tau loc)
485   = hsep [ppr id, ptext SLIT("at"), 
486           brackets (sep (map pprParendType tys)) {- ,
487           ptext SLIT("theta"), ppr theta,
488           ptext SLIT("tau"), ppr tau
489           show_uniq u,
490           ppr (instToId m) -}]
491
492 show_uniq u = ifPprDebug (text "{-" <> ppr u <> text "-}")
493
494 tidyInst :: TidyEnv -> Inst -> Inst
495 tidyInst env (LitInst u lit ty loc)          = LitInst u lit (tidyType env ty) loc
496 tidyInst env (Dict u pred loc)               = Dict u (tidyPred env pred) loc
497 tidyInst env (Method u id tys theta tau loc) = Method u id (tidyTypes env tys) theta tau loc
498
499 tidyMoreInsts :: TidyEnv -> [Inst] -> (TidyEnv, [Inst])
500 -- This function doesn't assume that the tyvars are in scope
501 -- so it works like tidyOpenType, returning a TidyEnv
502 tidyMoreInsts env insts
503   = (env', map (tidyInst env') insts)
504   where
505     env' = tidyFreeTyVars env (tyVarsOfInsts insts)
506
507 tidyInsts :: [Inst] -> (TidyEnv, [Inst])
508 tidyInsts insts = tidyMoreInsts emptyTidyEnv insts
509
510 showLIE :: SDoc -> TcM ()       -- Debugging
511 showLIE str
512   = do { lie_var <- getLIEVar ;
513          lie <- readMutVar lie_var ;
514          traceTc (str <+> pprInstsInFull (lieToList lie)) }
515 \end{code}
516
517
518 %************************************************************************
519 %*                                                                      *
520 \subsection{Looking up Insts}
521 %*                                                                      *
522 %************************************************************************
523
524 \begin{code}
525 data LookupInstResult s
526   = NoInstance
527   | SimpleInst TcExpr           -- Just a variable, type application, or literal
528   | GenInst    [Inst] TcExpr    -- The expression and its needed insts
529
530 lookupInst :: Inst -> TcM (LookupInstResult s)
531 -- It's important that lookupInst does not put any new stuff into
532 -- the LIE.  Instead, any Insts needed by the lookup are returned in
533 -- the LookupInstResult, where they can be further processed by tcSimplify
534
535
536 -- Dictionaries
537 lookupInst dict@(Dict _ pred@(ClassP clas tys) loc)
538   = getDOpts                    `thenM` \ dflags ->
539     tcGetInstEnv                `thenM` \ inst_env ->
540     case lookupInstEnv dflags inst_env clas tys of
541
542       FoundInst tenv dfun_id
543         ->      -- It's possible that not all the tyvars are in
544                 -- the substitution, tenv. For example:
545                 --      instance C X a => D X where ...
546                 -- (presumably there's a functional dependency in class C)
547                 -- Hence the mk_ty_arg to instantiate any un-substituted tyvars.        
548            getStage                                             `thenM` \ use_stage ->
549            checkWellStaged (ptext SLIT("instance for") <+> quotes (ppr pred))
550                            (topIdLvl dfun_id) use_stage         `thenM_`
551            traceTc (text "lookupInst" <+> ppr dfun_id <+> ppr (topIdLvl dfun_id) <+> ppr use_stage) `thenM_`
552            let
553                 (tyvars, rho) = tcSplitForAllTys (idType dfun_id)
554                 mk_ty_arg tv  = case lookupSubstEnv tenv tv of
555                                    Just (DoneTy ty) -> returnM ty
556                                    Nothing          -> tcInstTyVar VanillaTv tv `thenM` \ tc_tv ->
557                                                        returnM (mkTyVarTy tc_tv)
558            in
559            mappM mk_ty_arg tyvars       `thenM` \ ty_args ->
560            let
561                 dfun_rho   = substTy (mkTyVarSubst tyvars ty_args) rho
562                 (theta, _) = tcSplitPhiTy dfun_rho
563                 ty_app     = mkHsTyApp (HsVar dfun_id) ty_args
564            in
565            if null theta then
566                 returnM (SimpleInst ty_app)
567            else
568            newDictsAtLoc loc theta      `thenM` \ dicts ->
569            let 
570                 rhs = mkHsDictApp ty_app (map instToId dicts)
571            in
572            returnM (GenInst dicts rhs)
573
574       other     -> returnM NoInstance
575
576 lookupInst (Dict _ _ _)         = returnM NoInstance
577
578 -- Methods
579
580 lookupInst inst@(Method _ id tys theta _ loc)
581   = newDictsAtLoc loc theta             `thenM` \ dicts ->
582     returnM (GenInst dicts (mkHsDictApp (mkHsTyApp (HsVar id) tys) (map instToId dicts)))
583
584 -- Literals
585
586 -- Look for short cuts first: if the literal is *definitely* a 
587 -- int, integer, float or a double, generate the real thing here.
588 -- This is essential  (see nofib/spectral/nucleic).
589 -- [Same shortcut as in newOverloadedLit, but we
590 --  may have done some unification by now]              
591
592
593 lookupInst inst@(LitInst u (HsIntegral i from_integer_name) ty loc)
594   | Just expr <- shortCutIntLit i ty
595   = returnM (GenInst [] expr)   -- GenInst, not SimpleInst, because 
596                                         -- expr may be a constructor application
597   | otherwise
598   = ASSERT( from_integer_name == fromIntegerName )      -- A LitInst invariant
599     tcLookupId fromIntegerName                  `thenM` \ from_integer ->
600     tcInstClassOp loc from_integer [ty]         `thenM` \ method_inst ->
601     returnM (GenInst [method_inst]
602                      (HsApp (HsVar (instToId method_inst)) (HsLit (HsInteger i))))
603
604
605 lookupInst inst@(LitInst u (HsFractional f from_rat_name) ty loc)
606   | Just expr <- shortCutFracLit f ty
607   = returnM (GenInst [] expr)
608
609   | otherwise
610   = ASSERT( from_rat_name == fromRationalName ) -- A LitInst invariant
611     tcLookupId fromRationalName                 `thenM` \ from_rational ->
612     tcInstClassOp loc from_rational [ty]        `thenM` \ method_inst ->
613     mkRatLit f                                  `thenM` \ rat_lit ->
614     returnM (GenInst [method_inst] (HsApp (HsVar (instToId method_inst)) rat_lit))
615 \end{code}
616
617
618
619 %************************************************************************
620 %*                                                                      *
621                 Re-mappable syntax
622 %*                                                                      *
623 %************************************************************************
624
625
626 Suppose we are doing the -fno-implicit-prelude thing, and we encounter
627 a do-expression.  We have to find (>>) in the current environment, which is
628 done by the rename. Then we have to check that it has the same type as
629 Control.Monad.(>>).  Or, more precisely, a compatible type. One 'customer' had
630 this:
631
632   (>>) :: HB m n mn => m a -> n b -> mn b
633
634 So the idea is to generate a local binding for (>>), thus:
635
636         let then72 :: forall a b. m a -> m b -> m b
637             then72 = ...something involving the user's (>>)...
638         in
639         ...the do-expression...
640
641 Now the do-expression can proceed using then72, which has exactly
642 the expected type.
643
644 In fact tcSyntaxName just generates the RHS for then72, because we only
645 want an actual binding in the do-expression case. For literals, we can 
646 just use the expression inline.
647
648 \begin{code}
649 tcSyntaxName :: InstOrigin
650              -> TcType                  -- Type to instantiate it at
651              -> Name -> Name            -- (Standard name, user name)
652              -> TcM (TcExpr, TcType)    -- Suitable expression with its type
653
654 -- NB: tcSyntaxName calls tcExpr, and hence can do unification.
655 -- So we do not call it from lookupInst, which is called from tcSimplify
656
657 tcSyntaxName orig ty std_nm user_nm
658   | std_nm == user_nm
659   = newMethodFromName orig ty std_nm    `thenM` \ id ->
660     returnM (HsVar id, idType id)
661
662   | otherwise
663   = tcLookupId std_nm           `thenM` \ std_id ->
664     let 
665         -- C.f. newMethodAtLoc
666         ([tv], _, tau)  = tcSplitSigmaTy (idType std_id)
667         tau1            = substTyWith [tv] [ty] tau
668     in
669     addErrCtxtM (syntaxNameCtxt user_nm orig tau1)      $
670     tcExpr (HsVar user_nm) tau1                         `thenM` \ user_fn ->
671     returnM (user_fn, tau1)
672
673 syntaxNameCtxt name orig ty tidy_env
674   = getInstLoc orig             `thenM` \ inst_loc ->
675     let
676         msg = vcat [ptext SLIT("When checking that") <+> quotes (ppr name) <+> 
677                                 ptext SLIT("(needed by a syntactic construct)"),
678                     nest 2 (ptext SLIT("has the required type:") <+> ppr (tidyType tidy_env ty)),
679                     nest 2 (pprInstLoc inst_loc)]
680     in
681     returnM (tidy_env, msg)
682 \end{code}