-Note [Looking up family instances for deriving]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-tcLookupFamInstExact is an auxiliary lookup wrapper which requires
-that looked-up family instances exist. If called with a vanilla
-tycon, the old type application is simply returned.
-
-If we have
- data instance F () = ... deriving Eq
- data instance F () = ... deriving Eq
-then tcLookupFamInstExact will be confused by the two matches;
-but that can't happen because tcInstDecls1 doesn't call tcDeriving
-if there are any overlaps.
-
-There are two other things that might go wrong with the lookup.
-First, we might see a standalone deriving clause
- deriving Eq (F ())
-when there is no data instance F () in scope.
-
-Note that it's OK to have
- data instance F [a] = ...
- deriving Eq (F [(a,b)])
-where the match is not exact; the same holds for ordinary data types
-with standalone deriving declrations.
-
-\begin{code}
-tcLookupFamInstExact :: TyCon -> [Type] -> TcM (TyCon, [Type])
-tcLookupFamInstExact tycon tys
- | not (isOpenTyCon tycon)
- = return (tycon, tys)
- | otherwise
- = do { maybeFamInst <- tcLookupFamInst tycon tys
- ; case maybeFamInst of
- Nothing -> famInstNotFound tycon tys
- Just famInst -> return famInst
- }
-
-famInstNotFound :: TyCon -> [Type] -> TcM a
-famInstNotFound tycon tys
- = failWithTc (ptext (sLit "No family instance for")
- <+> quotes (pprTypeApp tycon tys))
-\end{code}
-