X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Ftypecheck%2FTcEnv.lhs;h=787616aa3e60c0c9f6a106cae148ffe898c85371;hb=940524aec90652b5ef81789c9a453c57c0e42cc9;hp=e1b9bd31b70c912cf74f7b61754aa43d89c77fb6;hpb=84923cc7de2a93c22a2f72daf9ac863959efae13;p=ghc-hetmet.git diff --git a/compiler/typecheck/TcEnv.lhs b/compiler/typecheck/TcEnv.lhs index e1b9bd3..787616a 100644 --- a/compiler/typecheck/TcEnv.lhs +++ b/compiler/typecheck/TcEnv.lhs @@ -55,7 +55,6 @@ import TcMType import TcType import TcGadt import qualified Type -import Id import Var import VarSet import VarEnv @@ -170,10 +169,18 @@ tcLookupFamInst tycon tys ; eps <- getEps ; let instEnv = (eps_fam_inst_env eps, tcg_fam_inst_env env) ; case lookupFamInstEnv instEnv tycon tys of - [(subst,fam_inst)] -> return (rep_tc, substTyVars subst (tyConTyVars rep_tc)) + + [(subst, fam_inst)] | variable_only_subst -> + return (rep_tc, substTyVars subst (tyConTyVars rep_tc)) where -- NB: assumption is that (tyConTyVars rep_tc) is in -- the domain of the substitution - rep_tc = famInstTyCon fam_inst + rep_tc = famInstTyCon fam_inst + subst_domain = varEnvElts . getTvSubstEnv $ subst + tvs = map (Type.getTyVar "tcLookupFamInst") + subst_domain + variable_only_subst = all Type.isTyVarTy subst_domain && + sizeVarSet (mkVarSet tvs) == length tvs + -- renaming may have no repetitions other -> famInstNotFound tycon tys other } @@ -628,7 +635,7 @@ Make a name for the dict fun for an instance decl. It's an *external* name, like otber top-level names, and hence must be made with newGlobalBinder. \begin{code} -newDFunName :: Class -> [Type] -> SrcLoc -> TcM Name +newDFunName :: Class -> [Type] -> SrcSpan -> TcM Name newDFunName clas (ty:_) loc = do { index <- nextDFunIndex ; is_boot <- tcIsHsBoot @@ -642,12 +649,12 @@ newDFunName clas (ty:_) loc newDFunName clas [] loc = pprPanic "newDFunName" (ppr clas <+> ppr loc) \end{code} -Make a name for the representation tycon of a data/newtype instance. It's an +Make a name for the representation tycon of a family instance. It's an *external* name, like otber top-level names, and hence must be made with newGlobalBinder. \begin{code} -newFamInstTyConName :: Name -> SrcLoc -> TcM Name +newFamInstTyConName :: Name -> SrcSpan -> TcM Name newFamInstTyConName tc_name loc = do { index <- nextDFunIndex ; mod <- getModule @@ -678,9 +685,9 @@ wrongThingErr expected thing name ptext SLIT("used as a") <+> text expected) famInstNotFound tycon tys what - = failWithTc (msg <+> quotes (ppr tycon <+> hsep (map pprParendType tys))) + = failWithTc (msg <+> quotes (pprTypeApp (ppr tycon) tys)) where - msg = case what of - [] -> ptext SLIT("No instance for") - xs -> ptext SLIT("More than one instance for") + msg = ptext $ if length what > 1 + then SLIT("More than one family instance for") + else SLIT("No family instance exactly matching") \end{code}