[GHC] #15073: Unable to newtype derive `Prim` via DerivingStrategies

GHC ghc-devs at haskell.org
Fri Apr 20 17:55:05 UTC 2018


#15073: Unable to newtype derive `Prim` via DerivingStrategies
-------------------------------------+-------------------------------------
           Reporter:  fosskers       |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:  8.6.1
          Component:  Compiler       |           Version:  8.2.2
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:  x86_64         |   Type of failure:  None/Unknown
  (amd64)                            |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 The following compiles with both GHC 8.2.2 and 8.4.1:

 {{{#!hs
 newtype Drain = Drain { _drain :: Word8 }
   deriving stock    (Eq, Ord, Show, Generic)
   deriving newtype  (Storable)
   deriving anyclass (NFData)
 }}}

 However, adding `Prim` beside `Storable` in the `newtype` area yields the
 following with GHC 8.2.2:

 {{{
 /home/colin/code/haskell/mapalgebra/lib/Geography/MapAlgebra.hs:1148:21-24:
 error:
     • Illegal unboxed tuple type as function argument:
       (# ghc-prim-0.5.1.1:GHC.Prim.State# s1, Word8 #)
     • In the expression:
         ghc-prim-0.5.1.1:GHC.Prim.coerce
           @(forall (s :: TYPE ghc-prim-0.5.1.1:GHC.Types.LiftedRep).
             ghc-prim-0.5.1.1:GHC.Prim.MutableByteArray# s
             -> ghc-prim-0.5.1.1:GHC.Prim.Int#
                -> ghc-prim-0.5.1.1:GHC.Prim.State# s
                   -> (#,#) ghc-prim-0.5.1.1:GHC.Prim.State# s Word8)
           @(forall (s :: TYPE ghc-prim-0.5.1.1:GHC.Types.LiftedRep).
             ghc-prim-0.5.1.1:GHC.Prim.MutableByteArray# s
             -> ghc-prim-0.5.1.1:GHC.Prim.Int#
                -> ghc-prim-0.5.1.1:GHC.Prim.State# s
                   -> (#,#) ghc-prim-0.5.1.1:GHC.Prim.State# s Drain)
           primitive-0.6.3.0:Data.Primitive.Types.readByteArray#
       In an equation for
 ‘primitive-0.6.3.0:Data.Primitive.Types.readByteArray#’:
           primitive-0.6.3.0:Data.Primitive.Types.readByteArray#
             = ghc-prim-0.5.1.1:GHC.Prim.coerce
                 @(forall (s :: TYPE ghc-prim-0.5.1.1:GHC.Types.LiftedRep).
                   ghc-prim-0.5.1.1:GHC.Prim.MutableByteArray# s
                   -> ghc-prim-0.5.1.1:GHC.Prim.Int#
                      -> ghc-prim-0.5.1.1:GHC.Prim.State# s
                         -> (#,#) ghc-prim-0.5.1.1:GHC.Prim.State# s Word8)
                 @(forall (s :: TYPE ghc-prim-0.5.1.1:GHC.Types.LiftedRep).
                   ghc-prim-0.5.1.1:GHC.Prim.MutableByteArray# s
                   -> ghc-prim-0.5.1.1:GHC.Prim.Int#
                      -> ghc-prim-0.5.1.1:GHC.Prim.State# s
                         -> (#,#) ghc-prim-0.5.1.1:GHC.Prim.State# s Drain)
 }}}

 and this with GHC 8.4.1:

 {{{
     Illegal kind: ((:) (ghc-prim-0.5.2.0:GHC.Types.TupleRep ([] :: [] ghc-
 prim-0.5.2.0:GHC.Types.RuntimeR
 ep)) ((:) ghc-prim-0.5.2.0:GHC.Types.LiftedRep ([] :: [] ghc-
 prim-0.5.2.0:GHC.Types.RuntimeRep) :: []
 ghc-prim-0.5.2.0:GHC.Types.RuntimeRep) :: [] ghc-
 prim-0.5.2.0:GHC.Types.RuntimeRep)
     Did you mean to enable TypeInType?
      |
 1132 |   deriving newtype  (Storable, Prim)
      |
 }}}
 Turning on `TypeInType` as it suggests gives the same `Illegal unboxed
 tuple...` error.

 I've hand-written `Storable` instances before so I'm confident in its
 derivation, but I otherwise know nothing about `Prim`. Is there something
 magical about it that prevents it from being newtype derived in the same
 way?

 Thank you kindly,

 Colin

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15073>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list