Fix #13948 by being pickier about when to suggest DataKinds
authorRyan Scott <ryan.gl.scott@gmail.com>
Tue, 11 Jul 2017 17:59:07 +0000 (13:59 -0400)
committerBen Gamari <ben@smart-cactus.org>
Tue, 11 Jul 2017 18:34:09 +0000 (14:34 -0400)
Commit 343cb32d0983f576d344a2d04a35c3fd6eecf2c5 (#13568) made GHC a bit
too cavalier in suggesting when data constructors are in scope (and
suggesting the use of `DataKinds`). This tones down the suggestions so
that `DataKinds` is only suggested if a data constructor of that name is
actually in scope (previously, it would always suggest, even if it was
out of scope).

Fixes #13948.

Test Plan: ./validate

Reviewers: mpickering, austin, bgamari

Reviewed By: mpickering

Subscribers: rwbarton, thomie

GHC Trac Issues: #13948

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

14 files changed:
compiler/rename/RnEnv.hs
testsuite/tests/module/mod122.stderr
testsuite/tests/module/mod123.stderr
testsuite/tests/module/mod124.stderr
testsuite/tests/module/mod127.stderr
testsuite/tests/module/mod29.stderr
testsuite/tests/module/mod50.stderr
testsuite/tests/parser/should_fail/readFail001.stderr
testsuite/tests/rename/prog003/rename.prog003.stderr
testsuite/tests/rename/should_fail/T1595a.stderr
testsuite/tests/rename/should_fail/T5745.stderr
testsuite/tests/typecheck/should_fail/T1595.stderr
testsuite/tests/typecheck/should_fail/tcfail048.stderr
testsuite/tests/typecheck/should_fail/tcfail053.stderr

index 2ad4413..617b355 100644 (file)
@@ -77,6 +77,7 @@ import qualified GHC.LanguageExtensions as LangExt
 import RnUnbound
 import RnUtils
 import Data.Functor (($>))
+import Data.Maybe (isJust)
 
 {-
 *********************************************************
@@ -863,7 +864,15 @@ lookup_demoted rdr_name dflags
                                  (Reason Opt_WarnUntickedPromotedConstructors)
                                  (untickedPromConstrWarn demoted_name)
                              ; return demoted_name } }
-            else unboundNameX WL_Any rdr_name suggest_dk }
+            else do { -- We need to check if a data constructor of this name is
+                      -- in scope to give good error messages. However, we do
+                      -- not want to give an additional error if the data
+                      -- constructor happens to be out of scope! See #13947.
+                      mb_demoted_name <- discardErrs $
+                                         lookupOccRn_maybe demoted_rdr
+                    ; let suggestion | isJust mb_demoted_name = suggest_dk
+                                     | otherwise              = star_info
+                    ; unboundNameX WL_Any rdr_name suggestion } }
 
   | otherwise
   = reportUnboundName rdr_name
index 66aaaf2..51338f0 100644 (file)
@@ -1,4 +1,2 @@
 
-mod122.hs:5:6: error:
-    Not in scope: type constructor or class ‘C’
-    A data constructor of that name is in scope; did you mean DataKinds?
+mod122.hs:5:6: error: Not in scope: type constructor or class ‘C’
index 38390d0..c31f6d5 100644 (file)
@@ -1,4 +1,2 @@
 
-mod123.hs:5:6: error:
-    Not in scope: type constructor or class ‘T’
-    A data constructor of that name is in scope; did you mean DataKinds?
+mod123.hs:5:6: error: Not in scope: type constructor or class ‘T’
index cbf9f45..a052a50 100644 (file)
@@ -1,6 +1,5 @@
 
 mod124.hs:6:6: error:
     Not in scope: type constructor or class ‘T’
-    A data constructor of that name is in scope; did you mean DataKinds?
     Perhaps you want to remove ‘T’ from the explicit hiding list
     in the import of ‘Mod124_A’ (mod124.hs:4:1-26).
index 462ebbc..861d492 100644 (file)
@@ -1,6 +1,5 @@
 
 mod127.hs:6:6: error:
     Not in scope: type constructor or class ‘T’
-    A data constructor of that name is in scope; did you mean DataKinds?
     Perhaps you want to remove ‘T’ from the explicit hiding list
     in the import of ‘Mod127_A’ (mod127.hs:4:1-26).
index 08a019e..e70c5df 100644 (file)
@@ -1,6 +1,5 @@
 
 mod29.hs:6:12: error:
     Not in scope: type constructor or class ‘Char’
-    A data constructor of that name is in scope; did you mean DataKinds?
     Perhaps you want to add ‘Char’ to the import list in the import of
     ‘Prelude’ (mod29.hs:5:1-19).
index 94878a8..9669427 100644 (file)
@@ -1,4 +1,2 @@
 
-mod50.hs:3:22: error:
-    Not in scope: type constructor or class ‘Foo’
-    A data constructor of that name is in scope; did you mean DataKinds?
+mod50.hs:3:22: error: Not in scope: type constructor or class ‘Foo’
index 3284c1b..6425d16 100644 (file)
@@ -16,4 +16,3 @@ readFail001.hs:107:42: error: Not in scope: data constructor ‘Bar’
 
 readFail001.hs:112:23: error:
     Not in scope: type constructor or class ‘Foo’
-    A data constructor of that name is in scope; did you mean DataKinds?
index 6babd03..b8f8478 100644 (file)
@@ -1,4 +1,2 @@
 
-B.hs:4:6: error:
-    Not in scope: type constructor or class ‘Class’
-    A data constructor of that name is in scope; did you mean DataKinds?
+B.hs:4:6: error: Not in scope: type constructor or class ‘Class’
index 9b19421..bcd601a 100644 (file)
@@ -1,4 +1,3 @@
 
 T1595a.hs:3:20: error:
     Not in scope: type constructor or class ‘Tpyo’
-    A data constructor of that name is in scope; did you mean DataKinds?
index 94e3bd5..dc590bb 100644 (file)
@@ -1,4 +1,2 @@
 
-T5745.hs:5:6: error:
-    Not in scope: type constructor or class ‘T’
-    A data constructor of that name is in scope; did you mean DataKinds?
+T5745.hs:5:6: error: Not in scope: type constructor or class ‘T’
index bed30c4..2f17fb8 100644 (file)
@@ -1,8 +1,6 @@
 
 T1595.hs:8:15: error:
     Not in scope: type constructor or class ‘DoesNotExist’
-    A data constructor of that name is in scope; did you mean DataKinds?
 
 T1595.hs:13:22: error:
     Not in scope: type constructor or class ‘DoesNotExist’
-    A data constructor of that name is in scope; did you mean DataKinds?
index 4c1c300..49c8cf0 100644 (file)
@@ -1,4 +1,3 @@
 
 tcfail048.hs:3:8: error:
     Not in scope: type constructor or class ‘B’
-    A data constructor of that name is in scope; did you mean DataKinds?
index edd1537..75308e5 100644 (file)
@@ -1,4 +1,3 @@
 
 tcfail053.hs:3:12: error:
     Not in scope: type constructor or class ‘A’
-    A data constructor of that name is in scope; did you mean DataKinds?