Poor error message source location reporting with unsaturated type family
If you compile this program:
{-# LANGUAGE TypeFamilies #-}
module Bug where
newtype WrapChar f = MkWrapChar (f Char)
type family F a
type family T a
type instance T Int = WrapChar F
Then you'll get this error message:
$ /opt/ghc/8.6.2/bin/ghc Bug.hs
[1 of 1] Compiling Bug ( Bug.hs, Bug.o )
Bug.hs:7:15: error:
• The type family ‘F’ should have 1 argument, but has been given none
• In the type instance declaration for ‘T’
|
7 | type instance T Int = WrapChar F
| ^
The thing is, the location of that caret is rather unfocused. It's pointing at T
, but the real culprit is F
!
I know that GHC can do better here because other error messages actually get this right. For instance, if you change the T Int
instance to this:
type instance T Int = F
Then GHC will actually point to F
in the resulting error message:
$ /opt/ghc/8.6.2/bin/ghc Bug.hs
[1 of 1] Compiling Bug ( Bug.hs, Bug.o )
Bug.hs:7:23: error:
• Expecting one more argument to ‘F’
Expected a type, but ‘F’ has kind ‘* -> *’
• In the type ‘F’
In the type instance declaration for ‘T’
|
7 | type instance T Int = F
| ^
If GHC can point to the right place in the source code in this situation, then it ought to get the earlier situation right as well.
Trac metadata
Trac field | Value |
---|---|
Version | 8.6.2 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |