Changed parser message for RankNTypes (#12811)
authorRupert Horlick <ruperthorlick@gmail.com>
Thu, 2 Mar 2017 21:35:53 +0000 (16:35 -0500)
committerBen Gamari <ben@smart-cactus.org>
Fri, 3 Mar 2017 00:58:01 +0000 (19:58 -0500)
Added a check for whether RankNTypes is enabled
and changed error message accordingly

Reviewers: austin, bgamari

Reviewed By: bgamari

Subscribers: thomie, mpickering

Differential Revision: https://phabricator.haskell.org/D3262

compiler/parser/Parser.y
testsuite/tests/parser/should_fail/T12811.hs [new file with mode: 0644]
testsuite/tests/parser/should_fail/T12811.stderr [new file with mode: 0644]
testsuite/tests/parser/should_fail/all.T

index b590333..caa22dc 100644 (file)
@@ -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 (file)
index 0000000..c82a830
--- /dev/null
@@ -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 (file)
index 0000000..de22baf
--- /dev/null
@@ -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
+  |               ^
index e515e2f..b3efb5c 100644 (file)
@@ -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, [''])