Skip to content
  • Andrew Martin's avatar
    Implement the -XUnliftedNewtypes extension. · effdd948
    Andrew Martin authored and Marge Bot's avatar Marge Bot committed
    GHC Proposal: 0013-unlifted-newtypes.rst
    Discussion: https://github.com/ghc-proposals/ghc-proposals/pull/98
    
    
    Issues: #15219, #1311, #13595, #15883
    Implementation Details:
      Note [Implementation of UnliftedNewtypes]
      Note [Unifying data family kinds]
      Note [Compulsory newtype unfolding]
    
    This patch introduces the -XUnliftedNewtypes extension. When this
    extension is enabled, GHC drops the restriction that the field in
    a newtype must be of kind (TYPE 'LiftedRep). This allows types
    like Int# and ByteArray# to be used in a newtype. Additionally,
    coerce is made levity-polymorphic so that it can be used with
    newtypes over unlifted types.
    
    The bulk of the changes are in TcTyClsDecls.hs. With -XUnliftedNewtypes,
    getInitialKind is more liberal, introducing a unification variable to
    return the kind (TYPE r0) rather than just returning (TYPE 'LiftedRep).
    When kind-checking a data constructor with kcConDecl, we attempt to
    unify the kind of a newtype with the kind of its field's type. When
    typechecking a data declaration with tcTyClDecl, we again perform a
    unification. See the implementation note for more on this.
    
    Co-authored-by: Richard Eisenberg's avatarRichard Eisenberg <rae@richarde.dev>
    effdd948