rust-lang/rust — pull request #17869 by bkoropoff (2014-10-08 07:18:25+00:00)
Title: Attempt to fix closure upvar soundness bug in regionck

This PR is based on #17784, which fixes closure soundness problems in borrowck. Only the last two commits are unique to this PR.

My understanding of regionck is still evolving, so I'm not sure if this is the right approach. Feedback is appreciated.

- In `link_reborrowed_region`, we account for the ability of upvars to
change their mutability due to later processing. A map of recursive
region links we may want to establish in the future is maintained,
with the links being established when the mutability of the borrow
is adjusted.
- When asked to establish a region link for an upvar, we link it to
the region of the closure body. This creates the necessary
constraint to stop unsound reborrows from the closure environment.

This partially (maybe completely) solves issue #17403. Remaining work:

- This is only known to help with by-ref upvars. I have not looked at
by-value upvars yet to see if they can cause problems.
- The error diagnostics that result from failed region inference are
pretty inscrutible.