
#14118: Strangeness regarding STG alternative types and linter -------------------------------------+------------------------------------- Reporter: bgamari | Owner: (none) Type: bug | Status: patch Priority: normal | Milestone: 8.4.1 Component: Compiler | Version: 8.2.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Phab:D3858 Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj):
it seems like GHC is supposed to maintain the invariant that we will not use the case binder in the RHS if it is an unboxed tuple or sum
Ah. That is true after the Unarise pass, but not before. (That's a change we brought in a few years back.) E.g. we can write {{{ f :: (# Int, Bool #) -> Int f x = ... g :: Bool -> (# Int, Bool #) }}} and then call it thus {{{ f (g True) }}} By the time we translate to STG that'll look like {{{ case g True of (r :: (# Int, Bool #)) -> f r }}} and I think that's what is happening here. But the Unarise pass transforms it to {{{ case g True of (# (x::Int), (y::Bool) #) -> f x y }}} by making f take two explicit arguments. Can you check that the problem is gone after Unarise? It'd be ideal for STG lint to have a flag that checked the stronger invariant after Unarise. Incidentally, this should also be true of lambda binders, whether used or not; before Unarise they can be unboxed tuples, but not after. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14118#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler