diff options
| author | Simon Peyton Jones <simonpj@microsoft.com> | 2015-05-01 09:42:21 +0100 |
|---|---|---|
| committer | Simon Peyton Jones <simonpj@microsoft.com> | 2015-05-01 09:42:21 +0100 |
| commit | b626cb08b6b97965eec1ab63a890f8cbcfbcaa5b (patch) | |
| tree | f77c1474e7e8cd9ed0f219ac96aebd1727b315ba | |
| parent | 0d715db801972b8119aef15bd63b869fad9d5f9d (diff) | |
| download | haskell-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.hs | 12 |
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 |
