scope invariants in core

Ranjit Jhala jhala at
Mon Mar 18 19:06:00 CET 2013

Hi all,

I have been manipulating CoreExpr to convert it to A-Normal Form.
Mostly, things have been working fine, but I hit an error this
morning of the form:

    lq_anf__d11u is out of scope

where lq_anf__d11u is a binder I have introduced in the transformed expression

    Data.ByteString.Internal.c_strlen =
   (\ (ds_d11l :: GHC.Ptr.Ptr Foreign.C.Types.CChar) ->
      case ds_d11l of lq_anf__d11t { GHC.Ptr.Ptr ds_d11n ->
      let {
          :: GHC.Prim.State# GHC.Prim.RealWorld
             -> (# GHC.Prim.State# GHC.Prim.RealWorld, GHC.Word.Word32 #)
        lq_anf__d11x =
          \ (ds_d11q :: GHC.Prim.State# GHC.Prim.RealWorld) ->
            case {__pkg_ccall main strlen GHC.Prim.Addr#
                         -> GHC.Prim.State# GHC.Prim.RealWorld
                         -> (# GHC.Prim.State# GHC.Prim.RealWorld,
GHC.Prim.Word# #)}
                   ds_d11n ds_d11q
            of lq_anf__d11u { __DEFAULT ->
            case lq_anf__d11u of lq_anf__d11v { (# ds_d11p, ds_d11o #) ->
            let {
              lq_anf__d11w :: GHC.Word.Word32
              lq_anf__d11w = GHC.Word.W32# ds_d11o } in
            (# ds_d11p, lq_anf__d11w #)
            } } in
      GHC.Types.IO @ GHC.Word.Word32 lq_anf__d11x

It would appear, that the variable IS in scope (as it is bound by
the case-expression just before it is used, but perhaps the binder
is not added to the environment because of its type (# ... , ... #)?
Or is there some other invariant I am breaking?

Can anyone familiar with the scoping invariants of CoreExpr/CoreSyn
give me a hint as to what might be happening?

Many thanks in advance!


More information about the Glasgow-haskell-users mailing list