
#10598: DeriveAnyClass and GND don't work well together -------------------------------------+------------------------------------- Reporter: osa1 | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.11 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 oerjan): Hm so here is my "ideal" made-up-on-the-spot system. It somewhat combines all of 2, 3 and 4 from https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/GenericDeriving#In.... It is intended to be backwards-compatible, except for one added warning. * By 3, classes may be annotated (pragma?) to say they prefer GND or DAC deriving. Builtin-derived classes count as annotated for their own style of deriving. To actually derive a class in a module, any extension for the derivation style still needs to be enabled as well. * By 4, if `GeneralizedNewtypeDeriving` is enabled, the `newtype` keyword may be used to signify that an instance for a newtype should be GND derived, even if this is against the annotated behavior for the class. This might even include builtin-derived classes like `Show`. (Obviously not `Typeable`, though.) * Also by 4, if both `GeneralizedNewtypeDeriving` and `DeriveAnyClass` are enabled (or for least surprise, maybe even with just the latter), the `default` keyword may be used to signify that an instance for a newtype should ''not'' be GND-derived, even if this is the annotated behavior for the class. * By 2, if ''neither'' the newtype deriving nor the class is annotated, then the behavior depends on which of `GeneralizedNewtypeDeriving` and `DeriveAnyClass` is enabled. If ''both'' are enabled, then a ''warning'' should be given. (This prevents surprises when a user adds both extensions for unrelated instances.) Then it defaults to DAC as today. * Although the proper extensions need to be enabled for whichever annotations/derivation styles end up being used, the ''only'' case where simply changing the extensions enabled will change code from one legal style of derivation to another should be the one in the previous point. (And thus the warning.) As of now, I don't remember any classes with builtin-derivations that also are useful with `DeriveAnyClass`. So I think there isn't much need to be able to distinguish those two cases. Which also means that none of this matters to `data` declarations, only `newtype`. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10598#comment:19 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler