
#8827: Inferring Safe mode with GeneralizedNewtypeDeriving is wrong -------------------------------------+------------------------------------ Reporter: goldfire | Owner: Type: bug | Status: new Priority: normal | Milestone: 7.8.1 Component: Compiler | Version: 7.8.1-rc2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Unknown/Multiple Type of failure: None/Unknown | Difficulty: Unknown Test Case: | Blocked By: Blocking: | Related Tickets: 8226, 8745 -------------------------------------+------------------------------------ Comment (by simonpj): I think it would be helpful first for David & David to say exactly what they don't like about this: {{{ {-# LANGUAGE Safe #-} module Lib( T, ... ) where data T a = Leaf a | Node (Tree a) (Tree a) {-# LANGUAGE Safe #-} module Client( main ) import Lib newtype Age = MkAge Int foo :: T Age foo = .... bar :: T Int bar = coerce foo }}} To me this seems fine. If (inside `Lib`) the functions over T make use of type-class constraints over T's parameter, then we can declare a nominal role: {{{ {-# LANGUAGE Safe #-} module Lib( T, ... ) where data T a = Leaf a | Node (Tree a) (Tree a) -- Balanced, based on Ord a role T nominal }}} I can see the following possible choices: * (A) Status quo. Data types without role signatures get representational roles by default. The above is accepted as-is * (B) Data types without role signatures get representational roles by default, except with `{-# LANGUAGE SAFE #-}` which changes the default to nominal. So `Lib` will compile without complaint, but `Client` will fail. Presumably, `Lib` without a `Safe` pragma would be inferred as `Unsafe`, since `T` would have representational role. * (C) Data types without role signatures always get nominal roles by default. That would mean that many many data types in libraries would have to have a role signature added, if you want to lift coercions over them. David, David, can you say what you want and why? Simon -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8827#comment:17 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler