
#8827: Inferring Safe mode with GeneralizedNewtypeDeriving is wrong -------------------------------------+------------------------------------- Reporter: goldfire | Owner: Type: bug | Status: new Priority: normal | Milestone: 7.12.1 Component: Compiler | Version: 7.9 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: #8226, #8745 | Differential Revisions: -------------------------------------+------------------------------------- Comment (by goldfire): Replying to [comment:39 oerjan]:
Given this, I ''hope'' the following is compatible with all the goals above:
* Default inferred role remains `representational`. * Any use of `coerce` (including via GND) must respect roles etc. as currently without Safe Haskell. * If allowed in general, a "lifting" use of `coerce` is compatible with `Safe` if ''either'': * The type has an explicit role annotation, ''or'' * All of the type's data constructors are in scope.
For this to work out, the last check above must be recursive, looking at all datatypes mentioned in those in-scope data constructors, out to the leaves. Otherwise, a programmer could write a trivial wrapper around a type; all the data constructors would be in scope for the wrapper, and then the programmer could `coerce` away. It's the recursiveness of this check that's annoying. Another (small) problem with this is that it means redundant role annotations are no longer a no-op. For example: {{{ data Maybe1 a = Just1 a | Nothing1 data Maybe2 a = Just2 a | Nothing2 type role Maybe2 representational }}} `Maybe1` and `Maybe2` will have subtly different behavior with respect to Safe Haskell under this proposal. And just because the author of `Maybe2` wanted to add some documentation about roles, much like most programmers add easy-to-infer type signatures. I don't think the point I'm making should kill this proposal, but it is a downside. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8827#comment:40 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler