summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel M T Chakravarty <chak@cse.unsw.edu.au>2006-10-19 18:01:03 +0000
committerManuel M T Chakravarty <chak@cse.unsw.edu.au>2006-10-19 18:01:03 +0000
commit97236c9f9c903d01d99ada4e440fb9c37c6b27fd (patch)
treeafe58f0e65ce8129ac1238900f3fc5a7ce56a15d
parentf515d87a510f9cd3d416d83e95e6e0f0298f7d18 (diff)
downloadhaskell-97236c9f9c903d01d99ada4e440fb9c37c6b27fd.tar.gz
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).
-rw-r--r--compiler/types/TyCon.lhs29
1 files changed, 20 insertions, 9 deletions
diff --git a/compiler/types/TyCon.lhs b/compiler/types/TyCon.lhs
index eb0474bafe..2e7427c89f 100644
--- a/compiler/types/TyCon.lhs
+++ b/compiler/types/TyCon.lhs
@@ -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}