diff options
-rw-r--r-- | compiler/parser/Parser.y | 22 | ||||
-rw-r--r-- | testsuite/tests/parser/should_fail/T12811.hs | 5 | ||||
-rw-r--r-- | testsuite/tests/parser/should_fail/T12811.stderr | 7 | ||||
-rw-r--r-- | testsuite/tests/parser/should_fail/all.T | 1 |
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, ['']) |