diff options
author | Manuel M T Chakravarty <chak@cse.unsw.edu.au> | 2006-10-19 18:01:03 +0000 |
---|---|---|
committer | Manuel M T Chakravarty <chak@cse.unsw.edu.au> | 2006-10-19 18:01:03 +0000 |
commit | 97236c9f9c903d01d99ada4e440fb9c37c6b27fd (patch) | |
tree | afe58f0e65ce8129ac1238900f3fc5a7ce56a15d | |
parent | f515d87a510f9cd3d416d83e95e6e0f0298f7d18 (diff) | |
download | haskell-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.lhs | 29 |
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} |