Fix an infinite loop in niFixTCvSubst
authorSimon Peyton Jones <simonpj@microsoft.com>
Sat, 16 Jun 2018 22:25:53 +0000 (23:25 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Mon, 18 Jun 2018 07:23:16 +0000 (08:23 +0100)
commitd6216443c61cee94d8ffc31ca8510a534d9406b9
tree21fba696d61323ff49ee4fb041f492435b8636f7
parent50d7b2ac2fcfe954455f0bc9081e1dd3a2eef51d
Fix an infinite loop in niFixTCvSubst

Trac #14164 made GHC loop, a pretty serious error. It turned
out that Unify.niFixTCvSubst was looping forever, because we
had a substitution like
    a :-> ....(b :: (c :: d))....
    d :-> ...
We correctly recognised that d was free in the range of the
substitution, but then failed to apply it "deeeply enough"
to the range of the substiuttion, so d was /still/ free in
the range, and we kept on going.

Trac #9106 was caused by a similar problem, but alas my
fix to Trac #9106 was inadequate when the offending type
variable is more deeply buried.  Urk.

This time I think I've fixed it!  It's much more subtle
than I though, and it took most of a long train journey
to figure it out.  I wrote a long note to explain:
Note [Finding the substitution fixpoint]
compiler/types/Unify.hs
testsuite/tests/indexed-types/should_compile/T14164.hs [new file with mode: 0644]
testsuite/tests/indexed-types/should_compile/all.T