Store a SrcSpan instead of a SrcLoc inside a Name
[ghc-hetmet.git] / compiler / typecheck / TcEnv.lhs
index e1b9bd3..787616a 100644 (file)
@@ -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}