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 )
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
[(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)
--
-- 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'