[commit: ghc] master: Improve error message suppression (18cd712)

git at git.haskell.org git at git.haskell.org
Mon Feb 15 08:45:49 UTC 2016


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/18cd712427182e76d38047860ee3e26799bc3fe2/ghc

>---------------------------------------------------------------

commit 18cd712427182e76d38047860ee3e26799bc3fe2
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date:   Mon Feb 15 08:39:23 2016 +0000

    Improve error message suppression
    
    TcErrors has a system for suppressing some type errors if a more
    serious one occurs.  But there was a crucial missing case, which
    sometimes resulted in a cascade of irrelevant errors overwhelming
    the actual cause. This was Trac #11541.
    
    The fix is simple.  Worth merging to 8.0


>---------------------------------------------------------------

18cd712427182e76d38047860ee3e26799bc3fe2
 compiler/typecheck/TcErrors.hs                        | 19 ++++++++++++-------
 .../rename/should_fail/RnStaticPointersFail02.stderr  |  6 ------
 testsuite/tests/rename/should_fail/mc14.stderr        | 14 --------------
 .../tests/typecheck/should_compile/T11254.stderr      | 10 ----------
 testsuite/tests/typecheck/should_fail/mc22.stderr     | 12 ------------
 testsuite/tests/typecheck/should_fail/mc25.stderr     | 11 -----------
 6 files changed, 12 insertions(+), 60 deletions(-)

diff --git a/compiler/typecheck/TcErrors.hs b/compiler/typecheck/TcErrors.hs
index 2cbf28d..5f2c908 100644
--- a/compiler/typecheck/TcErrors.hs
+++ b/compiler/typecheck/TcErrors.hs
@@ -304,14 +304,19 @@ reportImplic ctxt implic@(Implic { ic_skols = tvs, ic_given = given
                      , ic_info  = info' }
     ctxt' = ctxt { cec_tidy     = env1
                  , cec_encl     = implic' : cec_encl ctxt
-                 , cec_suppress = insoluble  -- Suppress inessential errors if there
-                                             -- are are insolubles anywhere in the
-                                             -- tree rooted here
+
+                 , cec_suppress = insoluble || cec_suppress ctxt
+                      -- Suppress inessential errors if there
+                      -- are are insolubles anywhere in the
+                      -- tree rooted here, or we've come across
+                      -- a suppress-worthy constraint higher up (Trac #11541)
+
                  , cec_binds    = cec_binds ctxt *> m_evb }
-                                  -- if cec_binds ctxt is Nothing, that means
-                                  -- we're reporting *all* errors. Don't change
-                                  -- that behavior just because we're going into
-                                  -- an implication.
+                      -- If cec_binds ctxt is Nothing, that means
+                      -- we're reporting *all* errors. Don't change
+                      -- that behavior just because we're going into
+                      -- an implication.
+
     dead_givens = case status of
                     IC_Solved { ics_dead = dead } -> dead
                     _                             -> []
diff --git a/testsuite/tests/rename/should_fail/RnStaticPointersFail02.stderr b/testsuite/tests/rename/should_fail/RnStaticPointersFail02.stderr
index e596a51..b34f435 100644
--- a/testsuite/tests/rename/should_fail/RnStaticPointersFail02.stderr
+++ b/testsuite/tests/rename/should_fail/RnStaticPointersFail02.stderr
@@ -1,9 +1,3 @@
 
-RnStaticPointersFail02.hs:5:5: error:
-    • No instance for (Data.Typeable.Internal.Typeable t0)
-        arising from a static form
-    • In the expression: static T
-      In an equation for ‘f’: f = static T
-
 RnStaticPointersFail02.hs:5:12: error:
     Data constructor not in scope: T
diff --git a/testsuite/tests/rename/should_fail/mc14.stderr b/testsuite/tests/rename/should_fail/mc14.stderr
index bc7b7df..4182c8f 100644
--- a/testsuite/tests/rename/should_fail/mc14.stderr
+++ b/testsuite/tests/rename/should_fail/mc14.stderr
@@ -1,16 +1,2 @@
 
-mc14.hs:14:16: error:
-    Ambiguous type variable ‘t0’ arising from a use of ‘fmap’
-    prevents the constraint ‘(Functor t0)’ from being solved.
-    Probable fix: use a type annotation to specify what ‘t0’ should be.
-    These potential instances exist:
-      instance Functor IO -- Defined in ‘GHC.Base’
-      instance Functor Maybe -- Defined in ‘GHC.Base’
-      instance Functor ((->) r) -- Defined in ‘GHC.Base’
-      ...plus two others
-      (use -fprint-potential-instances to see them all)
-    In the expression: fmap
-    In a stmt of a monad comprehension: then group using f
-    In the expression: [() | f <- functions, then group using f]
-
 mc14.hs:14:49: error: Variable not in scope: f :: [a] -> m (t0 a)
diff --git a/testsuite/tests/typecheck/should_compile/T11254.stderr b/testsuite/tests/typecheck/should_compile/T11254.stderr
index 25cd751..692c72f 100644
--- a/testsuite/tests/typecheck/should_compile/T11254.stderr
+++ b/testsuite/tests/typecheck/should_compile/T11254.stderr
@@ -4,16 +4,6 @@ T11254.hs:16:10: warning:
         arising from the superclasses of an instance declaration
     • In the instance declaration for ‘ID Rational’
 
-T11254.hs:16:10: warning:
-    • No instance for (Fractional Int)
-        arising from the superclasses of an instance declaration
-    • In the instance declaration for ‘ID Rational’
-
-T11254.hs:16:10: warning:
-    • No instance for (ID Int)
-        arising from the superclasses of an instance declaration
-    • In the instance declaration for ‘ID Rational’
-
 T11254.hs:18:12: warning:
     • Couldn't match type ‘GHC.Real.Ratio Integer’ with ‘Int’
       Expected type: Rational -> Frac Rational
diff --git a/testsuite/tests/typecheck/should_fail/mc22.stderr b/testsuite/tests/typecheck/should_fail/mc22.stderr
index 5e369d7..955ebe5 100644
--- a/testsuite/tests/typecheck/should_fail/mc22.stderr
+++ b/testsuite/tests/typecheck/should_fail/mc22.stderr
@@ -1,16 +1,4 @@
 
-mc22.hs:9:9: error:
-    • No instance for (Functor t) arising from a use of ‘fmap’
-      Possible fix:
-        add (Functor t) to the context of
-          a type expected by the context:
-            (a -> b) -> t a -> t b
-          or the inferred type of foo :: [t [Char]]
-    • In the expression: fmap
-      In a stmt of a monad comprehension: then group using take 5
-      In the expression:
-        [x + 1 | x <- ["Hello", "World"], then group using take 5]
-
 mc22.hs:10:26: error:
     • Couldn't match type ‘a’ with ‘t a’
       ‘a’ is a rigid type variable bound by
diff --git a/testsuite/tests/typecheck/should_fail/mc25.stderr b/testsuite/tests/typecheck/should_fail/mc25.stderr
index 406f89e..7fdb6ff 100644
--- a/testsuite/tests/typecheck/should_fail/mc25.stderr
+++ b/testsuite/tests/typecheck/should_fail/mc25.stderr
@@ -1,15 +1,4 @@
 
-mc25.hs:9:10: error:
-    • No instance for (Functor t1) arising from a use of ‘fmap’
-      Possible fix:
-        add (Functor t1) to the context of
-          a type expected by the context:
-            (a -> b) -> t1 a -> t1 b
-          or the inferred type of z :: [t1 t]
-    • In the expression: fmap
-      In a stmt of a monad comprehension: then group by x using take
-      In the expression: [x | x <- [1 .. 10], then group by x using take]
-
 mc25.hs:9:46: error:
     • Couldn't match type ‘a -> t’ with ‘Int’
       Expected type: (a -> t) -> [a] -> [t1 a]



More information about the ghc-commits mailing list