[GHC] #15110: Exitification abstracts over shadowed variables

GHC ghc-devs at haskell.org
Tue May 1 15:06:22 UTC 2018


#15110: Exitification abstracts over shadowed variables
-------------------------------------+-------------------------------------
           Reporter:  nomeata        |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:  8.6.1
          Component:  Compiler       |           Version:  8.5
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 Simon did some code review of `Exitify.hs` in
 https://ghc.haskell.org/trac/ghc/ticket/14152#comment:36 and he was onto
 something; the code is wrong after all:

 Consider this core term
 {{{
   joinrec j (x :: Bool) (x :: Int) =
     if x == 0
     then foo x
     else jump j True (x - 1)
   in …
 }}}
 where the two parameters `x` and `x` are different variables, but shadow
 each other (i.e. have the same unique). This is legal Core!

 But Exitification chooses the variables to abstract over in this line:
 {{{
         -- The possible arguments of this exit join point
         -- No need for `sortQuantVars`, `captured` is already in
 dependency order
         abs_vars = map zap $ filter (`elemVarSet` fvs) captured
 }}}
 where `captured = [x::Bool,x::Int]` in this case, which would yield this
 code

 {{{
   join exit (x :: Bool) (x :: Int) = foo x in
   joinrec j (x :: Bool) (x :: Int) =
     if x == 0
     then jump exit (x::Bool) (x::Int)
     else jump j True (x - 1)
   in …
 }}}
 which is no longer type correct (or even “scope-correct”) any more, as it
 passes the `Int`-typed `x` as the `Bool` argument to `exit`.

 The conditions where this happens, i.e. such shadowing, is rather obscure
 so I did not even try to produce a lint error here. It also means that
 this is rather low severity, but I’ll still go and fix it.

 An application of `reverseNub` seems to be in order – or simply switching
 to keeping `captured` in a `DVarSet` rather than a list (in which case
 `sortQuantVars` would be required…)

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


More information about the ghc-tickets mailing list