[commit: ghc] master: Fix two pernicious bugs in DeriveAnyClass (9893042)
git at git.haskell.org
git at git.haskell.org
Sun Mar 25 19:03:02 UTC 2018
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/9893042604cda5260cb0f7b674ed5c34b419e403/ghc
>---------------------------------------------------------------
commit 9893042604cda5260cb0f7b674ed5c34b419e403
Author: Ryan Scott <ryan.gl.scott at gmail.com>
Date: Sun Mar 25 14:00:39 2018 -0400
Fix two pernicious bugs in DeriveAnyClass
The way GHC was handling `DeriveAnyClass` was subtly wrong
in two notable ways:
* In `inferConstraintsDAC`, we were //always// bumping the `TcLevel`
of newly created unification variables, under the assumption that
we would always place those unification variables inside an
implication constraint. But #14932 showed precisely the scenario
where we had `DeriveAnyClass` //without// any of the generated
constraints being used inside an implication, which made GHC
incorrectly believe the unification variables were untouchable.
* Even worse, we were using the generated unification variables from
`inferConstraintsDAC` in every single iteration of `simplifyDeriv`.
In #14933, however, we have a scenario where we fill in a
unification variable with a skolem in one iteration, discard it,
proceed on to another iteration, use the same unification variable
(still filled in with the old skolem), and try to unify it with
a //new// skolem! This results in an utter disaster.
The root of both these problems is `inferConstraintsDAC`. This patch
fixes the issue by no longer generating unification variables
directly in `inferConstraintsDAC`. Instead, we store the original
variables from a generic default type signature in `to_metas`, a new
field of `ThetaOrigin`, and in each iteration of `simplifyDeriv`, we
generate fresh meta tyvars (avoiding the second issue). Moreover,
this allows us to more carefully fine-tune the `TcLevel` under which
we create these meta tyvars, fixing the first issue.
Test Plan: make test TEST="T14932 T14933"
Reviewers: simonpj, bgamari
Reviewed By: simonpj
Subscribers: rwbarton, thomie, carter
GHC Trac Issues: #14932, #14933
Differential Revision: https://phabricator.haskell.org/D4507
>---------------------------------------------------------------
9893042604cda5260cb0f7b674ed5c34b419e403
compiler/typecheck/TcDerivInfer.hs | 106 ++++++++++++----------
compiler/typecheck/TcDerivUtils.hs | 97 ++++++++++++++------
testsuite/tests/deriving/should_compile/T14932.hs | 23 +++++
testsuite/tests/deriving/should_compile/T14933.hs | 22 +++++
testsuite/tests/deriving/should_compile/all.T | 2 +
5 files changed, 171 insertions(+), 79 deletions(-)
Diff suppressed because of size. To see it, use:
git diff-tree --root --patch-with-stat --no-color --find-copies-harder --ignore-space-at-eol --cc 9893042604cda5260cb0f7b674ed5c34b419e403
More information about the ghc-commits
mailing list