[project @ 1998-04-07 16:40:08 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcInstDcls.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
3 %
4 \section[TcInstDecls]{Typechecking instance declarations}
5
6 \begin{code}
7 module TcInstDcls (
8         tcInstDecls1,
9         tcInstDecls2
10     ) where
11
12 #include "HsVersions.h"
13
14 import HsSyn            ( HsDecl(..), InstDecl(..),
15                           HsBinds(..), MonoBinds(..), GRHSsAndBinds(..), GRHS(..),
16                           HsExpr(..), InPat(..), HsLit(..), Sig(..),
17                           unguardedRHS,
18                           collectMonoBinders, andMonoBinds
19                         )
20 import HsBinds          ( sigsForMe )
21 import RnHsSyn          ( RenamedHsBinds, RenamedMonoBinds,
22                           RenamedInstDecl, RenamedHsExpr,
23                           RenamedSig, RenamedHsDecl
24                         )
25 import TcHsSyn          ( TcMonoBinds, TcIdOcc(..), TcIdBndr, 
26                           maybeBoxedPrimType, tcIdType
27                         )
28
29 import TcBinds          ( tcPragmaSigs )
30 import TcClassDcl       ( tcMethodBind, badMethodErr )
31 import TcMonad
32 import RnMonad          ( RnNameSupply )
33 import Inst             ( Inst, InstOrigin(..),
34                           newDicts, LIE, emptyLIE, plusLIE, plusLIEs )
35 import TcDeriv          ( tcDeriving )
36 import TcEnv            ( tcExtendGlobalValEnv, tcAddImportedIdInfo )
37 import TcInstUtil       ( InstInfo(..), mkInstanceRelatedIds, classDataCon )
38 import TcKind           ( TcKind, unifyKind )
39 import TcMonoType       ( tcHsType )
40 import TcSimplify       ( tcSimplifyAndCheck )
41 import TcType           ( TcType, TcTyVar, TcTyVarSet, 
42                           zonkSigTyVar, tcInstSigTyVars, tcInstType, tcInstTheta
43                         )
44
45 import Bag              ( emptyBag, unitBag, unionBags, unionManyBags,
46                           foldBag, bagToList, Bag
47                         )
48 import CmdLineOpts      ( opt_GlasgowExts, opt_WarnMissingMethods )
49 import Class            ( classBigSig, Class )
50 import Id               ( isNullaryDataCon, dataConArgTys, replaceIdInfo, idName, Id )
51 import Maybes           ( maybeToBool, seqMaybe, catMaybes )
52 import Name             ( nameOccName, mkLocalName,
53                           isLocallyDefined, Module,
54                           NamedThing(..)
55                         )
56 import PrelVals         ( nO_METHOD_BINDING_ERROR_ID, eRROR_ID )
57 import PprType          ( pprParendType,  pprConstraint )
58 import SrcLoc           ( SrcLoc, noSrcLoc )
59 import TyCon            ( isSynTyCon, isDataTyCon, tyConDerivings )
60 import Type             ( Type, ThetaType, isUnpointedType,
61                           splitSigmaTy, isTyVarTy, mkSigmaTy,
62                           splitTyConApp_maybe, splitDictTy_maybe,
63                           splitAlgTyConApp_maybe, splitRhoTy,
64                           tyVarsOfTypes
65                         )
66 import TyVar            ( zipTyVarEnv, mkTyVarSet, tyVarSetToList, TyVar )
67 import TysPrim          ( byteArrayPrimTyCon, mutableByteArrayPrimTyCon )
68 import TysWiredIn       ( stringTy )
69 import Unique           ( Unique, cCallableClassKey, cReturnableClassKey, Uniquable(..) )
70 import Outputable
71 \end{code}
72
73 Typechecking instance declarations is done in two passes. The first
74 pass, made by @tcInstDecls1@, collects information to be used in the
75 second pass.
76
77 This pre-processed info includes the as-yet-unprocessed bindings
78 inside the instance declaration.  These are type-checked in the second
79 pass, when the class-instance envs and GVE contain all the info from
80 all the instance and value decls.  Indeed that's the reason we need
81 two passes over the instance decls.
82
83
84 Here is the overall algorithm.
85 Assume that we have an instance declaration
86
87     instance c => k (t tvs) where b
88
89 \begin{enumerate}
90 \item
91 $LIE_c$ is the LIE for the context of class $c$
92 \item
93 $betas_bar$ is the free variables in the class method type, excluding the
94    class variable
95 \item
96 $LIE_cop$ is the LIE constraining a particular class method
97 \item
98 $tau_cop$ is the tau type of a class method
99 \item
100 $LIE_i$ is the LIE for the context of instance $i$
101 \item
102 $X$ is the instance constructor tycon
103 \item
104 $gammas_bar$ is the set of type variables of the instance
105 \item
106 $LIE_iop$ is the LIE for a particular class method instance
107 \item
108 $tau_iop$ is the tau type for this instance of a class method
109 \item
110 $alpha$ is the class variable
111 \item
112 $LIE_cop' = LIE_cop [X gammas_bar / alpha, fresh betas_bar]$
113 \item
114 $tau_cop' = tau_cop [X gammas_bar / alpha, fresh betas_bar]$
115 \end{enumerate}
116
117 ToDo: Update the list above with names actually in the code.
118
119 \begin{enumerate}
120 \item
121 First, make the LIEs for the class and instance contexts, which means
122 instantiate $thetaC [X inst_tyvars / alpha ]$, yielding LIElistC' and LIEC',
123 and make LIElistI and LIEI.
124 \item
125 Then process each method in turn.
126 \item
127 order the instance methods according to the ordering of the class methods
128 \item
129 express LIEC' in terms of LIEI, yielding $dbinds_super$ or an error
130 \item
131 Create final dictionary function from bindings generated already
132 \begin{pseudocode}
133 df = lambda inst_tyvars
134        lambda LIEI
135          let Bop1
136              Bop2
137              ...
138              Bopn
139          and dbinds_super
140               in <op1,op2,...,opn,sd1,...,sdm>
141 \end{pseudocode}
142 Here, Bop1 \ldots Bopn bind the methods op1 \ldots opn,
143 and $dbinds_super$ bind the superclass dictionaries sd1 \ldots sdm.
144 \end{enumerate}
145
146 \begin{code}
147 tcInstDecls1 :: TcEnv s                 -- Contains IdInfo for dfun ids
148              -> [RenamedHsDecl]
149              -> Module                  -- module name for deriving
150              -> RnNameSupply                    -- for renaming derivings
151              -> TcM s (Bag InstInfo,
152                        RenamedHsBinds,
153                        SDoc)
154
155 tcInstDecls1 unf_env decls mod_name rn_name_supply
156   =     -- Do the ordinary instance declarations
157     mapNF_Tc (tcInstDecl1 unf_env mod_name) 
158              [inst_decl | InstD inst_decl <- decls]     `thenNF_Tc` \ inst_info_bags ->
159     let
160         decl_inst_info = unionManyBags inst_info_bags
161     in
162         -- Handle "derived" instances; note that we only do derivings
163         -- for things in this module; we ignore deriving decls from
164         -- interfaces!
165     tcDeriving mod_name rn_name_supply decl_inst_info
166                         `thenTc` \ (deriv_inst_info, deriv_binds, ddump_deriv) ->
167
168     let
169         full_inst_info = deriv_inst_info `unionBags` decl_inst_info
170     in
171     returnTc (full_inst_info, deriv_binds, ddump_deriv)
172
173
174 tcInstDecl1 :: TcEnv s -> Module -> RenamedInstDecl -> NF_TcM s (Bag InstInfo)
175
176 tcInstDecl1 unf_env mod_name (InstDecl poly_ty binds uprags (Just dfun_name) src_loc)
177   =     -- Prime error recovery, set source location
178     recoverNF_Tc (returnNF_Tc emptyBag) $
179     tcAddSrcLoc src_loc                 $
180
181         -- Type-check all the stuff before the "where"
182     tcHsType poly_ty                    `thenTc` \ poly_ty' ->
183     let
184         (tyvars, theta, dict_ty) = splitSigmaTy poly_ty'
185         (clas, inst_tys)         = case splitDictTy_maybe dict_ty of
186                                      Nothing   -> pprPanic "tcInstDecl1" (ppr poly_ty)
187                                      Just pair -> pair
188     in
189
190         -- Check for respectable instance type
191     scrutiniseInstanceType clas inst_tys        `thenTc_`
192
193         -- Make the dfun id and constant-method ids
194     let
195         (dfun_id, dfun_theta) = mkInstanceRelatedIds dfun_name
196                                          clas tyvars inst_tys theta
197         -- Add info from interface file
198         final_dfun_id = tcAddImportedIdInfo unf_env dfun_id
199     in
200     returnTc (unitBag (InstInfo clas tyvars inst_tys theta      
201                                 dfun_theta final_dfun_id
202                                 binds src_loc uprags))
203 \end{code}
204
205
206 %************************************************************************
207 %*                                                                      *
208 \subsection{Type-checking instance declarations, pass 2}
209 %*                                                                      *
210 %************************************************************************
211
212 \begin{code}
213 tcInstDecls2 :: Bag InstInfo
214              -> NF_TcM s (LIE s, TcMonoBinds s)
215
216 tcInstDecls2 inst_decls
217   = foldBag combine tcInstDecl2 (returnNF_Tc (emptyLIE, EmptyMonoBinds)) inst_decls
218   where
219     combine tc1 tc2 = tc1       `thenNF_Tc` \ (lie1, binds1) ->
220                       tc2       `thenNF_Tc` \ (lie2, binds2) ->
221                       returnNF_Tc (lie1 `plusLIE` lie2,
222                                    binds1 `AndMonoBinds` binds2)
223 \end{code}
224
225
226 ======= New documentation starts here (Sept 92)  ==============
227
228 The main purpose of @tcInstDecl2@ is to return a @HsBinds@ which defines
229 the dictionary function for this instance declaration.  For example
230 \begin{verbatim}
231         instance Foo a => Foo [a] where
232                 op1 x = ...
233                 op2 y = ...
234 \end{verbatim}
235 might generate something like
236 \begin{verbatim}
237         dfun.Foo.List dFoo_a = let op1 x = ...
238                                    op2 y = ...
239                                in
240                                    Dict [op1, op2]
241 \end{verbatim}
242
243 HOWEVER, if the instance decl has no context, then it returns a
244 bigger @HsBinds@ with declarations for each method.  For example
245 \begin{verbatim}
246         instance Foo [a] where
247                 op1 x = ...
248                 op2 y = ...
249 \end{verbatim}
250 might produce
251 \begin{verbatim}
252         dfun.Foo.List a = Dict [Foo.op1.List a, Foo.op2.List a]
253         const.Foo.op1.List a x = ...
254         const.Foo.op2.List a y = ...
255 \end{verbatim}
256 This group may be mutually recursive, because (for example) there may
257 be no method supplied for op2 in which case we'll get
258 \begin{verbatim}
259         const.Foo.op2.List a = default.Foo.op2 (dfun.Foo.List a)
260 \end{verbatim}
261 that is, the default method applied to the dictionary at this type.
262
263 What we actually produce in either case is:
264
265         AbsBinds [a] [dfun_theta_dicts]
266                  [(dfun.Foo.List, d)] ++ (maybe) [(const.Foo.op1.List, op1), ...]
267                  { d = (sd1,sd2, ..., op1, op2, ...)
268                    op1 = ...
269                    op2 = ...
270                  }
271
272 The "maybe" says that we only ask AbsBinds to make global constant methods
273 if the dfun_theta is empty.
274
275                 
276 For an instance declaration, say,
277
278         instance (C1 a, C2 b) => C (T a b) where
279                 ...
280
281 where the {\em immediate} superclasses of C are D1, D2, we build a dictionary
282 function whose type is
283
284         (C1 a, C2 b, D1 (T a b), D2 (T a b)) => C (T a b)
285
286 Notice that we pass it the superclass dictionaries at the instance type; this
287 is the ``Mark Jones optimisation''.  The stuff before the "=>" here
288 is the @dfun_theta@ below.
289
290 First comes the easy case of a non-local instance decl.
291
292 \begin{code}
293 tcInstDecl2 :: InstInfo -> NF_TcM s (LIE s, TcMonoBinds s)
294
295 tcInstDecl2 (InstInfo clas inst_tyvars inst_tys
296                       inst_decl_theta dfun_theta
297                       dfun_id monobinds
298                       locn uprags)
299   | not (isLocallyDefined dfun_id)
300   = returnNF_Tc (emptyLIE, EmptyMonoBinds)
301
302 {-
303   -- I deleted this "optimisation" because when importing these
304   -- instance decls the renamer would look for the dfun bindings and they weren't there.
305   -- This would be fixable, but it seems simpler just to produce a tiny void binding instead,
306   -- even though it's never used.
307
308         -- This case deals with CCallable etc, which don't need any bindings
309   | isNoDictClass clas                  
310   = returnNF_Tc (emptyLIE, EmptyBinds)
311 -}
312
313   | otherwise
314   =      -- Prime error recovery
315     recoverNF_Tc (returnNF_Tc (emptyLIE, EmptyMonoBinds))  $
316     tcAddSrcLoc locn                                       $
317
318         -- Get the class signature
319     let 
320         origin = InstanceDeclOrigin
321         (class_tyvars,
322          sc_theta, sc_sel_ids,
323          op_sel_ids, defm_ids) = classBigSig clas
324     in
325       
326         -- Instantiate the instance decl with tc-style type variables
327     tcInstSigTyVars inst_tyvars         `thenNF_Tc` \ (inst_tyvars', _, tenv) ->
328     mapNF_Tc (tcInstType tenv) inst_tys `thenNF_Tc` \ inst_tys' ->
329     tcInstTheta tenv dfun_theta         `thenNF_Tc` \ dfun_theta' ->
330     tcInstTheta tenv inst_decl_theta    `thenNF_Tc` \ inst_decl_theta' ->
331
332          -- Instantiate the super-class context with inst_tys
333     tcInstTheta (zipTyVarEnv class_tyvars inst_tys') sc_theta           `thenNF_Tc` \ sc_theta' ->
334
335          -- Create dictionary Ids from the specified instance contexts.
336     newDicts origin sc_theta'           `thenNF_Tc` \ (sc_dicts,        sc_dict_ids) ->
337     newDicts origin dfun_theta'         `thenNF_Tc` \ (dfun_arg_dicts,  dfun_arg_dicts_ids)  ->
338     newDicts origin inst_decl_theta'    `thenNF_Tc` \ (inst_decl_dicts, _) ->
339     newDicts origin [(clas,inst_tys')]  `thenNF_Tc` \ (this_dict,       [this_dict_id]) ->
340
341          -- Check that all the method bindings come from this class
342     let
343         check_from_this_class (bndr, loc)
344           | nameOccName bndr `elem` sel_names = returnNF_Tc ()
345           | otherwise                         = tcAddSrcLoc loc $
346                                                 addErrTc (badMethodErr bndr clas)
347         sel_names = map getOccName op_sel_ids
348         bndrs = bagToList (collectMonoBinders monobinds)
349     in
350     mapNF_Tc check_from_this_class bndrs                `thenNF_Tc_`
351
352     tcExtendGlobalValEnv (catMaybes defm_ids) (
353
354                 -- Default-method Ids may be mentioned in synthesised RHSs 
355         mapAndUnzip3Tc (tcInstMethodBind clas inst_tys' inst_tyvars' monobinds uprags) 
356                        (op_sel_ids `zip` defm_ids)
357     )                   `thenTc` \ (method_binds_s, insts_needed_s, meth_lies_w_ids) ->
358
359         -- Deal with SPECIALISE instance pragmas
360     let
361         dfun_prags = [Sig (idName dfun_id) ty loc | SpecInstSig ty loc <- uprags]
362     in
363     tcExtendGlobalValEnv [dfun_id] (
364         tcPragmaSigs dfun_prags
365     )                                   `thenTc` \ (prag_info_fn, prag_binds, prag_lie) ->
366
367         -- Check the overloading constraints of the methods and superclasses
368     mapNF_Tc zonkSigTyVar inst_tyvars'  `thenNF_Tc` \ zonked_inst_tyvars ->
369
370     let
371         inst_tyvars_set = mkTyVarSet zonked_inst_tyvars
372
373         (meth_lies, meth_ids) = unzip meth_lies_w_ids
374
375                  -- These insts are in scope; quite a few, eh?
376         avail_insts = this_dict                 `plusLIE` 
377                       dfun_arg_dicts            `plusLIE`
378                       sc_dicts                  `plusLIE`
379                       unionManyBags meth_lies
380
381         methods_lie = plusLIEs insts_needed_s
382     in
383
384         -- Check that we *could* construct the superclass dictionaries,
385         -- even though we are *actually* going to pass the superclass dicts in;
386         -- the check ensures that the caller will never have a problem building
387         -- them.
388     tcAddErrCtxt superClassCtxt (
389       tcSimplifyAndCheck
390                  (ptext SLIT("instance declaration context"))
391                  inst_tyvars_set                -- Local tyvars
392                  inst_decl_dicts                -- The instance dictionaries available
393                  sc_dicts                       -- The superclass dicationaries reqd
394     )                                   `thenTc_`
395                                                 -- Ignore the result; we're only doing
396                                                 -- this to make sure it can be done.
397
398         -- Ditto method bindings
399     tcAddErrCtxt methodCtxt (
400       tcSimplifyAndCheck
401                  (ptext SLIT("instance declaration context"))
402                  inst_tyvars_set                        -- Local tyvars
403                  avail_insts
404                  methods_lie
405     )                                            `thenTc_`
406     
407                 -- Now do the simplification again, this time to get the
408                 -- bindings; this time we use an enhanced "avails"
409                 -- Ignore errors because they come from the *previous* tcSimplifys
410     discardErrsTc (
411         tcSimplifyAndCheck
412                  (ptext SLIT("instance declaration context"))
413                  inst_tyvars_set
414                  dfun_arg_dicts         -- NB! Don't include this_dict here, else the sc_dicts
415                                         -- get bound by just selecting from this_dict!!
416                  (sc_dicts `plusLIE` methods_lie `plusLIE` prag_lie)
417     )                                            `thenTc` \ (const_lie, lie_binds) ->
418         
419
420         -- Create the result bindings
421     let
422         dict_constr   = classDataCon clas
423         scs_and_meths = sc_dict_ids ++ meth_ids
424
425         dict_rhs
426           | null scs_and_meths
427           =     -- Blatant special case for CCallable, CReturnable
428                 -- If the dictionary is empty then we should never
429                 -- select anything from it, so we make its RHS just
430                 -- emit an error message.  This in turn means that we don't
431                 -- mention the constructor, which doesn't exist for CCallable, CReturnable
432                 -- Hardly beautiful, but only three extra lines.
433            HsApp (TyApp (HsVar (RealId eRROR_ID)) [tcIdType this_dict_id])
434                  (HsLitOut (HsString msg) stringTy)
435
436           | otherwise   -- The common case
437           = foldl HsApp (TyApp (HsVar (RealId dict_constr)) inst_tys')
438                                (map HsVar (sc_dict_ids ++ meth_ids))
439                 -- We don't produce a binding for the dict_constr; instead we
440                 -- rely on the simplifier to unfold this saturated application
441           where
442             msg = _PK_ ("Compiler error: bad dictionary " ++ showSDoc (ppr clas))
443
444         dict_bind    = VarMonoBind this_dict_id dict_rhs
445         method_binds = andMonoBinds method_binds_s
446
447         final_dfun_id = replaceIdInfo dfun_id (prag_info_fn (idName dfun_id))
448                                 -- Pretty truesome
449         main_bind
450           = AbsBinds
451                  zonked_inst_tyvars
452                  dfun_arg_dicts_ids
453                  [(inst_tyvars', RealId final_dfun_id, this_dict_id)] 
454                  (lie_binds     `AndMonoBinds` 
455                   method_binds  `AndMonoBinds`
456                   prag_binds    `AndMonoBinds`
457                   dict_bind)
458     in
459     returnTc (const_lie,
460               main_bind `AndMonoBinds` prag_binds)
461 \end{code}
462
463
464 %************************************************************************
465 %*                                                                      *
466 \subsection{Processing each method}
467 %*                                                                      *
468 %************************************************************************
469
470 \begin{code}
471 tcInstMethodBind 
472         :: Class
473         -> [TcType s]                                   -- Instance types
474         -> [TcTyVar s]                                  -- and their free (sig) tyvars
475         -> RenamedMonoBinds                             -- Method binding
476         -> [RenamedSig]                                 -- Pragmas
477         -> (Id, Maybe Id)                               -- Selector id and default-method id
478         -> TcM s (TcMonoBinds s, LIE s, (LIE s, TcIdOcc s))
479
480 tcInstMethodBind clas inst_tys inst_tyvars meth_binds prags (sel_id, maybe_dm_id)
481   = tcGetSrcLoc                 `thenNF_Tc` \ loc ->
482     tcGetUnique                 `thenNF_Tc` \ uniq ->
483     let
484         sel_name          = idName sel_id
485         meth_occ          = getOccName sel_name
486         default_meth_name = mkLocalName uniq meth_occ loc
487         maybe_meth_bind   = find sel_name meth_binds 
488         the_meth_bind     = case maybe_meth_bind of
489                                   Just stuff -> stuff
490                                   Nothing    -> mk_default_bind default_meth_name loc
491         meth_prags        = sigsForMe (== sel_name) prags
492     in
493
494         -- Warn if no method binding, only if -fwarn-missing-methods
495     
496     warnTc (opt_WarnMissingMethods &&
497             not (maybeToBool maybe_meth_bind) &&
498             not (maybeToBool maybe_dm_id))      
499         (omittedMethodWarn sel_id clas)         `thenNF_Tc_`
500
501         -- Typecheck the method binding
502     tcMethodBind clas origin inst_tys inst_tyvars sel_id the_meth_bind meth_prags
503   where
504     origin = InstanceDeclOrigin         -- Poor
505
506     find sel EmptyMonoBinds       = Nothing
507     find sel (AndMonoBinds b1 b2) = find sel b1 `seqMaybe` find sel b2
508
509     find sel b@(FunMonoBind op_name _ _ _)          | op_name == sel = Just b
510                                                     | otherwise      = Nothing
511     find sel b@(PatMonoBind (VarPatIn op_name) _ _) | op_name == sel = Just b
512                                                     | otherwise      = Nothing
513     find sel other = panic "Urk! Bad instance method binding"
514
515
516     mk_default_bind local_meth_name loc
517       = PatMonoBind (VarPatIn local_meth_name)
518                     (GRHSsAndBindsIn (unguardedRHS (default_expr loc) loc) EmptyBinds)
519                     loc
520
521     default_expr loc 
522       = case maybe_dm_id of
523           Just dm_id -> HsVar (getName dm_id)   -- There's a default method
524           Nothing    -> error_expr loc          -- No default method
525
526     error_expr loc
527       = HsApp (HsVar (getName nO_METHOD_BINDING_ERROR_ID)) 
528                      (HsLit (HsString (_PK_ (error_msg loc))))
529
530     error_msg loc = showSDoc (hcat [ppr loc, text "|", ppr sel_id ])
531 \end{code}
532
533
534
535 %************************************************************************
536 %*                                                                      *
537 \subsection{Checking for a decent instance type}
538 %*                                                                      *
539 %************************************************************************
540
541 @scrutiniseInstanceType@ checks the type {\em and} its syntactic constraints:
542 it must normally look like: @instance Foo (Tycon a b c ...) ...@
543
544 The exceptions to this syntactic checking: (1)~if the @GlasgowExts@
545 flag is on, or (2)~the instance is imported (they must have been
546 compiled elsewhere). In these cases, we let them go through anyway.
547
548 We can also have instances for functions: @instance Foo (a -> b) ...@.
549
550 \begin{code}
551 scrutiniseInstanceType clas inst_taus
552   |     -- CCALL CHECK (a).... urgh!
553         -- To verify that a user declaration of a CCallable/CReturnable 
554         -- instance is OK, we must be able to see the constructor(s)
555         -- of the instance type (see next guard.)
556         --  
557         -- We flag this separately to give a more precise error msg.
558         --
559      (uniqueOf clas == cCallableClassKey || uniqueOf clas == cReturnableClassKey)
560   && is_alg_tycon_app && not constructors_visible
561   = failWithTc (invisibleDataConPrimCCallErr clas first_inst_tau)
562
563   |     -- CCALL CHECK (b) 
564         -- A user declaration of a CCallable/CReturnable instance
565         -- must be for a "boxed primitive" type.
566     (uniqueOf clas == cCallableClassKey   && not (ccallable_type   first_inst_tau)) ||
567     (uniqueOf clas == cReturnableClassKey && not (creturnable_type first_inst_tau))
568   = failWithTc (nonBoxedPrimCCallErr clas first_inst_tau)
569
570         -- DERIVING CHECK
571         -- It is obviously illegal to have an explicit instance
572         -- for something that we are also planning to `derive'
573   | maybeToBool alg_tycon_app_maybe && clas `elem` (tyConDerivings alg_tycon)
574   = failWithTc (derivingWhenInstanceExistsErr clas first_inst_tau)
575            -- Kind check will have ensured inst_taus is of length 1
576
577         -- WITH HASKELL 1.4, MUST HAVE C (T a b c)
578   |  not opt_GlasgowExts
579   && not (length inst_taus == 1 &&
580           maybeToBool maybe_tycon_app &&        -- Yes, there's a type constuctor
581           not (isSynTyCon tycon) &&             -- ...but not a synonym
582           all isTyVarTy arg_tys &&              -- Applied to type variables
583           length (tyVarSetToList (tyVarsOfTypes arg_tys)) == length arg_tys
584                  -- This last condition checks that all the type variables are distinct
585      )
586   = failWithTc (instTypeErr clas inst_taus
587                         (text "the instance type must be of form (T a b c)" $$
588                          text "where T is not a synonym, and a,b,c are distinct type variables")
589     )
590
591   | otherwise
592   = returnTc ()
593
594   where
595     (first_inst_tau : _)       = inst_taus
596
597         -- Stuff for algebraic or -> type
598     maybe_tycon_app       = splitTyConApp_maybe first_inst_tau
599     Just (tycon, arg_tys) = maybe_tycon_app
600
601         -- Stuff for an *algebraic* data type
602     alg_tycon_app_maybe            = splitAlgTyConApp_maybe first_inst_tau
603                                         -- The "Alg" part looks through synonyms
604     is_alg_tycon_app               = maybeToBool alg_tycon_app_maybe
605     Just (alg_tycon, _, data_cons) = alg_tycon_app_maybe
606
607     constructors_visible = not (null data_cons)
608  
609
610 -- These conditions come directly from what the DsCCall is capable of.
611 -- Totally grotesque.  Green card should solve this.
612
613 ccallable_type   ty = isUnpointedType ty ||                             -- Allow CCallable Int# etc
614                       maybeToBool (maybeBoxedPrimType ty) ||    -- Ditto Int etc
615                       ty == stringTy ||
616                       byte_arr_thing
617   where
618     byte_arr_thing = case splitAlgTyConApp_maybe ty of
619                         Just (tycon, ty_args, [data_con]) | isDataTyCon tycon -> 
620                                 length data_con_arg_tys == 2 &&
621                                 maybeToBool maybe_arg2_tycon &&
622                                 (arg2_tycon == byteArrayPrimTyCon ||
623                                  arg2_tycon == mutableByteArrayPrimTyCon)
624                              where
625                                 data_con_arg_tys = dataConArgTys data_con ty_args
626                                 (data_con_arg_ty1 : data_con_arg_ty2 : _) = data_con_arg_tys
627                                 maybe_arg2_tycon = splitTyConApp_maybe data_con_arg_ty2
628                                 Just (arg2_tycon,_) = maybe_arg2_tycon
629
630                         other -> False
631
632 creturnable_type ty = maybeToBool (maybeBoxedPrimType ty) ||
633                         -- Or, a data type with a single nullary constructor
634                       case (splitAlgTyConApp_maybe ty) of
635                         Just (tycon, tys_applied, [data_con])
636                                 -> isNullaryDataCon data_con
637                         other -> False
638 \end{code}
639
640 \begin{code}
641
642 instTypeErr clas tys msg
643   = sep [ptext SLIT("Illegal instance declaration for") <+> quotes (pprConstraint clas tys),
644          nest 4 (parens msg)
645     ]
646
647 derivingWhenInstanceExistsErr clas tycon
648   = hang (hsep [ptext SLIT("Deriving class"), 
649                        quotes (ppr clas), 
650                        ptext SLIT("type"), quotes (ppr tycon)])
651          4 (ptext SLIT("when an explicit instance exists"))
652
653 nonBoxedPrimCCallErr clas inst_ty
654   = hang (ptext SLIT("Unacceptable instance type for ccall-ish class"))
655          4 (hsep [ ptext SLIT("class"), ppr clas, ptext SLIT("type"),
656                         ppr inst_ty])
657
658 omittedMethodWarn sel_id clas
659   = sep [ptext SLIT("No explicit method nor default method for") <+> quotes (ppr sel_id), 
660          ptext SLIT("in an instance declaration for") <+> quotes (ppr clas)]
661
662 {-
663   Declaring CCallable & CReturnable instances in a module different
664   from where the type was defined. Caused by importing data type
665   abstractly (either programmatically or by the renamer being over-eager
666   in its pruning.)
667 -}
668 invisibleDataConPrimCCallErr clas inst_ty
669   = hang (hsep [ptext SLIT("Constructors for"), quotes (ppr inst_ty),
670                 ptext SLIT("not visible when checking"),
671                 quotes (ppr clas), ptext SLIT("instance")])
672         4 (hsep [text "(Try either importing", ppr inst_ty, 
673                  text "non-abstractly or compile using -fno-prune-tydecls ..)"])
674
675 methodCtxt     = ptext SLIT("When checking the methods of an instance declaration")
676 superClassCtxt = ptext SLIT("When checking the superclasses of an instance declaration")
677 \end{code}