Admin message

Due to a large amount of spam we do not allow new users to create repositories, they are "external" users. If you are a new user and want to create a repository, for example for forking GHC, open a new issue on ghc/ghc using the "get-verified" issue template

coerce error when role is nominal could be more explicit
## Motivation If a type `Foo a` have a type parameter `a` with `role` `nominal`, it's not possible to `coerce` it to `Foo b`, even if `a` and `b` are `Coercible`. That's the definition of the role system. However, the error message associated with it are not helpful. For example, consider the following example: ```haskell {-# LANGUAGE RoleAnnotations #-} import Data.Monoid (Sum(..)) import Data.Coerce (coerce) type role Foo nominal data Foo a = Foo a deriving (Ord, Eq) foo :: Foo Int foo = coerce (Foo (10 :: Sum Int)) ``` With ghc 9.6, it fails with: ``` GHCi, version 9.6.2: https://www.haskell.org/ghc/ :? for help [1 of 2] Compiling Main ( V.hs, interpreted ) V.hs:20:8: error: [GHC-18872] • Couldn't match type ‘Sum Int’ with ‘Int’ arising from a use of ‘coerce’ • In the expression: coerce (Foo (10 :: Sum Int)) In an equation for ‘foo'’: foo' = coerce (Foo (10 :: Sum Int)) | 20 | foo' = coerce (Foo (10 :: Sum Int)) ``` Removes the `type role` annotations, and that's fine. Note how the error message does not reference the `role` system, or `representational` or `nominal` at all. It does not reference `Foo` at all, even if the problem is actually not with matching the type `Sum Int` and `Int`. Even the wording `match` is confusing. Here is a second example, which is actually the real life example which annoyed me recently. In `vector` latest version, `Data.Vector.Storable` role annotation changed to `nominal`, hence it is not possible anymore to `coerce` between two `Vector`. ```haskell {-# LANGUAGE RoleAnnotations #-} import Data.Monoid (Sum(..)) import Data.Coerce (coerce) import Data.Vector.Storable foo :: Vector (Sum Int) foo = coerce (empty :: Vector Int) ``` However, the error message: ``` GHCi, version 9.6.2: https://www.haskell.org/ghc/ :? for help [1 of 2] Compiling Main ( V.hs, interpreted ) V.hs:7:7: error: [GHC-18872] • Couldn't match type ‘Int’ with ‘Sum Int’ arising from a use of ‘coerce’ • In the expression: coerce (empty :: Vector Int) In an equation for ‘foo’: foo = coerce (empty :: Vector Int) | 7 | foo = coerce (empty :: Vector Int) ``` Does not give any clue about the root cause for the problem. See, here, no notion of `role` or `Vector`. This was particularly vicious for me because when bumping from GHC `9.6.1` to `9.6.2`, I got the `vector` version bump at the same time and got this error message on multiples places in my codebase. Note that GHC is correct with the error, just that the wording can be improved with more context. ## Proposal I suggest to improve the wording to at least include a reference to `coerce`, the `role` annotation, `nominal`, and pointing at the `Vector` type. For example, I'll be happy with: ``` GHCi, version 9.6.2: https://www.haskell.org/ghc/ :? for help [1 of 2] Compiling Main ( V.hs, interpreted ) V.hs:7:7: error: [GHC-18872] • Couldn't coerce type `Vector Int` with `Vector (Sum Int)` arising from a use of ‘coerce’ because of role annotation `type role Vector nominal`. • In the expression: coerce (empty :: Vector Int) In an equation for ‘foo’: foo = coerce (empty :: Vector Int) | 7 | foo = coerce (empty :: Vector Int) ```
issue