summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2015-05-01 09:42:21 +0100
committerSimon Peyton Jones <simonpj@microsoft.com>2015-05-01 09:42:21 +0100
commitb626cb08b6b97965eec1ab63a890f8cbcfbcaa5b (patch)
treef77c1474e7e8cd9ed0f219ac96aebd1727b315ba
parent0d715db801972b8119aef15bd63b869fad9d5f9d (diff)
downloadhaskell-b626cb08b6b97965eec1ab63a890f8cbcfbcaa5b.tar.gz
Make Derived NomEq rewrite only Derived NomEq
See Note [Deriveds do rewrite Deriveds]. The important point is that we want to maintain the Note [Can-rewrite relation] property, lest we risk loops.
-rw-r--r--compiler/typecheck/TcFlatten.hs12
1 files changed, 11 insertions, 1 deletions
diff --git a/compiler/typecheck/TcFlatten.hs b/compiler/typecheck/TcFlatten.hs
index 65d260ba61..4c74ba9cb1 100644
--- a/compiler/typecheck/TcFlatten.hs
+++ b/compiler/typecheck/TcFlatten.hs
@@ -1528,7 +1528,7 @@ eqCanRewriteFR :: CtFlavourRole -> CtFlavourRole -> Bool
-- See Note [Deriveds do rewrite Deriveds]
eqCanRewriteFR (Given, NomEq) (_, _) = True
eqCanRewriteFR (Given, ReprEq) (_, ReprEq) = True
-eqCanRewriteFR (Derived, NomEq) (Derived, _) = True
+eqCanRewriteFR (Derived, NomEq) (Derived, NomEq) = True
eqCanRewriteFR _ _ = False
canRewriteOrSame :: CtEvidence -> CtEvidence -> Bool
@@ -1566,6 +1566,16 @@ Note [Deriveds do rewrite Deriveds]
However we DO allow Deriveds to rewrite Deriveds, because that's how
improvement works; see Note [The improvement story] in TcInteract.
+However, for now at least I'm only letting (Derived,NomEq) rewrite
+(Derived,NomEq) and not doing anything for ReprEq. If we have
+ eqCanRewriteFR (Derived, NomEq) (Derived, _) = True
+then we lose the property of Note [Can-rewrite relation]
+ R2. If f1 >= f, and f2 >= f,
+ then either f1 >= f2 or f2 >= f1
+Consider f1 = (Given, ReprEq)
+ f2 = (Derived, NomEq)
+ f = (Derived, ReprEq)
+
Note [canRewriteOrSame]
~~~~~~~~~~~~~~~~~~~~~~~
canRewriteOrSame is similar but