summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/parser/Parser.y22
-rw-r--r--testsuite/tests/parser/should_fail/T12811.hs5
-rw-r--r--testsuite/tests/parser/should_fail/T12811.stderr7
-rw-r--r--testsuite/tests/parser/should_fail/all.T1
4 files changed, 30 insertions, 5 deletions
diff --git a/compiler/parser/Parser.y b/compiler/parser/Parser.y
index b590333c1f..caa22dc207 100644
--- a/compiler/parser/Parser.y
+++ b/compiler/parser/Parser.y
@@ -3181,11 +3181,7 @@ tyvarop :: { Located RdrName }
tyvarop : '`' tyvarid '`' {% ams (sLL $1 $> (unLoc $2))
[mj AnnBackquote $1,mj AnnVal $2
,mj AnnBackquote $3] }
- | '.' {% parseErrorSDoc (getLoc $1)
- (vcat [text "Illegal symbol '.' in type",
- text "Perhaps you intended to use RankNTypes or a similar language",
- text "extension to enable explicit-forall syntax: forall <tvs>. <type>"])
- }
+ | '.' {% hintExplicitForall' (getLoc $1) }
tyvarid :: { Located RdrName }
: VARID { sL1 $1 $! mkUnqual tvName (getVARID $1) }
@@ -3585,6 +3581,22 @@ hintExplicitForall span = do
, text "extension to enable explicit-forall syntax: \x2200 <tvs>. <type>"
]
+-- Hint about explicit-forall, assuming UnicodeSyntax is off
+hintExplicitForall' :: SrcSpan -> P (GenLocated SrcSpan RdrName)
+hintExplicitForall' span = do
+ forall <- extension explicitForallEnabled
+ let illegalDot = "Illegal symbol '.' in type"
+ if forall
+ then parseErrorSDoc span $ vcat
+ [ text illegalDot
+ , text "Perhaps you meant to write 'forall <tvs>. <type>'?"
+ ]
+ else parseErrorSDoc span $ vcat
+ [ text illegalDot
+ , text "Perhaps you intended to use RankNTypes or a similar language"
+ , text "extension to enable explicit-forall syntax: forall <tvs>. <type>"
+ ]
+
{-
%************************************************************************
%* *
diff --git a/testsuite/tests/parser/should_fail/T12811.hs b/testsuite/tests/parser/should_fail/T12811.hs
new file mode 100644
index 0000000000..c82a830e65
--- /dev/null
+++ b/testsuite/tests/parser/should_fail/T12811.hs
@@ -0,0 +1,5 @@
+{-# LANGUAGE RankNTypes #-}
+module Bug where
+
+foo :: foral a. a -> a
+foo x = x
diff --git a/testsuite/tests/parser/should_fail/T12811.stderr b/testsuite/tests/parser/should_fail/T12811.stderr
new file mode 100644
index 0000000000..de22bafd27
--- /dev/null
+++ b/testsuite/tests/parser/should_fail/T12811.stderr
@@ -0,0 +1,7 @@
+
+testsuite/tests/parser/should_fail/T12811.hs:4:15: error:
+ Illegal symbol '.' in type
+ Perhaps you meant to write 'forall <tvs>. <type>'?
+ |
+4 | foo :: foral a. a -> a
+ | ^
diff --git a/testsuite/tests/parser/should_fail/all.T b/testsuite/tests/parser/should_fail/all.T
index e515e2fd6b..b3efb5c193 100644
--- a/testsuite/tests/parser/should_fail/all.T
+++ b/testsuite/tests/parser/should_fail/all.T
@@ -95,3 +95,4 @@ test('T10498a', normal, compile_fail, [''])
test('T10498b', normal, compile_fail, [''])
test('T12051', normal, compile_fail, [''])
test('T12429', normal, compile_fail, [''])
+test('T12811', normal, compile_fail, [''])