That does seem odd.

Use -dppr-debug so you can see the actual unique on each Id, just to make sure 
the print-name isn't different from the underlying unique.

In an older version of GHC (before March 2012; patch below) variables could not 
be bound to unboxed tuples, so if your fork is based on a sufficiently old 
version that might be a problem.

Aha.  Before the patch below, I see this code in Core Lint

     -- If the binder is an unboxed tuple type, don't put it in scope
     ; let scope = if (isUnboxedTupleType (idType var)) then 
                       pass_var 
                   else lintAndScopeId var

and indeed the patch below removes those lines.  So that's it.  You need to 
update. Whether you can do so for just this one patch is more than I can say!

Simon

commit 09987de4ece1fc634af6b2b37173b12ed46fdf3e
Author: Max Bolingbroke <[email protected]>
Date:   Sun Mar 18 00:00:38 2012 +0000

    Support code generation for unboxed-tuple function arguments
    
    This is done by a 'unarisation' pre-pass at the STG level which
    translates away all (live) binders binding something of unboxed
    tuple type.
    
    This has the following knock-on effects:
      * The subkind hierarchy is vastly simplified (no UbxTupleKind or ArgKind)
      * Various relaxed type checks in typechecker, 'foreign import prim' etc
      * All case binders may be live at the Core level


|  -----Original Message-----
|  From: [email protected] 
| [mailto:glasgow-haskell-users-  [email protected]] On Behalf Of 
| Ranjit Jhala
|  Sent: 18 March 2013 18:06
|  To: [email protected]
|  Subject: scope invariants in core
|  
|  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 {
|          lq_anf__d11x
|            :: GHC.Prim.State# GHC.Prim.RealWorld
|               -> (# GHC.Prim.State# GHC.Prim.RealWorld, GHC.Word.Word32 #)
|          [LclId]
|          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
|                [LclId]
|                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!
|  
|  Ranjit.
|  
|  _______________________________________________
|  Glasgow-haskell-users mailing list
|  [email protected]
|  http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

_______________________________________________
Glasgow-haskell-users mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to