summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lynagh <igloo@earth.li>2008-07-03 19:25:40 +0000
committerIan Lynagh <igloo@earth.li>2008-07-03 19:25:40 +0000
commit37cc35d23202c9846e68e4c0a279fa75273f6f1c (patch)
treecfa32ca48e2dc6fd25d2a7baf9991fabda8b8b0a
parent874578b8f8a2c9a1e2d1cdb75a4f17ea7c80a63b (diff)
downloadhaskell-37cc35d23202c9846e68e4c0a279fa75273f6f1c.tar.gz
Fix trac #2307: conflicting functional dependencies
We were accepting some instances that should have been rejected as their fundep constraints were violated. e.g. we accepted class C a b c | b -> c instance C Bool Int Float instance C Char Int Double
-rw-r--r--compiler/types/FunDeps.lhs12
1 files changed, 6 insertions, 6 deletions
diff --git a/compiler/types/FunDeps.lhs b/compiler/types/FunDeps.lhs
index 69533dc510..7f9f0509e2 100644
--- a/compiler/types/FunDeps.lhs
+++ b/compiler/types/FunDeps.lhs
@@ -494,16 +494,16 @@ badFunDeps cls_insts clas ins_tv_set ins_tys
trimRoughMatchTcs :: [TyVar] -> FunDep TyVar -> [Maybe Name] -> [Maybe Name]
-- Computing rough_tcs for a particular fundep
--- class C a b c | a -> b where ...
+-- class C a b c | a -> b where ...
-- For each instance .... => C ta tb tc
--- we want to match only on the types ta, tc; so our
+-- we want to match only on the type ta; so our
-- rough-match thing must similarly be filtered.
--- Hence, we Nothing-ise the tb type right here
-trimRoughMatchTcs clas_tvs (_,rtvs) mb_tcs
+-- Hence, we Nothing-ise the tb and tc types right here
+trimRoughMatchTcs clas_tvs (ltvs, _) mb_tcs
= zipWith select clas_tvs mb_tcs
where
- select clas_tv mb_tc | clas_tv `elem` rtvs = Nothing
- | otherwise = mb_tc
+ select clas_tv mb_tc | clas_tv `elem` ltvs = mb_tc
+ | otherwise = Nothing
\end{code}