[GHC] #14185: Non-local bug reporting around levity polymorphism

GHC ghc-devs at haskell.org
Mon Sep 4 23:05:54 UTC 2017


#14185: Non-local bug reporting around levity polymorphism
-------------------------------------+-------------------------------------
           Reporter:  goldfire       |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.3
           Keywords:                 |  Operating System:  Unknown/Multiple
  LevityPolymorphism,                |
  TypeErrorMessages                  |
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 From comment:12:ticket:13105.

 In HEAD (or, at least, my version, on the `wip/rae` branch), this code

 {{{#!hs
 class Unbox (t :: *) (r :: TYPE k) | t -> r, r -> t where
   unbox :: t -> r
   box :: r -> t

 instance Unbox Int Int# where
   unbox (I# i) = i
   box i = I# i

 instance Unbox Char Char# where
   unbox (C# c) = c
   box c = C# c

 instance (Unbox a a', Unbox b b') => Unbox (a,b) (# a', b' #) where
   unbox (a,b) = (# unbox a, unbox b #)
   box (# a, b #) = (box a, box b)

 testInt :: Int
 testInt = box (unbox 1)

 testTup :: (Int, Char)
 testTup = box (unbox (1, 'a'))
 }}}

 fails with

 {{{
 Bug.hs:27:11: error:
     • Couldn't match a lifted type with an unlifted type
       When matching types
         a' :: *
         Int# :: TYPE 'IntRep
     • In the expression: box (unbox 1)
       In an equation for ‘testInt’: testInt = box (unbox 1)
    |
 27 | testInt = box (unbox 1)
    |           ^^^^^^^^^^^^^

 Bug.hs:27:16: error:
     • Couldn't match a lifted type with an unlifted type
       When matching types
         a' :: *
         Int# :: TYPE 'IntRep
     • In the first argument of ‘box’, namely ‘(unbox 1)’
       In the expression: box (unbox 1)
       In an equation for ‘testInt’: testInt = box (unbox 1)
    |
 27 | testInt = box (unbox 1)
    |                ^^^^^^^

 Bug.hs:42:11: error:
     • Couldn't match a lifted type with an unlifted type
       When matching types
         a' :: *
         Int# :: TYPE 'IntRep
     • In the expression: box (unbox (1, 'a'))
       In an equation for ‘testTup’: testTup = box (unbox (1, 'a'))
    |
 42 | testTup = box (unbox (1, 'a'))
    |           ^^^^^^^^^^^^^^^^^^^^
 }}}

 I think it should succeed. Worse, when I comment out the `testTup`
 definition, the file succeeds... but note that two of the errors above are
 in `testInt`, which compiles fine on its own.

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


More information about the ghc-tickets mailing list