[GHC] #10823: Expose keepAlive to Template Haskell

#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/com... 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

#10823: Expose keepAlive to Template Haskell -------------------------------------+------------------------------------- Reporter: spinda | Owner: Type: feature request | Status: new Priority: normal | Milestone: 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: -------------------------------------+------------------------------------- Changes (by spinda): * component: Compiler => Template Haskell -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10823: Expose keepAlive to Template Haskell -------------------------------------+------------------------------------- Reporter: spinda | Owner: Type: feature request | Status: new Priority: normal | Milestone: 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: -------------------------------------+------------------------------------- Comment (by goldfire): It's a bit of a hack, but there's a workaround here. Define this in some available module: {{{ data Anything = forall a. Mk a class KeepAlive (what :: Symbol) where whatToKeep :: proxy what -> Anything }}} And then generate this using existing TH: {{{ instance KeepAlive "gt" where whatToKeep _ = Mk gt }}} Then GHC will mark `gt` as used. This is ugly, but it should work well in practice. In the effort to keep TH from bloating too much, I would lean against adding new features to support operations that can be simulated well today. Feel free to try to convince me otherwise -- I'm not dead set in this position. But I'm worried about feature creep here. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10823: Expose keepAlive to Template Haskell -------------------------------------+------------------------------------- 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: -------------------------------------+------------------------------------- Changes (by goldfire): * milestone: => 7.12.1 Comment: We should either do it or abandon this by the next release. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10823: Expose keepAlive to Template Haskell -------------------------------------+------------------------------------- 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: -------------------------------------+------------------------------------- Comment (by spinda): Is the use of type-level literals essential here? That requires the user to have {{{DataKinds}}} enabled. Otherwise, the hack can fill our use case, I think. On the other hand, I worry about Template Haskell code having to depend too much on tricks that happen to work but aren't a guaranteed, stable, documented part of the interface. See, for example, the issue with quasiquoter behavior that appeared in #10047: suddenly, the "trick" that quasiquoters didn't split declaration groups went away, because it wasn't part of the actual spec. By contrast, functionality exposed through an explicit piece of the Template Haskell API will not suddenly disappear as a consequence of a tangential patch. //That said//, as I write this, I've realized that there may be another way to approach our particular issue. {{{[lq| inline gt |]}}} attaches an annotation to {{{gt}}}, so perhaps the solution should be to tell the desugarer not to consider any function with an annotation attached as dead code. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:4 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10823: Expose keepAlive to Template Haskell -------------------------------------+------------------------------------- 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: -------------------------------------+------------------------------------- Comment (by goldfire): Replying to [comment:4 spinda]:
Is the use of type-level literals essential here? That requires the user to have {{{DataKinds}}} enabled. Otherwise, the hack can fill our use case, I think.
No. It's just a convenient way to make sure that the instance head is unique. Any such mechanism should work.
On the other hand, I worry about Template Haskell code having to depend
too much on tricks that happen to work but aren't a guaranteed, stable, documented part of the interface. Agreed. Except that this is depending on a guaranteed, stable, documented feature: that ''all'' instance are always exported from a module. Thus if a definition is mentioned in an instance, GHC will never drop it. So this isn't a TH hack so much, but a GHC language hack.
//That said//, as I write this, I've realized that there may be another way to approach our particular issue. {{{[lq| inline gt |]}}} attaches an annotation to {{{gt}}}, so perhaps the solution should be to tell the desugarer not to consider any function with an annotation attached as dead code.
This is ''much'' better. Care to repurpose the ticket? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:5 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#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:
{{{keepAlive}}} is a [https://github.com/ghc/ghc/blob/efa7b3a474bc373201ab145c129262a73c86f959/com... 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}}}.
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. -- Comment (by spinda): Agreed. Except that this is depending on a guaranteed, stable, documented feature: that all instance are always exported from a module. Thus if a definition is mentioned in an instance, GHC will never drop it. So this isn't a TH hack so much, but a GHC language hack. Good point. Although, I think "instance are always exported from a module" may not be 100% true in the presence of Backpack, but it should be true enough for this to continue to work. This is much better. Care to repurpose the ticket? Done. The fix for the new issue should be much easier to implement anyway. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#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: -------------------------------------+------------------------------------- Comment (by simonpj):
`[lq| inline gt |]` attaches an annotation to gt, so perhaps the solution should be to tell the desugarer not to consider any function with an annotation attached as dead code.
I'd be happy with that. But can you remind us HOW `lq` "attaches an annotation"? It it documented in the user manual? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:7 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#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: -------------------------------------+------------------------------------- Comment (by spinda): {{{lq}}} is a [https://hackage.haskell.org/package/template- haskell-2.5.0.0/docs/Language-Haskell-TH-Quote.html#t:QuasiQuoter QuasiQuoter], and in the declaration context it produces a list of {{{Dec}}} containing a {{{PragmaD (AnnP (ValueAnnotation (mkName "gt")) IsInline)}}}. GHC picks this up, converts it to {{{HsDecl}}}, and feeds it through the renaming/typechecking phase along with all the other declarations in the group. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:8 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#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: -------------------------------------+------------------------------------- Comment (by goldfire): Can this be reproduced without TH? If a definition is mentioned only in an annotation, will it still be marked as dead? Regardless, a minimal example demonstrating this would be great. Thanks! -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:9 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#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

#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: -------------------------------------+------------------------------------- Comment (by rwbarton): I don't really understand why "Don't mark functions with annotations as dead" is sensible behavior, given the totally general-purpose nature of annotations. For example if I used a plugin that uses annotations in one of the ways mentioned on the Wiki page * Store extra information relevant to a plugin but which is added by that plugin itself, such as a strictness analysis plugin that adds a demand signature to functions, which can be inspected later on by the same plugin when it comes to compile modules that depend on that one I wouldn't expect or want every function to be kept live as a side effect. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:11 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#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: -------------------------------------+------------------------------------- Comment (by rwbarton): It would be nice if you could just refer to `gt`-the-value from an annotation on `ok` to keep `gt` live (because `ok` is live), but I don't understand annotations enough to know whether that works or could work. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:12 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#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: -------------------------------------+------------------------------------- Comment (by spinda): It would be nice if you could just refer to gt-the-value from an annotation on ok to keep gt live (because ok is live), but I don't understand annotations enough to know whether that works or could work. I think it could, but annotation payloads (including names within them) are just arbitrary values, so this would require walking the tree of the data and trying to pull out uses of TH's {{{Name}}} constructor. That might get hairy. I don't really understand why "Don't mark functions with annotations as dead" is sensible behavior, given the totally general-purpose nature of annotations. You're right, this wouldn't necessarily make sense for all annotations. In the end, I think the trick suggested by goldfire would be fine for LiquidHaskell's particular use case, since it builds on language behavior that won't likely change soon. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:13 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#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: -------------------------------------+------------------------------------- Comment (by simonpj): Perhaps if we had a library type {{{ data KeepAlive = KeepAlive }}} then you could add a `KeepAlive` annotation {{{ {-# ANN thing KeepAlive #-} }}} with the intent that anything with a `KeepAlive` annotation (rather than with ''any'' annotation) is kept alive -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:14 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#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: -------------------------------------+------------------------------------- Comment (by goldfire): Replying to comment:14: It seems that this suggestion is equivalent to having a new pragma `{-# KEEP_ALIVE thing #-}`. Or even just `{-# KEEP_ALIVE #-}` preceding the declaration. So, my question is: why do this using `ANN`? Or, conversely, does it make sense to do ''all'' identifier specific pragmas using `ANN`? (I'm thinking of things like `INLINABLE`.) -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:15 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#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: -------------------------------------+------------------------------------- Comment (by simonpj): Well in this case the reason @spinda wants to keep the thing alive is because he is adding annotations to it. So using a distinguished annotation seems reasonable. But your general point is valid; a new pragma might also be fine. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:16 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10823: Don't mark functions with annotations as dead -------------------------------------+------------------------------------- Reporter: spinda | Owner: Type: feature request | Status: new Priority: normal | Milestone: 8.0.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 Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by goldfire): Where are we with this ticket? It looks like we have a sensible approach to the original poster's needs. And we've formulated (loosely) a way of keeping code alive. But does that new pragma have real clients who want it? Of course, we ''could'' do this, but ''should'' we? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:18 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10823: Don't mark functions with annotations as dead -------------------------------------+------------------------------------- Reporter: spinda | Owner: Type: feature request | Status: new Priority: normal | Milestone: 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: #11179 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by nomeata): * related: => #11179 Comment: This might be a solution to #11179. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:20 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10823: Don't mark functions with annotations as dead -------------------------------------+------------------------------------- Reporter: spinda | Owner: Type: feature request | Status: closed Priority: normal | Milestone: Component: Template Haskell | Version: 7.10.2 Resolution: duplicate | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: #11179 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by nomeata): * status: new => closed * resolution: => duplicate Comment: Closing this as a duplicate of #10823. see Phab:D3073 for a solution. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10823#comment:21 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler
participants (1)
-
GHC