From 7539ed8cade66d09fae1e0ccc66c519cafa3b55b Mon Sep 17 00:00:00 2001 From: "simonpj@microsoft.com" Date: Mon, 11 Aug 2008 10:40:11 +0000 Subject: [PATCH 1/1] Make comparison on equalities work right (ie look at the types) This patch makes (s1~t1) == (s2~t2) iff s1==s2, t1==t2 The comparison and equality instances for Insts are really only used in making the AvailEnv in TcSimplify, which equalities are never put into, which is why we've gotten away with this for so long. But I'm now using 'nub' in the error messages for equalities, and in any case it makes sense to have the right equality! --- compiler/typecheck/TcRnTypes.lhs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/compiler/typecheck/TcRnTypes.lhs b/compiler/typecheck/TcRnTypes.lhs index 3e63827..ebf4101 100644 --- a/compiler/typecheck/TcRnTypes.lhs +++ b/compiler/typecheck/TcRnTypes.lhs @@ -730,7 +730,8 @@ than with the Avails handling stuff in TcSimplify \begin{code} instance Ord Inst where - compare = cmpInst + compare = cmpInst + -- Used *only* for AvailEnv in TcSimplify instance Eq Inst where (==) i1 i2 = case i1 `cmpInst` i2 of @@ -761,11 +762,12 @@ cmpInst i1@(ImplicInst {}) i2@(ImplicInst {}) = tci_name i1 `compare` tci_name i cmpInst (ImplicInst {}) _ = LT -- same for Equality constraints -cmpInst (EqInst {}) (Dict {}) = GT -cmpInst (EqInst {}) (Method {}) = GT -cmpInst (EqInst {}) (LitInst {}) = GT -cmpInst (EqInst {}) (ImplicInst {}) = GT -cmpInst i1@(EqInst {}) i2@(EqInst {}) = tci_name i1 `compare` tci_name i2 +cmpInst (EqInst {}) (Dict {}) = GT +cmpInst (EqInst {}) (Method {}) = GT +cmpInst (EqInst {}) (LitInst {}) = GT +cmpInst (EqInst {}) (ImplicInst {}) = GT +cmpInst i1@(EqInst {}) i2@(EqInst {}) = (tci_left i1 `tcCmpType` tci_left i2) `thenCmp` + (tci_right i1 `tcCmpType` tci_right i2) \end{code} -- 1.7.10.4