
#12115: CoreLint error in safe program -------------------------------------+------------------------------------- Reporter: osa1 | Owner: Type: bug | Status: merge Priority: normal | Milestone: Component: Compiler | Version: 8.0.1 Resolution: fixed | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: | codegen/should_compile/T12115 Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by goldfire): I'm a bit lost with these patches. - The commentary says that `(# #)` becomes `Void#` during unarisation. But there is also a change in !TysWiredIn that removes the special case for nullary unboxed tuples. - `Note [The kind invariant]` is awfully out-of-date: {{{ Note [The kind invariant] ~~~~~~~~~~~~~~~~~~~~~~~~~ The kinds # UnliftedTypeKind OpenKind super-kind of *, # can never appear under an arrow or type constructor in a kind; they can only be at the top level of a kind. It follows that primitive TyCons, which have a naughty pseudo-kind State# :: * -> # must always be saturated, so that we can never get a type whose kind has a UnliftedTypeKind or ArgTypeKind underneath an arrow. Nor can we abstract over a type variable with any of these kinds. k :: = kk | # | ArgKind | (#) | OpenKind kk :: = * | kk -> kk | T kk1 ... kkn So a type variable can only be abstracted kk. }}} (I'm sure I'm implicated in letting this fall out-of-date. But I honestly don't know how to fix.) There is no `#` anymore, and there is no `OpenKind` anymore. One might think this means that a representation-polymorphic kind (that is, `TYPE r`) cannot appear below top-level, but indeed they do, as in the type of `error`. So I'm not sure what this is saying. Also, this Note is missing ''why'' these restrictions are in place. I recall several months ago moving to allow unsaturated unlifted things, but now we've backpedaled on this decision. I'm sure there's a good reason, but what is it? This Note is also missing ''where'' these restrictions are enforced. Is there a check in !CoreLint that we never abstract over a kind `* -> TYPE <something unlifted>`? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12115#comment:8 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler