import ListSetOps
import Outputable
import Bag
+
+import Monad (unless)
\end{code}
%************************************************************************
full_tc_args = tc_args ++ mkTyVarTys extra_tvs
full_tvs = tvs ++ extra_tvs
- ; (rep_tc, rep_tc_args) <- tcLookupFamInst tycon full_tc_args
+ ; (rep_tc, rep_tc_args) <- tcLookupFamInstExact tycon full_tc_args
; gla_exts <- doptM Opt_GlasgowExts
; overlap_flag <- getOverlapFlag
- ; if isDataTyCon tycon then
+
+ -- Be careful to test rep_tc here: in the case of families, we want
+ -- to check the instance tycon, not the family tycon
+ ; if isDataTyCon rep_tc then
mkDataTypeEqn orig gla_exts full_tvs cls cls_tys
tycon full_tc_args rep_tc rep_tc_args
else
baleOut err = addErrTc err >> returnM (Nothing, Nothing)
\end{code}
+Auxiliary lookup wrapper which requires that looked up family instances are
+not type instances.
+
+\begin{code}
+tcLookupFamInstExact :: TyCon -> [Type] -> TcM (TyCon, [Type])
+tcLookupFamInstExact tycon tys
+ = do { result@(rep_tycon, rep_tys) <- tcLookupFamInst tycon tys
+ ; let { tvs = map (Type.getTyVar
+ "TcDeriv.tcLookupFamInstExact")
+ rep_tys
+ ; variable_only_subst = all Type.isTyVarTy rep_tys &&
+ sizeVarSet (mkVarSet tvs) == length tvs
+ -- renaming may have no repetitions
+ }
+ ; unless variable_only_subst $
+ famInstNotFound tycon tys [result]
+ ; return result
+ }
+
+\end{code}
+
%************************************************************************
%* *
| isProductTyCon rep_tc = Nothing
| otherwise = Just why
where
- why = (pprSourceTyCon rep_tc) <+>
+ why = quotes (pprSourceTyCon rep_tc) <+>
ptext SLIT("has more than one constructor")
cond_typeableOK :: Condition
new_dfun_name clas tycon -- Just a simple wrapper
- = newDFunName clas [mkTyConApp tycon []] (getSrcLoc tycon)
+ = newDFunName clas [mkTyConApp tycon []] (getSrcSpan tycon)
-- The type passed to newDFunName is only used to generate
-- a suitable string; hence the empty type arg list
\end{code}
-- In case of a family instance, we need to use the representation
-- tycon (after all, it has the data constructors)
- ; (tycon, _) <- tcLookupFamInst visible_tycon tyArgs
+ ; (tycon, _) <- tcLookupFamInstExact visible_tycon tyArgs
; let (meth_binds, aux_binds) = genDerivBinds clas fix_env tycon
-- Bring the right type variables into
nest 2 (ptext SLIT("Offending constraint:") <+> ppr pred)]
\end{code}
-
\ No newline at end of file
+