diff --git a/compiler/typecheck/TcErrors.hs b/compiler/typecheck/TcErrors.hs index d49ca64ca5bda348894532fba751afb5846d003c..4837f52872a0198a5caa477a7e2b32f9a2a478df 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 39b2d8381ac978265210531e773515732b6078a5..d146c73094e4fe404acda2b6de192b971a92fd13 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]