[GHC] #10823: Don't mark functions with annotations as dead
GHC
ghc-devs at haskell.org
Fri Sep 4 00:02:22 UTC 2015
#10823: Don't mark functions with annotations as dead
-------------------------------------+-------------------------------------
Reporter: spinda | Owner:
Type: feature request | Status: new
Priority: normal | Milestone: 7.12.1
Component: Template Haskell | Version: 7.10.2
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Revisions:
-------------------------------------+-------------------------------------
Old description:
> A concrete example 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
> }}}
>
> {{{[lq| inline gt |]}}} generates an annotation on {{{gt}}}, which
> LiquidHaskell picks up at the plugin stage. It then tries to run a
> transformation from the {{{CoreBind}}} for {{{gt}}} to its internal
> representation of decidable logic. But 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}}} does not reach the
> {{{CoreBinds}}} LH receives as a Core plugin.
>
> The solution for this is to prevent the desugarer from discarding
> {{{CoreBinds}}} for things with attached annotations.
New description:
A concrete example 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
}}}
{{{[lq| inline gt |]}}} generates an annotation on {{{gt}}}, which
LiquidHaskell picks up at the plugin stage. It then tries to run a
transformation from the {{{CoreBind}}} for {{{gt}}} to its internal
representation of decidable logic. But 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}}} does not reach the
{{{CoreBinds}}} LH receives as a Core plugin.
The solution for this is to prevent the desugarer from discarding
{{{CoreBinds}}} for things with attached annotations.
----
Minimal example (without TH):
{{{
module AnnTest (thing) where
{-# ANN thing False #-}
thing :: Int
thing = 7
}}}
{{{
➜ ghc -O0 -ddump-simpl AnnTest.hs
[1 of 1] Compiling AnnTest ( AnnTest.hs, AnnTest.o )
==================== Simplified expression ====================
GHC.Desugar.toAnnotationWrapper
@ GHC.Types.Bool Data.Data.$fDataBool GHC.Types.False
==================== Tidy Core ====================
Result size of Tidy Core = {terms: 3, types: 1, coercions: 0}
thing :: Int
[GblId, Caf=NoCafRefs, Str=DmdType]
thing = GHC.Types.I# 7
}}}
{{{
module AnnTest () where
{-# ANN thing False #-}
thing :: Int
thing = 7
}}}
{{{
➜ ghc -O0 -ddump-simpl AnnTest.hs
[1 of 1] Compiling AnnTest ( AnnTest.hs, AnnTest.o )
==================== Simplified expression ====================
GHC.Desugar.toAnnotationWrapper
@ GHC.Types.Bool Data.Data.$fDataBool GHC.Types.False
==================== Tidy Core ====================
Result size of Tidy Core = {terms: 0, types: 0, coercions: 0}
}}}
--
Comment (by spinda):
Yes, it can be reproduced without TH. Minimal example attached to the
ticket description.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10823#comment:10>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list