From 4d7ac0e3227c408de20af4ef7898028863327492 Mon Sep 17 00:00:00 2001 From: "simonpj@microsoft.com" Date: Tue, 1 Jul 2008 16:58:30 +0000 Subject: [PATCH] Fix Trac #2307: need to nub bad fundep reports --- compiler/types/FunDeps.lhs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/compiler/types/FunDeps.lhs b/compiler/types/FunDeps.lhs index 949cac4..69533dc 100644 --- a/compiler/types/FunDeps.lhs +++ b/compiler/types/FunDeps.lhs @@ -29,6 +29,7 @@ import Outputable import Util import FastString +import Data.List ( nubBy ) import Data.Maybe ( isJust ) \end{code} @@ -469,7 +470,8 @@ badFunDeps :: [Instance] -> Class -> TyVarSet -> [Type] -- Proposed new instance type -> [Instance] badFunDeps cls_insts clas ins_tv_set ins_tys - = [ ispec | fd <- fds, -- fds is often empty + = nubBy eq_inst $ + [ ispec | fd <- fds, -- fds is often empty, so do this first! let trimmed_tcs = trimRoughMatchTcs clas_tvs fd rough_tcs, ispec@(Instance { is_tcs = inst_tcs, is_tvs = tvs, is_tys = tys }) <- cls_insts, @@ -482,6 +484,13 @@ badFunDeps cls_insts clas ins_tv_set ins_tys where (clas_tvs, fds) = classTvsFds clas rough_tcs = roughMatchTcs ins_tys + eq_inst i1 i2 = instanceDFunId i1 == instanceDFunId i2 + -- An single instance may appear twice in the un-nubbed conflict list + -- because it may conflict with more than one fundep. E.g. + -- class C a b c | a -> b, a -> c + -- instance C Int Bool Bool + -- instance C Int Char Char + -- The second instance conflicts with the first by *both* fundeps trimRoughMatchTcs :: [TyVar] -> FunDep TyVar -> [Maybe Name] -> [Maybe Name] -- Computing rough_tcs for a particular fundep -- 1.7.10.4