X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Ftypes%2FTyCon.lhs;h=235097369f22fe8e600fed4377757b3240a75390;hb=9a82b1ffa35fa4c3927c66a1037a37d436cf6aac;hp=b552c24b63f1649a3f7b080eed57b011c33ad3d1;hpb=d2ce0f52d42edf32bb9f13796e6ba6edba8bd516;p=ghc-hetmet.git diff --git a/compiler/types/TyCon.lhs b/compiler/types/TyCon.lhs index b552c24..2350973 100644 --- a/compiler/types/TyCon.lhs +++ b/compiler/types/TyCon.lhs @@ -440,7 +440,7 @@ data AlgTyConRhs -- (see the tag assignment in DataCon.mkDataCon) is_enum :: Bool -- ^ Cached value: is this an enumeration type? - -- (See 'isEnumerationTyCon') + -- See Note [Enumeration types] } -- | Information about those 'TyCon's derived from a @newtype@ declaration @@ -500,7 +500,24 @@ data TyConParent -- | An *associated* type of a class. | AssocFamilyTyCon - Class -- The class in whose declaration the family is declared + Class -- The class in whose declaration the family is declared + -- The 'tyConTyVars' of this 'TyCon' may mention some + -- of the same type variables as the classTyVars of the + -- parent 'Class'. E.g. + -- + -- @ + -- class C a b where + -- data T c a + -- @ + -- + -- Here the 'a' is shared with the 'Class', and that is + -- important. In an instance declaration we expect the + -- two to be instantiated the same way. Eg. + -- + -- @ + -- instanc C [x] (Tree y) where + -- data T c [x] = T1 x | T2 c + -- @ -- | Type constructors representing an instance of a type family. Parameters: -- @@ -539,12 +556,14 @@ isNoParent _ = False -- | Information pertaining to the expansion of a type synonym (@type@) data SynTyConRhs - = SynonymTyCon -- ^ An ordinary type synony - Type -- ^ The rhs, which mentions head type variables. It acts as a - -- template for the expansion when the 'TyCon' is applied to some - -- types. + = -- | An ordinary type synonyn. + SynonymTyCon + Type -- This 'Type' is the rhs, and may mention from 'tyConTyVars'. + -- It acts as a template for the expansion when the 'TyCon' + -- is applied to some types. - | SynFamilyTyCon -- A type synonym family e.g. type family F x y :: * -> * + -- | A type synonym family e.g. @type family F x y :: * -> *@ + | SynFamilyTyCon -------------------- data CoTyConDesc @@ -561,6 +580,16 @@ data CoTyConDesc | CoUnsafe \end{code} +Note [Enumeration types] +~~~~~~~~~~~~~~~~~~~~~~~~ +We define datatypes with no constructors to not be +enumerations; this fixes trac #2578, Otherwise we +end up generating an empty table for + __closure_tbl +which is used by tagToEnum# to map Int# to constructors +in an enumeration. The empty table apparently upset +the linker. + Note [Newtype coercions] ~~~~~~~~~~~~~~~~~~~~~~~~ The NewTyCon field nt_co is a a TyCon (a coercion constructor in fact) @@ -964,6 +993,7 @@ isGadtSyntaxTyCon _ = False -- | Is this an algebraic 'TyCon' which is just an enumeration of values? isEnumerationTyCon :: TyCon -> Bool +-- See Note [Enumeration types] in TyCon isEnumerationTyCon (AlgTyCon {algTcRhs = DataTyCon { is_enum = res }}) = res isEnumerationTyCon (TupleTyCon {tyConArity = arity}) = arity == 0 isEnumerationTyCon _ = False