]> git.lizzy.rs Git - rust.git/commitdiff
auto merge of #17869 : bkoropoff/rust/bound-all-the-upvars, r=nikomatsakis
authorbors <bors@rust-lang.org>
Fri, 17 Oct 2014 02:07:24 +0000 (02:07 +0000)
committerbors <bors@rust-lang.org>
Fri, 17 Oct 2014 02:07:24 +0000 (02:07 +0000)
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.


Trivial merge