Commit 97236c9f authored by chak@cse.unsw.edu.au.'s avatar chak@cse.unsw.edu.au.
Browse files

Fix family instance bug due to the name parent elimination

- Its important that `isImplicitTyCon' considers
  (a) associated families to be implicit, but
  (b) considers family instances *not* to be implicit (for the same reasons 
      that a dfun is not implicit).
parent f515d87a
......@@ -13,7 +13,7 @@ module TyCon(
tyConPrimRep,
AlgTyConRhs(..), visibleDataCons,
AlgTyConParent(..), hasParent,
AlgTyConParent(..),
SynTyConRhs(..),
isFunTyCon, isUnLiftedTyCon, isProductTyCon,
......@@ -114,6 +114,8 @@ data TyCon
-- argument list (starting from 0).
-- NB: Length is less than tyConArity
-- if higher kind signature.
-- NB: Just _ <=> associated (not
-- toplevel) family
algTcSelIds :: [Id], -- Its record selectors (empty if none)
......@@ -279,10 +281,6 @@ data AlgTyConParent = -- An ordinary type constructor has no parent.
-- the representation type
-- with the type instance
hasParent :: AlgTyConParent -> Bool
hasParent NoParentTyCon = False
hasParent _other = True
data SynTyConRhs
= OpenSynTyCon Kind -- Type family: *result* kind given
| SynonymTyCon Type -- Mentioning head type vars. Acts as a template for
......@@ -674,11 +672,24 @@ isCoercionTyCon :: TyCon -> Bool
isCoercionTyCon (CoercionTyCon {}) = True
isCoercionTyCon other = False
-- Identifies implicit tycons that, in particular, do not go into interface
-- files (because they are implicitly reconstructed when the interface is
-- read).
--
-- Note that
--
-- * associated families are implicit, as they are re-constructed from
-- the class declaration in which they reside, and
-- * family instances are *not* implicit as they represent the instance body
-- (similar to a dfun does that for a class instance).
--
isImplicitTyCon :: TyCon -> Bool
isImplicitTyCon SynTyCon{} = False
isImplicitTyCon AlgTyCon{algTcParent = parent} = hasParent parent
isImplicitTyCon other = True
-- catches: FunTyCon, TupleTyCon, PrimTyCon,
isImplicitTyCon tycon | isTyConAssoc tycon = True
| isSynTyCon tycon = False
| isAlgTyCon tycon = isClassTyCon tycon ||
isTupleTyCon tycon
isImplicitTyCon _other = True
-- catches: FunTyCon, PrimTyCon,
-- CoercionTyCon, SuperKindTyCon
\end{code}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment