[commit: ghc] master: Allow existential data constructors to be promoted (c0d8469)

Simon Peyton Jones <[email protected]>
Newsgroups gmane.comp.lang.haskell.cvs.ghc
Message-ID <[email protected]>
Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/c0d846917846d303be48d9dc43fb047863ed14ea

>---------------------------------------------------------------

commit c0d846917846d303be48d9dc43fb047863ed14ea
Author: Simon Peyton Jones <[email protected]>
Date:   Wed Dec 5 11:07:38 2012 +0000

    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.

>---------------------------------------------------------------

 compiler/basicTypes/DataCon.lhs |    8 +++++---
 compiler/types/TyCon.lhs        |    6 ++++--
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/compiler/basicTypes/DataCon.lhs b/compiler/basicTypes/DataCon.lhs
index e244c0d..9516e4e 100644
--- a/compiler/basicTypes/DataCon.lhs
+++ b/compiler/basicTypes/DataCon.lhs
@@ -391,6 +391,7 @@ data DataCon
 				-- The actual fixity is stored elsewhere
 
         dcPromoted :: Maybe TyCon    -- The promoted TyCon if this DataCon is promotable
+                                     -- See Note [Promoted data constructors] in TyCon
   }
   deriving Data.Typeable.Typeable
 
@@ -559,9 +560,10 @@ mkDataCon name declared_infix
 	  mkFunTys rep_arg_tys $
 	  mkTyConApp rep_tycon (mkTyVarTys univ_tvs)
 
-    mb_promoted 
-      | is_vanilla   -- No existentials or context
-      , all (isLiftedTypeKind . tyVarKind) univ_tvs
+    mb_promoted   -- See Note [Promoted data constructors] in TyCon
+      | all (isLiftedTypeKind . tyVarKind) (univ_tvs ++ ex_tvs)
+                          -- No kind polymorphism, and all of kind *
+      , null full_theta   -- No constraints
       , all isPromotableType orig_arg_tys
       = Just (mkPromotedDataCon con name (getUnique name) prom_kind arity)
       | otherwise 
diff --git a/compiler/types/TyCon.lhs b/compiler/types/TyCon.lhs
index c686847..458f5c6 100644
--- a/compiler/types/TyCon.lhs
+++ b/compiler/types/TyCon.lhs
@@ -596,8 +596,10 @@ Note [Promoted data constructors]
 A data constructor can be promoted to become a type constructor,
 via the PromotedTyCon alternative in TyCon.
 
-* Only "vanilla" data constructors are promoted; ones with no GADT
-  stuff, no existentials, etc.  We might generalise this later.
+* Only data constructors with  
+     (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 DataCon.  Eg. If the data constructor Data.Maybe.Just(unique 78,
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.