
#15627: Absent unlifted bindings -------------------------------------+------------------------------------- Reporter: sgraf | Owner: (none) Type: task | Status: new Priority: normal | Milestone: ⊥ Component: Compiler | Version: 8.4.3 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: #9279 #4328 | Differential Rev(s): #11126 | Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): No -- don't put a `TyCon` in `RubbishLit`. Instead: {{{ data Literal = RubbishAddr -- Replaces MachNullAddr | RubbishLit | ...as before... literalType RubbishAddr = Addr# literalType RubbishLit = forall (a :: TYPE UnliftedRep). a }}} So now, the core term {{{ (Literal RubbishLit) `App` (Type (TyConApp MutVar# [Int])) }}} We can't use `(RubbishLit @Addr#)` for `RubbishAddr` because `Addr# :: TYPE AddrRep`, which is ill-kinded. Actually, I suppose that some C APIs might want the null addr (zero, I think?) specifically, rather than "any old rubbish value", so maybe we want to retain `MachNullAddr` rather than replace it with `RubbishAddr`. Yet another variant would be to give `RubbishLit` the type `forall r (a::TYPE r). a`. Operationally, we simply don't initialise `RubbishLit` values; whereas using `0` for `Int#` and `'x'` for `Char#` still forces us to initialise. I'd be inclined to stick with the non-levity-polymorphic version initially. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15627#comment:9 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler