summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2016-10-14 10:41:14 +0100
committerSimon Peyton Jones <simonpj@microsoft.com>2016-10-17 08:41:15 +0100
commit3174beb68919bf706ae5ec7d7d58d11759ba3584 (patch)
treeb5eb9654028f57bc479fb4bff524063e1550e6aa /compiler
parentafdde48baf98e552b860cf1aec093d71ccad1363 (diff)
downloadhaskell-3174beb68919bf706ae5ec7d7d58d11759ba3584.tar.gz
Comments about -Wredundant-constraints
Diffstat (limited to 'compiler')
-rw-r--r--compiler/typecheck/TcErrors.hs1
-rw-r--r--compiler/typecheck/TcSimplify.hs24
2 files changed, 18 insertions, 7 deletions
diff --git a/compiler/typecheck/TcErrors.hs b/compiler/typecheck/TcErrors.hs
index d49ca64ca5..4837f52872 100644
--- a/compiler/typecheck/TcErrors.hs
+++ b/compiler/typecheck/TcErrors.hs
@@ -367,6 +367,7 @@ reportImplic ctxt implic@(Implic { ic_skols = tvs, ic_given = given
_ -> []
warnRedundantConstraints :: ReportErrCtxt -> TcLclEnv -> SkolemInfo -> [EvVar] -> TcM ()
+-- See Note [Tracking redundant constraints] in TcSimplify
warnRedundantConstraints ctxt env info ev_vars
| null redundant_evs
= return ()
diff --git a/compiler/typecheck/TcSimplify.hs b/compiler/typecheck/TcSimplify.hs
index 39b2d8381a..d146c73094 100644
--- a/compiler/typecheck/TcSimplify.hs
+++ b/compiler/typecheck/TcSimplify.hs
@@ -1511,13 +1511,23 @@ works:
----- Shortcomings
-Consider (see Trac #9939)
- f2 :: (Eq a, Ord a) => a -> a -> Bool
- -- Ord a redundant, but Eq a is reported
- f2 x y = (x == y)
-
-We report (Eq a) as redundant, whereas actually (Ord a) is. But it's
-really not easy to detect that!
+After I introduced -Wredundant-constraints there was extensive discussion
+about cases where it reported a redundant constraint but the programmer
+really wanted it. See
+
+ * #11370 (removed it from -Wdefault)
+ * #10635 (removed it from -Wall as well)
+ * #12142
+ * #11474, #10100 (class not used, but its fundeps are)
+ * #11099 (redundant, but still desired)
+ * #10183 (constraint necessary to exclude omitted case)
+
+ * #9939: f2 :: (Eq a, Ord a) => a -> a -> Bool
+ -- Ord a redundant, but Eq a is reported
+ f2 x y = (x == y)
+
+ We report (Eq a) as redundant, whereas actually (Ord a) is.
+ But it's really not easy to detect that!
Note [Cutting off simpl_loop]