Hi Richard,

Thanks for the reply. The problem has something to do with how LH currently handles symbols. Internally, LH uses the idScope field to identify whether a symbol is exported and handles them differently (e.g. erase the unique id only when the symbol is exported). Ideally, we want LH to be aware of the case where an exported Id is labeled as local but it's probably easier to let GHC set the idScope as if we were accessing from a different module.

We tried using tidyExpr to turn the LocalIds into GlobalIds (https://github.com/jprider63/ghc-elaboration-test/blob/49b33d42bdefb597ac8fab49bb4cea4969c929b3/src/Test/Plugin.hs#L101) but the output expression still shows lid for QQQ. Are there any flags we need to set to "trick" GHC into setting those ids as globals?

Thanks,

-Yiyun

On 8/31/21 3:25 PM, Richard Eisenberg wrote:
I took a look at this today. I found

Note [GlobalId/LocalId]
~~~~~~~~~~~~~~~~~~~~~~~
A GlobalId is
   * always a constant (top-level)
   * imported, or data constructor, or primop, or record selector
   * has a Unique that is globally unique across the whole
     GHC invocation (a single invocation may compile multiple modules)
   * never treated as a candidate by the free-variable finder;
         it's a constant!

A LocalId is
   * bound within an expression (lambda, case, local let(rec))
   * or defined at top level in the module being compiled
   * always treated as a candidate by the free-variable finder

After CoreTidy, top-level LocalIds are turned into GlobalIds
This suggests that the output you're seeing -- with "lid" in QQQ and "gid" in 
PPP -- is correct. What has drawn your attention to this problem? Is there something else that's 
misbehaving?

Thanks,
Richard

On Aug 25, 2021, at 4:16 PM, Yiyun Liu <liuyi...@terpmail.umd.edu> wrote:

Hi all,

We have a function in Liquidhaskell's code base for converting
refinement expressions into GHC's core expressions using the GHC API.
Its implementation is based on tcRnExpr
<https://gitlab.haskell.org/ghc/ghc/-/blob/ghc-8.10.6-release/compiler/typecheck/TcRnDriver.hs#L2358>except
we keep the typechecked expression and desugar it before returning.

However, our function fails to set the idScope information properly when
LiquidHaskell is invoked as a plugin (installed as a
typeCheckResultAction). This repo
<https://github.com/yiyunliu/ghc-elaboration-test>contains a minimal
example that demonstrates the issue. In the CoreExpr returned by
elabRnExpr
<https://github.com/yiyunliu/ghc-elaboration-test/blob/cb7397884b7949e6b7fb6617ded10e86ee5dcad2/src/Test/Plugin.hs#L71>,
every symbol from the current module that's being compiled is labeled as
local. The README.md file shows how the exported symbol testPlus is
marked as local in QQQ.hs, the module where it's defined.

Is there a function we should call to set the idScope information properly?

Thanks,

-Yiyun

_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to