Commit 59fa7b32 authored by Ryan Scott's avatar Ryan Scott Committed by Ben Gamari

Fix #14719 by using the setting the right SrcSpan

Currently, error messages that germane to GADT constructors
put the source span at only the first character in the constructor,
leading to insufficient caret diagnostics. This can be easily fixed
by using a source span that spans the entire constructor, instead of
just the first character.

Test Plan: make test TEST=T14719

Reviewers: alanz, bgamari, simonpj

Reviewed By: alanz, simonpj

Subscribers: simonpj, goldfire, rwbarton, thomie, carter

GHC Trac Issues: #14719

Differential Revision:
parent a55d581f
......@@ -2538,8 +2538,8 @@ checkValidTyConTyVars tc
checkValidDataCon :: DynFlags -> Bool -> TyCon -> DataCon -> TcM ()
checkValidDataCon dflags existential_ok tc con
= setSrcSpan (srcLocSpan (getSrcLoc con)) $
addErrCtxt (dataConCtxt con) $
= setSrcSpan (getSrcSpan con) $
addErrCtxt (dataConCtxt con) $
do { -- Check that the return type of the data constructor
-- matches the type constructor; eg reject this:
-- data T a where { MkT :: Bogus a }
module T14719 where
data Foo1 where
MkFoo1 :: Bool
newtype Foo2 where
MkFoo2 :: Foo2
T14719.hs:5:3: error:
• Data constructor ‘MkFoo1’ returns type ‘Bool’
instead of an instance of its parent type ‘Foo1’
• In the definition of data constructor ‘MkFoo1’
In the data type declaration for ‘Foo1’
5 | MkFoo1 :: Bool
| ^^^^^^^^^^^^^^
T14719.hs:8:3: error:
• The constructor of a newtype must have exactly one field
but ‘MkFoo2’ has none
• In the definition of data constructor ‘MkFoo2’
In the newtype declaration for ‘Foo2’
8 | MkFoo2 :: Foo2
| ^^^^^^^^^^^^^^
......@@ -115,3 +115,4 @@ test('T9380', normal, compile_and_run, [''])
test('T12087', normal, compile_fail, [''])
test('T12468', normal, compile_fail, [''])
test('T14320', normal, compile, [''])
test('T14719', normal, compile_fail, ['-fdiagnostics-show-caret'])
......@@ -5,12 +5,12 @@ T9222.hs:13:3: error:
inside the constraints: a ~ '(b0, c0)
bound by the type of the constructor ‘Want’:
(a ~ '(b0, c0)) => Proxy b0
at T9222.hs:13:3
at T9222.hs:13:3-43
‘c’ is a rigid type variable bound by
the type of the constructor ‘Want’:
forall i1 j1 (a :: (i1, j1)) (b :: i1) (c :: j1).
((a ~ '(b, c)) => Proxy b) -> Want a
at T9222.hs:13:3
at T9222.hs:13:3-43
• In the ambiguity check for ‘Want’
To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
In the definition of data constructor ‘Want’
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment