[GHC] #10823: Expose keepAlive to Template Haskell
GHC
ghc-devs at haskell.org
Tue Sep 1 18:21:41 UTC 2015
#10823: Expose keepAlive to Template Haskell
-------------------------------------+-------------------------------------
Reporter: spinda | Owner:
Type: feature | Status: new
request |
Priority: normal | Milestone:
Component: Compiler | Version: 7.10.2
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Revisions: |
-------------------------------------+-------------------------------------
{{{keepAlive}}} is a
[https://github.com/ghc/ghc/blob/efa7b3a474bc373201ab145c129262a73c86f959/compiler/typecheck/TcRnMonad.hs#L1276
function in TcRnMonad] that adds a {{{Name}}} to the set of {{{Name}}}s to
keep when pruning out dead code.
A concrete use case for exposing this to Template Haskell is in
LiquidHaskell, which will soon function as a Core plugin. In
LiquidHaskell, a subset of Haskell functions can be "lifted" to the logic
level and used in types. For example:
{{{
module Test (ok) where
[lq| inline gt |]
gt x y = x > y
[lq| ok :: x:Int -> { v:Int | gt x v } |]
ok x = x + 1
}}}
LiquidHaskell runs a transformation from the {{{CoreBind}}} for {{{gt}}}
to its internal representation of decidable logic. Since Core plugins are
run after "dead" code is removed at the end of desugaring, and since
{{{gt}}} is not exported, the {{{CoreBind}}} for {{{gt}}} would not reach
the {{{CoreBinds}}} LH receives as a Core plugin.
The solution for this is to be able to mark names with {{{keepAlive}}}
from Template Haskell.
Proposed specification:
{{{
keepAlive :: Name -> Q ()
}}}
where {{{Name}}} is a Template Haskell {{{Name}}}.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10823>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list