projects
/
ghc-hetmet.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
e4e18be
)
Fix Trac #2307: need to nub bad fundep reports
author
simonpj@microsoft.com
<unknown>
Tue, 1 Jul 2008 16:58:30 +0000
(16:58 +0000)
committer
simonpj@microsoft.com
<unknown>
Tue, 1 Jul 2008 16:58:30 +0000
(16:58 +0000)
compiler/types/FunDeps.lhs
patch
|
blob
|
history
diff --git
a/compiler/types/FunDeps.lhs
b/compiler/types/FunDeps.lhs
index
949cac4
..
69533dc
100644
(file)
--- a/
compiler/types/FunDeps.lhs
+++ b/
compiler/types/FunDeps.lhs
@@
-29,6
+29,7
@@
import Outputable
import Util
import FastString
import Util
import FastString
+import Data.List ( nubBy )
import Data.Maybe ( isJust )
\end{code}
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
-> 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,
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
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
trimRoughMatchTcs :: [TyVar] -> FunDep TyVar -> [Maybe Name] -> [Maybe Name]
-- Computing rough_tcs for a particular fundep