relaxed instance termination test
[ghc-hetmet.git] / ghc / compiler / typecheck / TcInstDcls.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[TcInstDecls]{Typechecking instance declarations}
5
6 \begin{code}
7 module TcInstDcls ( tcInstDecls1, tcInstDecls2 ) where
8
9 #include "HsVersions.h"
10
11 import HsSyn
12 import TcBinds          ( mkPragFun, tcPrags, badBootDeclErr )
13 import TcClassDcl       ( tcMethodBind, mkMethodBind, badMethodErr, 
14                           tcClassDecl2, getGenericInstances )
15 import TcRnMonad       
16 import TcMType          ( tcSkolSigType, checkValidTheta, checkValidInstHead,
17                           checkInstTermination, instTypeErr, 
18                           checkAmbiguity, SourceTyCtxt(..) )
19 import TcType           ( mkClassPred, tyVarsOfType, 
20                           tcSplitSigmaTy, tcSplitDFunHead, mkTyVarTys,
21                           SkolemInfo(InstSkol), tcSplitDFunTy, pprClassPred )
22 import Inst             ( tcInstClassOp, newDicts, instToId, showLIE, 
23                           getOverlapFlag, tcExtendLocalInstEnv )
24 import InstEnv          ( mkLocalInstance, instanceDFunId )
25 import TcDeriv          ( tcDeriving )
26 import TcEnv            ( InstInfo(..), InstBindings(..), 
27                           newDFunName, tcExtendIdEnv
28                         )
29 import TcHsType         ( kcHsSigType, tcHsKindedType )
30 import TcUnify          ( checkSigTyVars )
31 import TcSimplify       ( tcSimplifyCheck, tcSimplifySuperClasses )
32 import Type             ( zipOpenTvSubst, substTheta, substTys )
33 import DataCon          ( classDataCon )
34 import Class            ( classBigSig )
35 import Var              ( Id, idName, idType )
36 import MkId             ( mkDictFunId, rUNTIME_ERROR_ID )
37 import FunDeps          ( checkInstFDs )
38 import Name             ( Name, getSrcLoc )
39 import Maybe            ( catMaybes )
40 import SrcLoc           ( srcLocSpan, unLoc, noLoc, Located(..), srcSpanStart )
41 import ListSetOps       ( minusList )
42 import Outputable
43 import Bag
44 import BasicTypes       ( Activation( AlwaysActive ), InlineSpec(..) )
45 import FastString
46 \end{code}
47
48 Typechecking instance declarations is done in two passes. The first
49 pass, made by @tcInstDecls1@, collects information to be used in the
50 second pass.
51
52 This pre-processed info includes the as-yet-unprocessed bindings
53 inside the instance declaration.  These are type-checked in the second
54 pass, when the class-instance envs and GVE contain all the info from
55 all the instance and value decls.  Indeed that's the reason we need
56 two passes over the instance decls.
57
58
59 Here is the overall algorithm.
60 Assume that we have an instance declaration
61
62     instance c => k (t tvs) where b
63
64 \begin{enumerate}
65 \item
66 $LIE_c$ is the LIE for the context of class $c$
67 \item
68 $betas_bar$ is the free variables in the class method type, excluding the
69    class variable
70 \item
71 $LIE_cop$ is the LIE constraining a particular class method
72 \item
73 $tau_cop$ is the tau type of a class method
74 \item
75 $LIE_i$ is the LIE for the context of instance $i$
76 \item
77 $X$ is the instance constructor tycon
78 \item
79 $gammas_bar$ is the set of type variables of the instance
80 \item
81 $LIE_iop$ is the LIE for a particular class method instance
82 \item
83 $tau_iop$ is the tau type for this instance of a class method
84 \item
85 $alpha$ is the class variable
86 \item
87 $LIE_cop' = LIE_cop [X gammas_bar / alpha, fresh betas_bar]$
88 \item
89 $tau_cop' = tau_cop [X gammas_bar / alpha, fresh betas_bar]$
90 \end{enumerate}
91
92 ToDo: Update the list above with names actually in the code.
93
94 \begin{enumerate}
95 \item
96 First, make the LIEs for the class and instance contexts, which means
97 instantiate $thetaC [X inst_tyvars / alpha ]$, yielding LIElistC' and LIEC',
98 and make LIElistI and LIEI.
99 \item
100 Then process each method in turn.
101 \item
102 order the instance methods according to the ordering of the class methods
103 \item
104 express LIEC' in terms of LIEI, yielding $dbinds_super$ or an error
105 \item
106 Create final dictionary function from bindings generated already
107 \begin{pseudocode}
108 df = lambda inst_tyvars
109        lambda LIEI
110          let Bop1
111              Bop2
112              ...
113              Bopn
114          and dbinds_super
115               in <op1,op2,...,opn,sd1,...,sdm>
116 \end{pseudocode}
117 Here, Bop1 \ldots Bopn bind the methods op1 \ldots opn,
118 and $dbinds_super$ bind the superclass dictionaries sd1 \ldots sdm.
119 \end{enumerate}
120
121
122 %************************************************************************
123 %*                                                                      *
124 \subsection{Extracting instance decls}
125 %*                                                                      *
126 %************************************************************************
127
128 Gather up the instance declarations from their various sources
129
130 \begin{code}
131 tcInstDecls1    -- Deal with both source-code and imported instance decls
132    :: [LTyClDecl Name]          -- For deriving stuff
133    -> [LInstDecl Name]          -- Source code instance decls
134    -> TcM (TcGblEnv,            -- The full inst env
135            [InstInfo],          -- Source-code instance decls to process; 
136                                 -- contains all dfuns for this module
137            HsValBinds Name)     -- Supporting bindings for derived instances
138
139 tcInstDecls1 tycl_decls inst_decls
140   = checkNoErrs $
141         -- Stop if addInstInfos etc discovers any errors
142         -- (they recover, so that we get more than one error each round)
143
144         -- (1) Do the ordinary instance declarations
145     mappM tcLocalInstDecl1 inst_decls    `thenM` \ local_inst_infos ->
146
147     let
148         local_inst_info = catMaybes local_inst_infos
149         clas_decls      = filter (isClassDecl.unLoc) tycl_decls
150     in
151         -- (2) Instances from generic class declarations
152     getGenericInstances clas_decls      `thenM` \ generic_inst_info -> 
153
154         -- Next, construct the instance environment so far, consisting of
155         --      a) local instance decls
156         --      b) generic instances
157     addInsts local_inst_info    $
158     addInsts generic_inst_info  $
159
160         -- (3) Compute instances from "deriving" clauses; 
161         -- This stuff computes a context for the derived instance decl, so it
162         -- needs to know about all the instances possible; hence inst_env4
163     tcDeriving tycl_decls       `thenM` \ (deriv_inst_info, deriv_binds) ->
164     addInsts deriv_inst_info    $
165
166     getGblEnv                   `thenM` \ gbl_env ->
167     returnM (gbl_env, 
168              generic_inst_info ++ deriv_inst_info ++ local_inst_info,
169              deriv_binds)
170
171 addInsts :: [InstInfo] -> TcM a -> TcM a
172 addInsts infos thing_inside
173   = tcExtendLocalInstEnv (map iSpec infos) thing_inside
174 \end{code} 
175
176 \begin{code}
177 tcLocalInstDecl1 :: LInstDecl Name 
178                  -> TcM (Maybe InstInfo)        -- Nothing if there was an error
179         -- A source-file instance declaration
180         -- Type-check all the stuff before the "where"
181         --
182         -- We check for respectable instance type, and context
183 tcLocalInstDecl1 decl@(L loc (InstDecl poly_ty binds uprags))
184   =     -- Prime error recovery, set source location
185     recoverM (returnM Nothing)          $
186     setSrcSpan loc                      $
187     addErrCtxt (instDeclCtxt1 poly_ty)  $
188
189         -- Typecheck the instance type itself.  We can't use 
190         -- tcHsSigType, because it's not a valid user type.
191     kcHsSigType poly_ty                 `thenM` \ kinded_ty ->
192     tcHsKindedType kinded_ty            `thenM` \ poly_ty' ->
193     let
194         (tyvars, theta, tau) = tcSplitSigmaTy poly_ty'
195     in
196     checkValidTheta InstThetaCtxt theta                 `thenM_`
197     checkAmbiguity tyvars theta (tyVarsOfType tau)      `thenM_`
198     checkValidInstHead tau                              `thenM` \ (clas,inst_tys) ->
199     checkInstTermination theta inst_tys                 `thenM_`
200     checkTc (checkInstFDs theta clas inst_tys)
201             (instTypeErr (pprClassPred clas inst_tys) msg)      `thenM_`
202     newDFunName clas inst_tys (srcSpanStart loc)                `thenM` \ dfun_name ->
203     getOverlapFlag                                              `thenM` \ overlap_flag ->
204     let dfun  = mkDictFunId dfun_name tyvars theta clas inst_tys
205         ispec = mkLocalInstance dfun overlap_flag
206     in
207
208     tcIsHsBoot                                          `thenM` \ is_boot ->
209     checkTc (not is_boot || (isEmptyLHsBinds binds && null uprags))
210             badBootDeclErr                              `thenM_`
211
212     returnM (Just (InstInfo { iSpec = ispec, iBinds = VanillaInst binds uprags }))
213   where
214     msg  = parens (ptext SLIT("the instance types do not agree with the functional dependencies of the class"))
215 \end{code}
216
217
218 %************************************************************************
219 %*                                                                      *
220 \subsection{Type-checking instance declarations, pass 2}
221 %*                                                                      *
222 %************************************************************************
223
224 \begin{code}
225 tcInstDecls2 :: [LTyClDecl Name] -> [InstInfo] 
226              -> TcM (LHsBinds Id, TcLclEnv)
227 -- (a) From each class declaration, 
228 --      generate any default-method bindings
229 -- (b) From each instance decl
230 --      generate the dfun binding
231
232 tcInstDecls2 tycl_decls inst_decls
233   = do  {       -- (a) Default methods from class decls
234           (dm_binds_s, dm_ids_s) <- mapAndUnzipM tcClassDecl2 $
235                                     filter (isClassDecl.unLoc) tycl_decls
236         ; tcExtendIdEnv (concat dm_ids_s)       $ do 
237     
238                 -- (b) instance declarations
239         ; inst_binds_s <- mappM tcInstDecl2 inst_decls
240
241                 -- Done
242         ; let binds = unionManyBags dm_binds_s `unionBags` 
243                       unionManyBags inst_binds_s
244         ; tcl_env <- getLclEnv          -- Default method Ids in here
245         ; returnM (binds, tcl_env) }
246 \end{code}
247
248 ======= New documentation starts here (Sept 92)  ==============
249
250 The main purpose of @tcInstDecl2@ is to return a @HsBinds@ which defines
251 the dictionary function for this instance declaration.  For example
252 \begin{verbatim}
253         instance Foo a => Foo [a] where
254                 op1 x = ...
255                 op2 y = ...
256 \end{verbatim}
257 might generate something like
258 \begin{verbatim}
259         dfun.Foo.List dFoo_a = let op1 x = ...
260                                    op2 y = ...
261                                in
262                                    Dict [op1, op2]
263 \end{verbatim}
264
265 HOWEVER, if the instance decl has no context, then it returns a
266 bigger @HsBinds@ with declarations for each method.  For example
267 \begin{verbatim}
268         instance Foo [a] where
269                 op1 x = ...
270                 op2 y = ...
271 \end{verbatim}
272 might produce
273 \begin{verbatim}
274         dfun.Foo.List a = Dict [Foo.op1.List a, Foo.op2.List a]
275         const.Foo.op1.List a x = ...
276         const.Foo.op2.List a y = ...
277 \end{verbatim}
278 This group may be mutually recursive, because (for example) there may
279 be no method supplied for op2 in which case we'll get
280 \begin{verbatim}
281         const.Foo.op2.List a = default.Foo.op2 (dfun.Foo.List a)
282 \end{verbatim}
283 that is, the default method applied to the dictionary at this type.
284
285 What we actually produce in either case is:
286
287         AbsBinds [a] [dfun_theta_dicts]
288                  [(dfun.Foo.List, d)] ++ (maybe) [(const.Foo.op1.List, op1), ...]
289                  { d = (sd1,sd2, ..., op1, op2, ...)
290                    op1 = ...
291                    op2 = ...
292                  }
293
294 The "maybe" says that we only ask AbsBinds to make global constant methods
295 if the dfun_theta is empty.
296
297                 
298 For an instance declaration, say,
299
300         instance (C1 a, C2 b) => C (T a b) where
301                 ...
302
303 where the {\em immediate} superclasses of C are D1, D2, we build a dictionary
304 function whose type is
305
306         (C1 a, C2 b, D1 (T a b), D2 (T a b)) => C (T a b)
307
308 Notice that we pass it the superclass dictionaries at the instance type; this
309 is the ``Mark Jones optimisation''.  The stuff before the "=>" here
310 is the @dfun_theta@ below.
311
312 First comes the easy case of a non-local instance decl.
313
314
315 \begin{code}
316 tcInstDecl2 :: InstInfo -> TcM (LHsBinds Id)
317
318 tcInstDecl2 (InstInfo { iSpec = ispec, iBinds = binds })
319   = let 
320         dfun_id    = instanceDFunId ispec
321         rigid_info = InstSkol dfun_id
322         inst_ty    = idType dfun_id
323     in
324          -- Prime error recovery
325     recoverM (returnM emptyLHsBinds)            $
326     setSrcSpan (srcLocSpan (getSrcLoc dfun_id)) $
327     addErrCtxt (instDeclCtxt2 (idType dfun_id)) $
328
329         -- Instantiate the instance decl with skolem constants 
330     tcSkolSigType rigid_info inst_ty    `thenM` \ (inst_tyvars', dfun_theta', inst_head') ->
331                 -- These inst_tyvars' scope over the 'where' part
332                 -- Those tyvars are inside the dfun_id's type, which is a bit
333                 -- bizarre, but OK so long as you realise it!
334     let
335         (clas, inst_tys') = tcSplitDFunHead inst_head'
336         (class_tyvars, sc_theta, _, op_items) = classBigSig clas
337
338         -- Instantiate the super-class context with inst_tys
339         sc_theta' = substTheta (zipOpenTvSubst class_tyvars inst_tys') sc_theta
340         origin    = SigOrigin rigid_info
341     in
342          -- Create dictionary Ids from the specified instance contexts.
343     newDicts InstScOrigin sc_theta'                     `thenM` \ sc_dicts ->
344     newDicts origin dfun_theta'                         `thenM` \ dfun_arg_dicts ->
345     newDicts origin [mkClassPred clas inst_tys']        `thenM` \ [this_dict] ->
346                 -- Default-method Ids may be mentioned in synthesised RHSs,
347                 -- but they'll already be in the environment.
348
349         -- Typecheck the methods
350     let         -- These insts are in scope; quite a few, eh?
351         avail_insts = [this_dict] ++ dfun_arg_dicts ++ sc_dicts
352     in
353     tcMethods origin clas inst_tyvars' 
354               dfun_theta' inst_tys' avail_insts 
355               op_items binds            `thenM` \ (meth_ids, meth_binds) ->
356
357         -- Figure out bindings for the superclass context
358         -- Don't include this_dict in the 'givens', else
359         -- sc_dicts get bound by just selecting  from this_dict!!
360     addErrCtxt superClassCtxt
361         (tcSimplifySuperClasses inst_tyvars'
362                          dfun_arg_dicts
363                          sc_dicts)      `thenM` \ sc_binds ->
364
365         -- It's possible that the superclass stuff might unified one
366         -- of the inst_tyavars' with something in the envt
367     checkSigTyVars inst_tyvars'         `thenM_`
368
369         -- Deal with 'SPECIALISE instance' pragmas 
370     let
371         specs = case binds of
372                   VanillaInst _ prags -> filter isSpecInstLSig prags
373                   other               -> []
374     in
375     tcPrags dfun_id specs                       `thenM` \ prags -> 
376     
377         -- Create the result bindings
378     let
379         dict_constr   = classDataCon clas
380         scs_and_meths = map instToId sc_dicts ++ meth_ids
381         this_dict_id  = instToId this_dict
382         inline_prag | null dfun_arg_dicts = []
383                     | otherwise = [InlinePrag (Inline AlwaysActive True)]
384                 -- Always inline the dfun; this is an experimental decision
385                 -- because it makes a big performance difference sometimes.
386                 -- Often it means we can do the method selection, and then
387                 -- inline the method as well.  Marcin's idea; see comments below.
388                 --
389                 -- BUT: don't inline it if it's a constant dictionary;
390                 -- we'll get all the benefit without inlining, and we get
391                 -- a **lot** of code duplication if we inline it
392                 --
393                 --      See Note [Inline dfuns] below
394
395         dict_rhs
396           = mkHsConApp dict_constr inst_tys' (map HsVar scs_and_meths)
397                 -- We don't produce a binding for the dict_constr; instead we
398                 -- rely on the simplifier to unfold this saturated application
399                 -- We do this rather than generate an HsCon directly, because
400                 -- it means that the special cases (e.g. dictionary with only one
401                 -- member) are dealt with by the common MkId.mkDataConWrapId code rather
402                 -- than needing to be repeated here.
403
404           where
405             msg = "Compiler error: bad dictionary " ++ showSDoc (ppr clas)
406
407         dict_bind  = noLoc (VarBind this_dict_id dict_rhs)
408         all_binds  = dict_bind `consBag` (sc_binds `unionBags` meth_binds)
409
410         main_bind = noLoc $ AbsBinds
411                             inst_tyvars'
412                             (map instToId dfun_arg_dicts)
413                             [(inst_tyvars', dfun_id, this_dict_id, 
414                                             inline_prag ++ prags)] 
415                             all_binds
416     in
417     showLIE (text "instance")           `thenM_`
418     returnM (unitBag main_bind)
419
420
421 tcMethods origin clas inst_tyvars' dfun_theta' inst_tys' 
422           avail_insts op_items (VanillaInst monobinds uprags)
423   =     -- Check that all the method bindings come from this class
424     let
425         sel_names = [idName sel_id | (sel_id, _) <- op_items]
426         bad_bndrs = collectHsBindBinders monobinds `minusList` sel_names
427     in
428     mappM (addErrTc . badMethodErr clas) bad_bndrs      `thenM_`
429
430         -- Make the method bindings
431     let
432         mk_method_bind = mkMethodBind origin clas inst_tys' monobinds
433     in
434     mapAndUnzipM mk_method_bind op_items        `thenM` \ (meth_insts, meth_infos) ->
435
436         -- And type check them
437         -- It's really worth making meth_insts available to the tcMethodBind
438         -- Consider     instance Monad (ST s) where
439         --                {-# INLINE (>>) #-}
440         --                (>>) = ...(>>=)...
441         -- If we don't include meth_insts, we end up with bindings like this:
442         --      rec { dict = MkD then bind ...
443         --            then = inline_me (... (GHC.Base.>>= dict) ...)
444         --            bind = ... }
445         -- The trouble is that (a) 'then' and 'dict' are mutually recursive, 
446         -- and (b) the inline_me prevents us inlining the >>= selector, which
447         -- would unravel the loop.  Result: (>>) ends up as a loop breaker, and
448         -- is not inlined across modules. Rather ironic since this does not
449         -- happen without the INLINE pragma!  
450         --
451         -- Solution: make meth_insts available, so that 'then' refers directly
452         --           to the local 'bind' rather than going via the dictionary.
453         --
454         -- BUT WATCH OUT!  If the method type mentions the class variable, then
455         -- this optimisation is not right.  Consider
456         --      class C a where
457         --        op :: Eq a => a
458         --
459         --      instance C Int where
460         --        op = op
461         -- The occurrence of 'op' on the rhs gives rise to a constraint
462         --      op at Int
463         -- The trouble is that the 'meth_inst' for op, which is 'available', also
464         -- looks like 'op at Int'.  But they are not the same.
465     let
466         prag_fn        = mkPragFun uprags
467         all_insts      = avail_insts ++ catMaybes meth_insts
468         tc_method_bind = tcMethodBind inst_tyvars' dfun_theta' all_insts prag_fn
469         meth_ids       = [meth_id | (_,meth_id,_) <- meth_infos]
470     in
471
472     mapM tc_method_bind meth_infos              `thenM` \ meth_binds_s ->
473    
474     returnM (meth_ids, unionManyBags meth_binds_s)
475
476
477 -- Derived newtype instances
478 tcMethods origin clas inst_tyvars' dfun_theta' inst_tys' 
479           avail_insts op_items (NewTypeDerived rep_tys)
480   = getInstLoc origin                           `thenM` \ inst_loc ->
481     mapAndUnzip3M (do_one inst_loc) op_items    `thenM` \ (meth_ids, meth_binds, rhs_insts) ->
482     
483     tcSimplifyCheck
484          (ptext SLIT("newtype derived instance"))
485          inst_tyvars' avail_insts rhs_insts     `thenM` \ lie_binds ->
486
487         -- I don't think we have to do the checkSigTyVars thing
488
489     returnM (meth_ids, lie_binds `unionBags` listToBag meth_binds)
490
491   where
492     do_one inst_loc (sel_id, _)
493         = -- The binding is like "op @ NewTy = op @ RepTy"
494                 -- Make the *binder*, like in mkMethodBind
495           tcInstClassOp inst_loc sel_id inst_tys'       `thenM` \ meth_inst ->
496
497                 -- Make the *occurrence on the rhs*
498           tcInstClassOp inst_loc sel_id rep_tys'        `thenM` \ rhs_inst ->
499           let
500              meth_id = instToId meth_inst
501           in
502           return (meth_id, noLoc (VarBind meth_id (nlHsVar (instToId rhs_inst))), rhs_inst)
503
504         -- Instantiate rep_tys with the relevant type variables
505         -- This looks a bit odd, because inst_tyvars' are the skolemised version
506         -- of the type variables in the instance declaration; but rep_tys doesn't
507         -- have the skolemised version, so we substitute them in here
508     rep_tys' = substTys subst rep_tys
509     subst    = zipOpenTvSubst inst_tyvars' (mkTyVarTys inst_tyvars')
510 \end{code}
511
512
513                 ------------------------------
514         [Inline dfuns] Inlining dfuns unconditionally
515                 ------------------------------
516
517 The code above unconditionally inlines dict funs.  Here's why.
518 Consider this program:
519
520     test :: Int -> Int -> Bool
521     test x y = (x,y) == (y,x) || test y x
522     -- Recursive to avoid making it inline.
523
524 This needs the (Eq (Int,Int)) instance.  If we inline that dfun
525 the code we end up with is good:
526
527     Test.$wtest =
528         \r -> case ==# [ww ww1] of wild {
529                 PrelBase.False -> Test.$wtest ww1 ww;
530                 PrelBase.True ->
531                   case ==# [ww1 ww] of wild1 {
532                     PrelBase.False -> Test.$wtest ww1 ww;
533                     PrelBase.True -> PrelBase.True [];
534                   };
535             };
536     Test.test = \r [w w1]
537             case w of w2 {
538               PrelBase.I# ww ->
539                   case w1 of w3 { PrelBase.I# ww1 -> Test.$wtest ww ww1; };
540             };
541
542 If we don't inline the dfun, the code is not nearly as good:
543
544     (==) = case PrelTup.$fEq(,) PrelBase.$fEqInt PrelBase.$fEqInt of tpl {
545               PrelBase.:DEq tpl1 tpl2 -> tpl2;
546             };
547     
548     Test.$wtest =
549         \r [ww ww1]
550             let { y = PrelBase.I#! [ww1]; } in
551             let { x = PrelBase.I#! [ww]; } in
552             let { sat_slx = PrelTup.(,)! [y x]; } in
553             let { sat_sly = PrelTup.(,)! [x y];
554             } in
555               case == sat_sly sat_slx of wild {
556                 PrelBase.False -> Test.$wtest ww1 ww;
557                 PrelBase.True -> PrelBase.True [];
558               };
559     
560     Test.test =
561         \r [w w1]
562             case w of w2 {
563               PrelBase.I# ww ->
564                   case w1 of w3 { PrelBase.I# ww1 -> Test.$wtest ww ww1; };
565             };
566
567 Why doesn't GHC inline $fEq?  Because it looks big:
568
569     PrelTup.zdfEqZ1T{-rcX-}
570         = \ @ a{-reT-} :: * @ b{-reS-} :: *
571             zddEq{-rf6-} _Ks :: {PrelBase.Eq{-23-} a{-reT-}}
572             zddEq1{-rf7-} _Ks :: {PrelBase.Eq{-23-} b{-reS-}} ->
573             let {
574               zeze{-rf0-} _Kl :: (b{-reS-} -> b{-reS-} -> PrelBase.Bool{-3c-})
575               zeze{-rf0-} = PrelBase.zeze{-01L-}@ b{-reS-} zddEq1{-rf7-} } in
576             let {
577               zeze1{-rf3-} _Kl :: (a{-reT-} -> a{-reT-} -> PrelBase.Bool{-3c-})
578               zeze1{-rf3-} = PrelBase.zeze{-01L-} @ a{-reT-} zddEq{-rf6-} } in
579             let {
580               zeze2{-reN-} :: ((a{-reT-}, b{-reS-}) -> (a{-reT-}, b{-reS-})-> PrelBase.Bool{-3c-})
581               zeze2{-reN-} = \ ds{-rf5-} _Ks :: (a{-reT-}, b{-reS-})
582                                ds1{-rf4-} _Ks :: (a{-reT-}, b{-reS-}) ->
583                              case ds{-rf5-}
584                              of wild{-reW-} _Kd { (a1{-rf2-} _Ks, a2{-reZ-} _Ks) ->
585                              case ds1{-rf4-}
586                              of wild1{-reX-} _Kd { (b1{-rf1-} _Ks, b2{-reY-} _Ks) ->
587                              PrelBase.zaza{-r4e-}
588                                (zeze1{-rf3-} a1{-rf2-} b1{-rf1-})
589                                (zeze{-rf0-} a2{-reZ-} b2{-reY-})
590                              }
591                              } } in     
592             let {
593               a1{-reR-} :: ((a{-reT-}, b{-reS-})-> (a{-reT-}, b{-reS-})-> PrelBase.Bool{-3c-})
594               a1{-reR-} = \ a2{-reV-} _Ks :: (a{-reT-}, b{-reS-})
595                             b1{-reU-} _Ks :: (a{-reT-}, b{-reS-}) ->
596                           PrelBase.not{-r6I-} (zeze2{-reN-} a2{-reV-} b1{-reU-})
597             } in
598               PrelBase.zdwZCDEq{-r8J-} @ (a{-reT-}, b{-reS-}) a1{-reR-} zeze2{-reN-})
599
600 and it's not as bad as it seems, because it's further dramatically
601 simplified: only zeze2 is extracted and its body is simplified.
602
603
604 %************************************************************************
605 %*                                                                      *
606 \subsection{Error messages}
607 %*                                                                      *
608 %************************************************************************
609
610 \begin{code}
611 instDeclCtxt1 hs_inst_ty 
612   = inst_decl_ctxt (case unLoc hs_inst_ty of
613                         HsForAllTy _ _ _ (L _ (HsPredTy pred)) -> ppr pred
614                         HsPredTy pred                    -> ppr pred
615                         other                            -> ppr hs_inst_ty)     -- Don't expect this
616 instDeclCtxt2 dfun_ty
617   = inst_decl_ctxt (ppr (mkClassPred cls tys))
618   where
619     (_,_,cls,tys) = tcSplitDFunTy dfun_ty
620
621 inst_decl_ctxt doc = ptext SLIT("In the instance declaration for") <+> quotes doc
622
623 superClassCtxt = ptext SLIT("When checking the super-classes of an instance declaration")
624 \end{code}