[project @ 2003-07-02 14:59:00 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcInstDcls.lhs
index cf705ae..d35c0de 100644 (file)
@@ -49,7 +49,6 @@ import DataCon                ( classDataCon )
 import Class           ( Class, classBigSig )
 import Var             ( idName, idType )
 import NameSet         
-import Id              ( setIdLocalExported )
 import MkId            ( mkDictFunId, rUNTIME_ERROR_ID )
 import FunDeps         ( checkInstFDs )
 import Generics                ( validGenericInstanceType )
@@ -490,7 +489,7 @@ tcInstDecl2 (InstInfo { iDFunId = dfun_id, iBinds = binds })
     addSrcLoc (getSrcLoc dfun_id)                              $
     addErrCtxt (instDeclCtxt (toHsType (idType dfun_id)))      $
     let
-       inst_ty = idType dfun_id
+       inst_ty          = idType dfun_id
        (inst_tyvars, _) = tcSplitForAllTys inst_ty
                -- The tyvars of the instance decl scope over the 'where' part
                -- Those tyvars are inside the dfun_id's type, which is a bit
@@ -593,7 +592,7 @@ tcInstDecl2 (InstInfo { iDFunId = dfun_id, iBinds = binds })
                         [(inst_tyvars', dfun_id, this_dict_id)] 
                         inlines all_binds
     in
-    showLIE "instance"                 `thenM_`
+    showLIE (text "instance")          `thenM_`
     returnM (main_bind `AndMonoBinds` prag_binds `AndMonoBinds` sc_binds_outer)
 
 
@@ -629,6 +628,18 @@ tcMethods clas inst_tyvars inst_tyvars' dfun_theta' inst_tys'
        --
        -- Solution: make meth_insts available, so that 'then' refers directly
        --           to the local 'bind' rather than going via the dictionary.
+       --
+       -- BUT WATCH OUT!  If the method type mentions the class variable, then
+       -- this optimisation is not right.  Consider
+       --      class C a where
+       --        op :: Eq a => a
+       --
+       --      instance C Int where
+       --        op = op
+       -- The occurrence of 'op' on the rhs gives rise to a constraint
+       --      op at Int
+       -- The trouble is that the 'meth_inst' for op, which is 'available', also
+       -- looks like 'op at Int'.  But they are not the same.
     let
        all_insts      = avail_insts ++ catMaybes meth_insts
        xtve           = inst_tyvars `zip` inst_tyvars'