2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[TcInstDecls]{Typechecking instance declarations}
7 #include "HsVersions.h"
18 import HsSyn ( HsDecl(..), InstDecl(..), TyDecl, ClassDecl, DefaultDecl,
19 FixityDecl, IfaceSig, Sig(..),
20 SpecInstSig(..), HsBinds(..),
21 MonoBinds(..), GRHSsAndBinds(..), GRHS(..), Match,
22 InPat(..), OutPat(..), HsExpr(..), HsLit(..),
23 Stmt, DoOrListComp, ArithSeqInfo, Fake, Fixity,
25 SYN_IE(RecFlag), recursive, nonRecursive, collectMonoBinders,
28 import RnHsSyn ( SYN_IE(RenamedHsBinds), SYN_IE(RenamedMonoBinds),
29 SYN_IE(RenamedInstDecl), SYN_IE(RenamedFixityDecl), SYN_IE(RenamedHsExpr),
30 SYN_IE(RenamedSig), SYN_IE(RenamedSpecInstSig), SYN_IE(RenamedHsDecl)
32 import TcHsSyn ( TcIdOcc(..), SYN_IE(TcIdBndr), SYN_IE(TcHsBinds),
33 SYN_IE(TcMonoBinds), SYN_IE(TcExpr), tcIdType,
35 mkHsDictLam, mkHsDictApp )
37 import TcBinds ( tcBindWithSigs, tcPragmaSigs, TcSigInfo(..) )
39 import RnMonad ( SYN_IE(RnNameSupply) )
40 import Inst ( Inst, InstOrigin(..), SYN_IE(InstanceMapper),
41 instToId, newDicts, newMethod, SYN_IE(LIE), emptyLIE, plusLIE )
42 import TcBinds ( tcPragmaSigs, checkSigTyVars )
43 import PragmaInfo ( PragmaInfo(..) )
44 import TcDeriv ( tcDeriving )
45 import TcEnv ( tcLookupClass, newLocalId, tcExtendGlobalTyVars, tcGetGlobalTyVars )
46 import SpecEnv ( SpecEnv )
47 import TcGRHSs ( tcGRHSsAndBinds )
48 import TcInstUtil ( InstInfo(..), mkInstanceRelatedIds, buildInstanceEnvs )
49 import TcKind ( TcKind, unifyKind )
50 import TcMatches ( tcMatchesFun )
51 import TcMonoType ( tcTyVarScope, tcContext, tcHsTypeKind )
52 import TcSimplify ( tcSimplifyAndCheck )
53 import TcType ( SYN_IE(TcType), SYN_IE(TcTyVar), SYN_IE(TcTyVarSet),
54 tcInstSigTyVars, tcInstType, tcInstSigTcType,
55 tcInstTheta, tcInstTcType, tcInstSigType
57 import Unify ( unifyTauTy, unifyTauTyLists )
60 import Bag ( emptyBag, unitBag, unionBags, unionManyBags,
61 concatBag, foldBag, bagToList, listToBag,
63 import CmdLineOpts ( opt_GlasgowExts, opt_CompilingGhcInternals,
64 opt_OmitDefaultInstanceMethods,
65 opt_SpecialiseOverloaded
67 import Class ( GenClass, GenClassOp,
68 classBigSig, classOps, classOpLocalType,
69 classDefaultMethodId, SYN_IE(Class)
71 import Id ( GenId, idType, isDefaultMethodId_maybe, replacePragmaInfo,
72 isNullaryDataCon, dataConArgTys, SYN_IE(Id) )
73 import ListSetOps ( minusList )
74 import Maybes ( maybeToBool, expectJust, seqMaybe )
75 import Name ( nameOccName, getOccString, occNameString, moduleString,
76 isLocallyDefined, OccName, Name{--O only-}, SYN_IE(Module),
79 import PrelVals ( nO_EXPLICIT_METHOD_ERROR_ID )
80 import PprType ( GenType, GenTyVar, GenClass, GenClassOp, TyCon,
84 import SrcLoc ( SrcLoc, noSrcLoc )
86 import TyCon ( isSynTyCon, isDataTyCon, derivedClasses )
87 import Type ( GenType(..), SYN_IE(ThetaType), mkTyVarTys, isPrimType,
88 splitSigmaTy, splitAppTys, isTyVarTy, matchTy, mkSigmaTy,
89 getTyCon_maybe, maybeAppTyCon, SYN_IE(Type),
90 maybeBoxedPrimType, maybeAppDataTyCon, splitRhoTy, eqTy
92 import TyVar ( GenTyVar, SYN_IE(GenTyVarSet), tyVarSetToList,
93 mkTyVarSet, unionTyVarSets, SYN_IE(TyVar) )
94 import TysPrim ( byteArrayPrimTyCon, mutableByteArrayPrimTyCon )
95 import TysWiredIn ( stringTy )
96 import Unique ( Unique, cCallableClassKey, cReturnableClassKey )
97 import UniqFM ( Uniquable(..) )
98 import Util ( zipEqual, panic, pprPanic, pprTrace
99 #if __GLASGOW_HASKELL__ < 202
105 Typechecking instance declarations is done in two passes. The first
106 pass, made by @tcInstDecls1@, collects information to be used in the
109 This pre-processed info includes the as-yet-unprocessed bindings
110 inside the instance declaration. These are type-checked in the second
111 pass, when the class-instance envs and GVE contain all the info from
112 all the instance and value decls. Indeed that's the reason we need
113 two passes over the instance decls.
116 Here is the overall algorithm.
117 Assume that we have an instance declaration
119 instance c => k (t tvs) where b
123 $LIE_c$ is the LIE for the context of class $c$
125 $betas_bar$ is the free variables in the class method type, excluding the
128 $LIE_cop$ is the LIE constraining a particular class method
130 $tau_cop$ is the tau type of a class method
132 $LIE_i$ is the LIE for the context of instance $i$
134 $X$ is the instance constructor tycon
136 $gammas_bar$ is the set of type variables of the instance
138 $LIE_iop$ is the LIE for a particular class method instance
140 $tau_iop$ is the tau type for this instance of a class method
142 $alpha$ is the class variable
144 $LIE_cop' = LIE_cop [X gammas_bar / alpha, fresh betas_bar]$
146 $tau_cop' = tau_cop [X gammas_bar / alpha, fresh betas_bar]$
149 ToDo: Update the list above with names actually in the code.
153 First, make the LIEs for the class and instance contexts, which means
154 instantiate $thetaC [X inst_tyvars / alpha ]$, yielding LIElistC' and LIEC',
155 and make LIElistI and LIEI.
157 Then process each method in turn.
159 order the instance methods according to the ordering of the class methods
161 express LIEC' in terms of LIEI, yielding $dbinds_super$ or an error
163 Create final dictionary function from bindings generated already
165 df = lambda inst_tyvars
172 in <op1,op2,...,opn,sd1,...,sdm>
174 Here, Bop1 \ldots Bopn bind the methods op1 \ldots opn,
175 and $dbinds_super$ bind the superclass dictionaries sd1 \ldots sdm.
179 tcInstDecls1 :: [RenamedHsDecl]
180 -> Module -- module name for deriving
181 -> RnNameSupply -- for renaming derivings
182 -> TcM s (Bag InstInfo,
186 tcInstDecls1 decls mod_name rn_name_supply
187 = -- Do the ordinary instance declarations
188 mapNF_Tc (tcInstDecl1 mod_name)
189 [inst_decl | InstD inst_decl <- decls] `thenNF_Tc` \ inst_info_bags ->
191 decl_inst_info = unionManyBags inst_info_bags
193 -- Handle "derived" instances; note that we only do derivings
194 -- for things in this module; we ignore deriving decls from
195 -- interfaces! We pass fixities, because they may be used
196 -- in deriving Read and Show.
197 tcDeriving mod_name rn_name_supply decl_inst_info
198 `thenTc` \ (deriv_inst_info, deriv_binds, ddump_deriv) ->
201 full_inst_info = deriv_inst_info `unionBags` decl_inst_info
203 returnTc (full_inst_info, deriv_binds, ddump_deriv)
206 tcInstDecl1 :: Module -> RenamedInstDecl -> NF_TcM s (Bag InstInfo)
208 tcInstDecl1 mod_name (InstDecl poly_ty binds uprags (Just dfun_name) src_loc)
209 = -- Prime error recovery, set source location
210 recoverNF_Tc (returnNF_Tc emptyBag) $
211 tcAddSrcLoc src_loc $
214 tcLookupClass class_name `thenTc` \ (clas_kind, clas) ->
216 -- Typecheck the context and instance type
217 tcTyVarScope tyvar_names (\ tyvars ->
218 tcContext context `thenTc` \ theta ->
219 tcHsTypeKind inst_ty `thenTc` \ (tau_kind, tau) ->
220 unifyKind clas_kind tau_kind `thenTc_`
221 returnTc (tyvars, theta, tau)
222 ) `thenTc` \ (inst_tyvars, inst_theta, inst_tau) ->
224 -- Check for respectable instance type
225 scrutiniseInstanceType dfun_name clas inst_tau
226 `thenTc` \ (inst_tycon,arg_tys) ->
228 -- Make the dfun id and constant-method ids
229 mkInstanceRelatedIds dfun_name
230 clas inst_tyvars inst_tau inst_theta
231 `thenNF_Tc` \ (dfun_id, dfun_theta) ->
233 returnTc (unitBag (InstInfo clas inst_tyvars inst_tau inst_theta
235 binds src_loc uprags))
237 (tyvar_names, context, dict_ty) = case poly_ty of
238 HsForAllTy tvs cxt dict_ty -> (tvs, cxt, dict_ty)
239 other -> ([], [], poly_ty)
240 (class_name, inst_ty) = case dict_ty of
241 MonoDictTy cls ty -> (cls,ty)
242 other -> pprPanic "Malformed instance decl" (ppr PprDebug poly_ty)
246 %************************************************************************
248 \subsection{Type-checking instance declarations, pass 2}
250 %************************************************************************
253 tcInstDecls2 :: Bag InstInfo
254 -> NF_TcM s (LIE s, TcHsBinds s)
256 tcInstDecls2 inst_decls
257 = foldBag combine tcInstDecl2 (returnNF_Tc (emptyLIE, EmptyBinds)) inst_decls
259 combine tc1 tc2 = tc1 `thenNF_Tc` \ (lie1, binds1) ->
260 tc2 `thenNF_Tc` \ (lie2, binds2) ->
261 returnNF_Tc (lie1 `plusLIE` lie2,
262 binds1 `ThenBinds` binds2)
266 ======= New documentation starts here (Sept 92) ==============
268 The main purpose of @tcInstDecl2@ is to return a @HsBinds@ which defines
269 the dictionary function for this instance declaration. For example
271 instance Foo a => Foo [a] where
275 might generate something like
277 dfun.Foo.List dFoo_a = let op1 x = ...
283 HOWEVER, if the instance decl has no context, then it returns a
284 bigger @HsBinds@ with declarations for each method. For example
286 instance Foo [a] where
292 dfun.Foo.List a = Dict [Foo.op1.List a, Foo.op2.List a]
293 const.Foo.op1.List a x = ...
294 const.Foo.op2.List a y = ...
296 This group may be mutually recursive, because (for example) there may
297 be no method supplied for op2 in which case we'll get
299 const.Foo.op2.List a = default.Foo.op2 (dfun.Foo.List a)
301 that is, the default method applied to the dictionary at this type.
303 What we actually produce in either case is:
305 AbsBinds [a] [dfun_theta_dicts]
306 [(dfun.Foo.List, d)] ++ (maybe) [(const.Foo.op1.List, op1), ...]
307 { d = (sd1,sd2, ..., op1, op2, ...)
312 The "maybe" says that we only ask AbsBinds to make global constant methods
313 if the dfun_theta is empty.
316 For an instance declaration, say,
318 instance (C1 a, C2 b) => C (T a b) where
321 where the {\em immediate} superclasses of C are D1, D2, we build a dictionary
322 function whose type is
324 (C1 a, C2 b, D1 (T a b), D2 (T a b)) => C (T a b)
326 Notice that we pass it the superclass dictionaries at the instance type; this
327 is the ``Mark Jones optimisation''. The stuff before the "=>" here
328 is the @dfun_theta@ below.
330 First comes the easy case of a non-local instance decl.
333 tcInstDecl2 :: InstInfo -> NF_TcM s (LIE s, TcHsBinds s)
335 tcInstDecl2 (InstInfo clas inst_tyvars inst_ty
336 inst_decl_theta dfun_theta
339 | not (isLocallyDefined dfun_id)
340 = returnNF_Tc (emptyLIE, EmptyBinds)
343 -- I deleted this "optimisation" because when importing these
344 -- instance decls the renamer would look for the dfun bindings and they weren't there.
345 -- This would be fixable, but it seems simpler just to produce a tiny void binding instead,
346 -- even though it's never used.
348 -- This case deals with CCallable etc, which don't need any bindings
350 = returnNF_Tc (emptyLIE, EmptyBinds)
354 = -- Prime error recovery
355 recoverNF_Tc (returnNF_Tc (emptyLIE, EmptyBinds)) $
358 -- Get the class signature
359 tcInstSigTyVars inst_tyvars `thenNF_Tc` \ (inst_tyvars', _, tenv) ->
361 origin = InstanceDeclOrigin
363 super_classes, sc_sel_ids,
364 class_ops, op_sel_ids, defm_ids) = classBigSig clas
366 tcInstType tenv inst_ty `thenNF_Tc` \ inst_ty' ->
367 tcInstTheta tenv dfun_theta `thenNF_Tc` \ dfun_theta' ->
368 tcInstTheta tenv inst_decl_theta `thenNF_Tc` \ inst_decl_theta' ->
370 sc_theta' = super_classes `zip` repeat inst_ty'
372 -- Create dictionary Ids from the specified instance contexts.
373 newDicts origin sc_theta' `thenNF_Tc` \ (sc_dicts, sc_dict_ids) ->
374 newDicts origin dfun_theta' `thenNF_Tc` \ (dfun_arg_dicts, dfun_arg_dicts_ids) ->
375 newDicts origin inst_decl_theta' `thenNF_Tc` \ (inst_decl_dicts, _) ->
376 newDicts origin [(clas,inst_ty')] `thenNF_Tc` \ (this_dict, [this_dict_id]) ->
378 -- Now process any INLINE or SPECIALIZE pragmas for the methods
379 -- ...[NB May 97; all ignored except INLINE]
380 tcPragmaSigs uprags `thenTc` \ (prag_fn, spec_binds, spec_lie) ->
382 -- Check the method bindings
384 inst_tyvars_set' = mkTyVarSet inst_tyvars'
385 check_from_this_class (bndr, loc)
386 | nameOccName bndr `elem` sel_names = returnTc ()
387 | otherwise = recoverTc (returnTc ()) $
389 failTc (instBndrErr bndr clas)
390 sel_names = map getOccName op_sel_ids
392 mapTc check_from_this_class (bagToList (collectMonoBinders monobinds)) `thenTc_`
393 tcExtendGlobalTyVars inst_tyvars_set' (
394 mapAndUnzip3Tc (tcMethodBind (getDefmRhs clas) inst_ty' prag_fn monobinds)
395 (op_sel_ids `zip` [0..])
396 ) `thenTc` \ (method_binds_s, insts_needed_s, meth_lies_w_ids) ->
398 -- Check the overloading constraints of the methods and superclasses
400 (meth_lies, meth_ids) = unzip meth_lies_w_ids
401 avail_insts -- These insts are in scope; quite a few, eh?
402 = this_dict `plusLIE` dfun_arg_dicts `plusLIE` unionManyBags meth_lies
404 tcAddErrCtxt bindSigCtxt (
406 inst_tyvars_set' -- Local tyvars
408 (sc_dicts `unionBags`
409 unionManyBags insts_needed_s) -- Need to get defns for all these
410 ) `thenTc` \ (const_lie, super_binds) ->
412 -- Check that we *could* construct the superclass dictionaries,
413 -- even though we are *actually* going to pass the superclass dicts in;
414 -- the check ensures that the caller will never have a problem building
416 tcAddErrCtxt superClassSigCtxt (
418 inst_tyvars_set' -- Local tyvars
419 inst_decl_dicts -- The instance dictionaries available
420 sc_dicts -- The superclass dicationaries reqd
422 -- Ignore the result; we're only doing
423 -- this to make sure it can be done.
425 -- Create the result bindings
427 dict_bind = VarMonoBind this_dict_id (Dictionary sc_dict_ids meth_ids)
428 method_binds = andMonoBinds method_binds_s
435 [(inst_tyvars', RealId dfun_id, this_dict_id)]
436 (super_binds `AndMonoBinds`
437 method_binds `AndMonoBinds`
439 [] recursive -- Recursive to play safe
441 returnTc (const_lie `plusLIE` spec_lie,
442 main_bind `ThenBinds` spec_binds)
445 The next function looks for a method binding; if there isn't one it
446 manufactures one that just calls the global default method.
448 See the notes under default decls in TcClassDcl.lhs.
451 getDefmRhs :: Class -> Int -> RenamedHsExpr
452 getDefmRhs clas idx = HsVar (getName (classDefaultMethodId clas idx))
456 %************************************************************************
458 \subsection{Processing each method}
460 %************************************************************************
464 :: (Int -> RenamedHsExpr) -- Function mapping a tag to default RHS
465 -> TcType s -- Instance type
466 -> (Name -> PragmaInfo)
467 -> RenamedMonoBinds -- Method binding
468 -> (Id, Int) -- Selector ID (and its 0-indexed tag)
469 -- for which binding is wanted
470 -> TcM s (TcMonoBinds s, LIE s, (LIE s, TcIdOcc s))
472 tcMethodBind deflt_fn inst_ty prag_fn meth_binds (sel_id, idx)
473 = newMethod origin (RealId sel_id) [inst_ty] `thenNF_Tc` \ meth@(_, TcId meth_id) ->
474 tcInstSigTcType (idType meth_id) `thenNF_Tc` \ (tyvars', rho_ty') ->
476 meth_name = getName meth_id
477 default_bind = PatMonoBind (VarPatIn meth_name)
478 (GRHSsAndBindsIn [OtherwiseGRHS (deflt_fn idx) noSrcLoc] EmptyBinds)
481 (op_name, op_bind) = case go (getOccName sel_id) meth_binds of
483 Nothing -> (meth_name, default_bind)
485 (theta', tau') = splitRhoTy rho_ty'
486 meth_id_w_prags = replacePragmaInfo meth_id (prag_fn meth_name)
487 sig_info = TySigInfo op_name meth_id_w_prags tyvars' theta' tau' noSrcLoc
489 tcBindWithSigs [op_name] op_bind [sig_info]
490 nonRecursive (\_ -> NoPragmaInfo) `thenTc` \ (binds, insts, _) ->
492 returnTc (binds, insts, meth)
494 origin = InstanceDeclOrigin -- Poor
496 go occ EmptyMonoBinds = Nothing
497 go occ (AndMonoBinds b1 b2) = go occ b1 `seqMaybe` go occ b2
499 go occ b@(FunMonoBind op_name _ _ locn) | nameOccName op_name == occ = Just (op_name, b)
500 | otherwise = Nothing
501 go occ b@(PatMonoBind (VarPatIn op_name) _ locn) | nameOccName op_name == occ = Just (op_name, b)
502 | otherwise = Nothing
503 go occ other = panic "Urk! Bad instance method binding"
508 %************************************************************************
510 \subsection{Type-checking specialise instance pragmas}
512 %************************************************************************
516 tcSpecInstSigs :: E -> CE -> TCE
517 -> Bag InstInfo -- inst decls seen (declared and derived)
518 -> [RenamedSpecInstSig] -- specialise instance upragmas
519 -> TcM (Bag InstInfo) -- new, overlapped, inst decls
521 tcSpecInstSigs e ce tce inst_infos []
524 tcSpecInstSigs e ce tce inst_infos sigs
525 = buildInstanceEnvs inst_infos `thenTc` \ inst_mapper ->
526 tc_inst_spec_sigs inst_mapper sigs `thenNF_Tc` \ spec_inst_infos ->
527 returnTc spec_inst_infos
529 tc_inst_spec_sigs inst_mapper []
530 = returnNF_Tc emptyBag
531 tc_inst_spec_sigs inst_mapper (sig:sigs)
532 = tcSpecInstSig e ce tce inst_infos inst_mapper sig `thenNF_Tc` \ info_sig ->
533 tc_inst_spec_sigs inst_mapper sigs `thenNF_Tc` \ info_sigs ->
534 returnNF_Tc (info_sig `unionBags` info_sigs)
536 tcSpecInstSig :: E -> CE -> TCE
539 -> RenamedSpecInstSig
540 -> NF_TcM (Bag InstInfo)
542 tcSpecInstSig e ce tce inst_infos inst_mapper (SpecInstSig class_name ty src_loc)
543 = recoverTc emptyBag (
544 tcAddSrcLoc src_loc (
546 clas = lookupCE ce class_name -- Renamer ensures this can't fail
548 -- Make some new type variables, named as in the specialised instance type
549 ty_names = extractHsTyNames ???is_tyvarish_name??? ty
550 (tmpl_e,inst_tmpls,inst_tmpl_tys) = mkTVE ty_names
552 babyTcMtoTcM (tcInstanceType ce tce tmpl_e True src_loc ty)
553 `thenTc` \ inst_ty ->
555 maybe_tycon = case maybeAppDataTyCon inst_ty of
556 Just (tc,_,_) -> Just tc
559 maybe_unspec_inst = lookup_unspec_inst clas maybe_tycon inst_infos
561 -- Check that we have a local instance declaration to specialise
562 checkMaybeTc maybe_unspec_inst
563 (specInstUnspecInstNotFoundErr clas inst_ty src_loc) `thenTc_`
565 -- Create tvs to substitute for tmpls while simplifying the context
566 copyTyVars inst_tmpls `thenNF_Tc` \ (tv_e, inst_tvs, inst_tv_tys) ->
568 Just (InstInfo _ unspec_tyvars unspec_inst_ty unspec_theta
569 _ _ binds _ uprag) = maybe_unspec_inst
571 subst = case matchTy unspec_inst_ty inst_ty of
573 Nothing -> panic "tcSpecInstSig:matchTy"
575 subst_theta = instantiateThetaTy subst unspec_theta
576 subst_tv_theta = instantiateThetaTy tv_e subst_theta
578 mk_spec_origin clas ty
579 = InstanceSpecOrigin inst_mapper clas ty src_loc
580 -- I'm VERY SUSPICIOUS ABOUT THIS
581 -- the inst-mapper is in a knot at this point so it's no good
582 -- looking at it in tcSimplify...
584 tcSimplifyThetas mk_spec_origin subst_tv_theta
585 `thenTc` \ simpl_tv_theta ->
587 simpl_theta = [ (clas, tv_to_tmpl tv) | (clas, tv) <- simpl_tv_theta ]
589 tv_tmpl_map = zipEqual "tcSpecInstSig" inst_tv_tys inst_tmpl_tys
590 tv_to_tmpl tv = assoc "tcSpecInstSig" tv_tmpl_map tv
593 clas inst_tmpls inst_ty simpl_theta uprag
594 `thenNF_Tc` \ (dfun_id, dfun_theta, const_meth_ids) ->
596 getSwitchCheckerTc `thenNF_Tc` \ sw_chkr ->
597 (if sw_chkr SpecialiseTrace then
598 pprTrace "Specialised Instance: "
599 (vcat [hsep [if null simpl_theta then empty else ppr PprDebug simpl_theta,
600 if null simpl_theta then empty else ptext SLIT("=>"),
602 pprParendGenType PprDebug inst_ty],
603 hsep [ptext SLIT(" derived from:"),
604 if null unspec_theta then empty else ppr PprDebug unspec_theta,
605 if null unspec_theta then empty else ptext SLIT("=>"),
607 pprParendGenType PprDebug unspec_inst_ty]])
610 returnTc (unitBag (InstInfo clas inst_tmpls inst_ty simpl_theta
612 binds src_loc uprag))
616 lookup_unspec_inst clas maybe_tycon inst_infos
617 = case filter (match_info match_inst_ty) (bagToList inst_infos) of
619 (info:_) -> Just info
621 match_info match_ty (InstInfo inst_clas _ inst_ty _ _ _ _ _ from_here _ _ _)
622 = from_here && clas == inst_clas &&
623 match_ty inst_ty && is_plain_instance inst_ty
625 match_inst_ty = case maybe_tycon of
626 Just tycon -> match_tycon tycon
629 match_tycon tycon inst_ty = case (maybeAppDataTyCon inst_ty) of
630 Just (inst_tc,_,_) -> tycon == inst_tc
633 match_fun inst_ty = isFunType inst_ty
636 is_plain_instance inst_ty
637 = case (maybeAppDataTyCon inst_ty) of
638 Just (_,tys,_) -> all isTyVarTemplateTy tys
639 Nothing -> case maybeUnpackFunTy inst_ty of
640 Just (arg, res) -> isTyVarTemplateTy arg && isTyVarTemplateTy res
641 Nothing -> error "TcInstDecls:is_plain_instance"
646 Checking for a decent instance type
647 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
648 @scrutiniseInstanceType@ checks the type {\em and} its syntactic constraints:
649 it must normally look like: @instance Foo (Tycon a b c ...) ...@
651 The exceptions to this syntactic checking: (1)~if the @GlasgowExts@
652 flag is on, or (2)~the instance is imported (they must have been
653 compiled elsewhere). In these cases, we let them go through anyway.
655 We can also have instances for functions: @instance Foo (a -> b) ...@.
658 scrutiniseInstanceType dfun_name clas inst_tau
660 | not (maybeToBool inst_tycon_maybe) || isSynTyCon inst_tycon
661 = failTc (instTypeErr inst_tau)
663 -- IMPORTED INSTANCES ARE OK (but see tcInstDecl1)
664 | not (isLocallyDefined dfun_name)
665 = returnTc (inst_tycon,arg_tys)
668 | not (all isTyVarTy arg_tys ||
670 = failTc (instTypeErr inst_tau)
673 -- It is obviously illegal to have an explicit instance
674 -- for something that we are also planning to `derive'
675 -- Though we can have an explicit instance which is more
676 -- specific than the derived instance
677 | clas `elem` (derivedClasses inst_tycon)
678 && all isTyVarTy arg_tys
679 = failTc (derivingWhenInstanceExistsErr clas inst_tycon)
682 -- A user declaration of a CCallable/CReturnable instance
683 -- must be for a "boxed primitive" type.
684 (uniqueOf clas == cCallableClassKey && not (ccallable_type inst_tau)) ||
685 (uniqueOf clas == cReturnableClassKey && not (creturnable_type inst_tau))
686 = failTc (nonBoxedPrimCCallErr clas inst_tau)
689 = returnTc (inst_tycon,arg_tys)
692 (possible_tycon, arg_tys) = splitAppTys inst_tau
693 inst_tycon_maybe = getTyCon_maybe possible_tycon
694 inst_tycon = expectJust "tcInstDecls1:inst_tycon" inst_tycon_maybe
696 -- These conditions come directly from what the DsCCall is capable of.
697 -- Totally grotesque. Green card should solve this.
699 ccallable_type ty = isPrimType ty || -- Allow CCallable Int# etc
700 maybeToBool (maybeBoxedPrimType ty) || -- Ditto Int etc
701 ty `eqTy` stringTy ||
704 byte_arr_thing = case maybeAppDataTyCon ty of
705 Just (tycon, ty_args, [data_con]) | isDataTyCon tycon ->
706 length data_con_arg_tys == 2 &&
707 maybeToBool maybe_arg2_tycon &&
708 (arg2_tycon == byteArrayPrimTyCon ||
709 arg2_tycon == mutableByteArrayPrimTyCon)
711 data_con_arg_tys = dataConArgTys data_con ty_args
712 (data_con_arg_ty1 : data_con_arg_ty2 : _) = data_con_arg_tys
713 maybe_arg2_tycon = maybeAppTyCon data_con_arg_ty2
714 Just (arg2_tycon,_) = maybe_arg2_tycon
718 creturnable_type ty = maybeToBool (maybeBoxedPrimType ty) ||
719 -- Or, a data type with a single nullary constructor
720 case (maybeAppDataTyCon ty) of
721 Just (tycon, tys_applied, [data_con])
722 -> isNullaryDataCon data_con
730 SynTy tc _ _ -> hcat [ptext SLIT("The type synonym `"), ppr sty tc, rest_of_msg]
731 TyVarTy tv -> hcat [ptext SLIT("The type variable `"), ppr sty tv, rest_of_msg]
732 other -> hcat [ptext SLIT("The type `"), ppr sty ty, rest_of_msg]
734 rest_of_msg = ptext SLIT("' cannot be used as an instance type.")
736 instBndrErr bndr clas sty
737 = hsep [ptext SLIT("Class"), ppr sty clas, ptext SLIT("does not have a method"), ppr sty bndr]
739 derivingWhenInstanceExistsErr clas tycon sty
740 = hang (hsep [ptext SLIT("Deriving class"),
742 ptext SLIT("type"), ppr sty tycon])
743 4 (ptext SLIT("when an explicit instance exists"))
745 derivingWhenInstanceImportedErr inst_mod clas tycon sty
746 = hang (hsep [ptext SLIT("Deriving class"),
748 ptext SLIT("type"), ppr sty tycon])
749 4 (hsep [ptext SLIT("when an instance declared in module"),
750 pp_mod, ptext SLIT("has been imported")])
752 pp_mod = hsep [ptext SLIT("module"), ptext inst_mod]
754 nonBoxedPrimCCallErr clas inst_ty sty
755 = hang (ptext SLIT("Unacceptable instance type for ccall-ish class"))
756 4 (hsep [ ptext SLIT("class"), ppr sty clas, ptext SLIT("type"),
759 omitDefaultMethodWarn clas_op clas_name inst_ty sty
760 = hsep [ptext SLIT("Warning: Omitted default method for"),
761 ppr sty clas_op, ptext SLIT("in instance"),
762 text clas_name, pprParendGenType sty inst_ty]
764 instMethodNotInClassErr occ clas sty
765 = hang (ptext SLIT("Instance mentions a method not in the class"))
766 4 (hsep [ptext SLIT("class"), ppr sty clas, ptext SLIT("method"),
769 patMonoBindsCtxt pbind sty
770 = hang (ptext SLIT("In a pattern binding:"))
773 methodSigCtxt name ty sty
774 = hang (hsep [ptext SLIT("When matching the definition of class method"),
775 ppr sty name, ptext SLIT("to its signature :") ])
779 = ptext SLIT("When checking methods of an instance declaration")
781 superClassSigCtxt sty
782 = ptext SLIT("When checking superclass constraints of an instance declaration")