[GHC] #16288: Core Lint error: Occurrence is GlobalId, but binding is LocalId

GHC ghc-devs at haskell.org
Wed Feb 6 10:28:36 UTC 2019


#16288: Core Lint error: Occurrence is GlobalId, but binding is LocalId
-------------------------------------+-------------------------------------
        Reporter:  monoidal          |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.7
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Compile-time      |  Unknown/Multiple
  crash or panic                     |            Test Case:
      Blocked By:                    |             Blocking:  15840
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by aspiwack):

 My understanding is that the issue occurs in this subexpression

 {{{#!haskell
                      let {
                        pretV_r3 :: Doc
                        [LclId]
                        pretV_r3 = wild_Xd } in
                      pretV;
 }}}

 The two `pretV` are displayed differently but have actually the same
 `Unique` (they differ by there locality tag though).

 What I think happened here is that the simplifier saw an expression of the
 form

 {{{#!haskell
 case u of x { pat -> rhs }
 }}}

 And decided to rewrite it to

 {{{#!haskell
 case u of x { pat -> let u = x in rhs }
 }}}

 Where the new `u` has the same unique as the other `u`, so as to shadow
 it, and avoid pushing a substitution through. Fair enough.

 Now the problem is that the new `u` is, as expected, a `LclId`. However,
 the ''original'' `u` happened to be a `GblId`, hence so are all the
 occurrences of `u` in the `rhs`!

 Now, I'm not sure what the appropriate solution is, here. Don't perform
 this transformation when the scrutinee is a global identifier? Or
 something more elaborate. As a matter of fact, I haven't been able to
 locate the part of the simplifier which does this transformation.

 This is a blocker for #15840. Which happened to reveal this issue in a
 very particular set of circumstances (involving the latest version of
 cabal), where it breaks core-lint when building the compiler.

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


More information about the ghc-tickets mailing list