Skip to content
Snippets Groups Projects
Commit e3dc71de authored by Simon Peyton Jones's avatar Simon Peyton Jones Committed by Ian Lynagh
Browse files

Allow existential data constructors to be promoted

This reverts the change in Trac #7347, which prevented promotion
of existential data constructors.  Ones with constraints in
their types, or kind polymorphism, still can't be promoted.
parent 3e1925ac
No related merge requests found
...@@ -391,6 +391,7 @@ data DataCon ...@@ -391,6 +391,7 @@ data DataCon
-- The actual fixity is stored elsewhere -- The actual fixity is stored elsewhere
dcPromoted :: Maybe TyCon -- The promoted TyCon if this DataCon is promotable dcPromoted :: Maybe TyCon -- The promoted TyCon if this DataCon is promotable
-- See Note [Promoted data constructors] in TyCon
} }
deriving Data.Typeable.Typeable deriving Data.Typeable.Typeable
...@@ -559,9 +560,10 @@ mkDataCon name declared_infix ...@@ -559,9 +560,10 @@ mkDataCon name declared_infix
mkFunTys rep_arg_tys $ mkFunTys rep_arg_tys $
mkTyConApp rep_tycon (mkTyVarTys univ_tvs) mkTyConApp rep_tycon (mkTyVarTys univ_tvs)
mb_promoted mb_promoted -- See Note [Promoted data constructors] in TyCon
| is_vanilla -- No existentials or context | all (isLiftedTypeKind . tyVarKind) (univ_tvs ++ ex_tvs)
, all (isLiftedTypeKind . tyVarKind) univ_tvs -- No kind polymorphism, and all of kind *
, null full_theta -- No constraints
, all isPromotableType orig_arg_tys , all isPromotableType orig_arg_tys
= Just (mkPromotedDataCon con name (getUnique name) prom_kind arity) = Just (mkPromotedDataCon con name (getUnique name) prom_kind arity)
| otherwise | otherwise
......
...@@ -581,8 +581,10 @@ Note [Promoted data constructors] ...@@ -581,8 +581,10 @@ Note [Promoted data constructors]
A data constructor can be promoted to become a type constructor, A data constructor can be promoted to become a type constructor,
via the PromotedTyCon alternative in TyCon. via the PromotedTyCon alternative in TyCon.
* Only "vanilla" data constructors are promoted; ones with no GADT * Only data constructors with
stuff, no existentials, etc. We might generalise this later. (a) no kind polymorphism
(b) no constraints in its type (eg GADTs)
are promoted. Existentials are ok; see Trac #7347.
* The TyCon promoted from a DataCon has the *same* Name and Unique as * The TyCon promoted from a DataCon has the *same* Name and Unique as
the DataCon. Eg. If the data constructor Data.Maybe.Just(unique 78, the DataCon. Eg. If the data constructor Data.Maybe.Just(unique 78,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment