80 Commits

Author SHA1 Message Date
Santiago Pastorino
b9f756416a Do not ignore lifetime bounds in Copy impls
Closes #29149
2018-01-30 14:00:27 -03:00
bors
90eb44a589 Auto merge of #47837 - eddyb:going-places, r=nikomatsakis
Replace "lvalue" terminology with "place".

See #46425 for the previous PR (which only changed MIR-related code).

r? @nikomatsakis
2018-01-29 19:47:48 +00:00
bors
70f7d5842f Auto merge of #47766 - spastorino:inference-dirty-list, r=nikomatsakis
Make region inference use a dirty list

r? @nikomatsakis
2018-01-29 10:51:07 +00:00
Eduard-Mihai Burtescu
46a9bdda78 rustc: replace "lvalue" terminology with "place" in the code. 2018-01-29 01:49:29 +02:00
Eduard-Mihai Burtescu
800166cf96 rustc: remove LvaluePreference argument from Ty::builtin_deref. 2018-01-29 00:42:51 +02:00
Niko Matsakis
205eba83e2
pacify the mercilous tidy 2018-01-26 20:51:40 -05:00
Niko Matsakis
b57ca9d97f
change from dirty_bit_vec to clean_bit_vec
Otherwise the vector is initially out of sync
2018-01-26 20:13:51 -05:00
Niko Matsakis
44b666816b
Adjust comment spacing
I suspect the lines would be long for tidy.
2018-01-26 19:58:54 -05:00
Santiago Pastorino
da545cee60 Make region inference use a dirty list
Fixes #47602
2018-01-26 21:56:49 -03:00
Alex Crichton
31f1aa5706 Rollup merge of #47529 - nikomatsakis:impl-trait-issue-38064, r=cramertj
track recursion limit when expanding existential impl trait

r? @cramertj
2018-01-25 12:48:51 -06:00
bors
fdc18b3067 Auto merge of #47353 - nikomatsakis:nll-issue-47189, r=pnkfelix+nmatsakis
renumber regions in generators

This fixes #47189, but I think we still have to double check various things around how to treat generators in MIR type check + borrow check (e.g., what borrows should be invalidated by a `Suspend`? What consistency properties should type check be enforcing anyway around the "interior" type?)

Also fixes #47587 thanks to @spastorino's commit.

r? @pnkfelix
2018-01-22 11:11:47 +00:00
bors
bc072ed0ca Auto merge of #47144 - estebank:moved-closure-arg, r=nikomatsakis
Custom error when moving arg outside of its closure

When given the following code:

```rust
fn give_any<F: for<'r> FnOnce(&'r ())>(f: F) {
    f(&());
}

fn main() {
    let mut x = None;
    give_any(|y| x = Some(y));
}
```

provide a custom error:

```
error: borrowed data cannot be moved outside of its closure
 --> file.rs:7:27
  |
6 |     let mut x = None;
  |         ----- borrowed data cannot be moved into here...
7 |     give_any(|y| x = Some(y));
  |              ---          ^ cannot be moved outside of its closure
  |              |
  |              ...because it cannot outlive this closure
```

instead of the generic lifetime error:

```
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
 --> file.rs:7:27
  |
7 |     give_any(|y| x = Some(y));
  |                           ^
  |
note: first, the lifetime cannot outlive the anonymous lifetime #2 defined on the body at 7:14...
 --> file.rs:7:14
  |
7 |     give_any(|y| x = Some(y));
  |              ^^^^^^^^^^^^^^^
note: ...so that expression is assignable (expected &(), found &())
 --> file.rs:7:27
  |
7 |     give_any(|y| x = Some(y));
  |                           ^
note: but, the lifetime must be valid for the block suffix following statement 0 at 6:5...
 --> file.rs:6:5
  |
6 | /     let mut x = None;
7 | |     give_any(|y| x = Some(y));
8 | | }
  | |_^
note: ...so that variable is valid at time of its declaration
 --> file.rs:6:9
  |
6 |     let mut x = None;
  |         ^^^^^
```

Fix #45983.
2018-01-22 05:30:37 +00:00
Santiago Pastorino
fcb9e928b7 Integrate generators to universal region setup 2018-01-19 21:32:43 -05:00
Niko Matsakis
072c3daa4c track recursion limit when expanding existential impl trait 2018-01-17 18:01:17 -05:00
Niko Matsakis
3b390e5420 remove bogus assertion and comments
The code (incorrectly) assumed that constants could not have generics
in scope, but it's not really a problem if they do.
2018-01-16 12:45:39 -05:00
Esteban Küber
1820da5211 Move diagnostic logic to its own module
- Move specialized borrow checker diagnostic for bindings escaping its
  closure to its own module.
- Move affected tests to `ui`.
2018-01-15 11:12:25 -08:00
Niko Matsakis
d201e83f71 renumber regions in the generator interior
Fixes #47189.
2018-01-11 06:05:05 -05:00
Niko Matsakis
bf02c57b16 simplify UniversalRegions::to_region_vid to just consult the map
This doesn't actually fix the bug, but seems better.
2018-01-11 06:05:05 -05:00
Niko Matsakis
00ce7eed7d resolve type and region variables in "NLL dropck"
Fixes #47022.
2018-01-10 10:15:08 -05:00
bors
0a3761e63e Auto merge of #46984 - arielb1:pre-statement-effect, r=nikomatsakis
NLL fixes

First, introduce pre-statement effects to dataflow to fix #46875. Edge dataflow effects might make that redundant, but I'm not sure of the best way to integrate them with liveness etc., and if this is a hack, this is one of the cleanest hacks I've seen.

And I want a small fix to avoid the torrent of bug reports.

Second, fix linking of projections to fix #46974

r? @pnkfelix
2018-01-03 21:06:21 +00:00
Ariel Ben-Yehuda
bd1bd76cd8 fix linking of place projections
projections other than dereferences of `&mut` used to do no linking. Fix
that.

Fixes #46974.
2017-12-24 14:56:52 +02:00
David Henningsson
dd6127e4af Mir: Add Terminatorkind::Abort
The Abort Terminatorkind will cause an llvm.trap function call to be
emitted.

Signed-off-by: David Henningsson <diwic@ubuntu.com>
2017-12-21 04:43:27 +01:00
Niko Matsakis
d925f4d1dd fix truncated comment 2017-12-20 16:51:33 -05:00
Santiago Pastorino
95b6148e31 Add nll_dump_cause helper to Session 2017-12-20 14:38:12 -05:00
Niko Matsakis
508a831dca use report_generic_bound_failure when we can in the compiler 2017-12-20 14:38:12 -05:00
Niko Matsakis
6b39781df6 connect NLL machinery to the NiceRegionError code 2017-12-20 14:38:12 -05:00
Niko Matsakis
e28d03f38b only dump causes if we have nothing better 2017-12-20 14:38:11 -05:00
Santiago Pastorino
3a185a510d Add three point error handling to borrowck
Closes #45988
2017-12-20 14:38:10 -05:00
Niko Matsakis
93afb1affc connect NLL type checker to the impl trait code
We now add the suitable `impl Trait` constraints.
2017-12-20 14:04:52 -05:00
Niko Matsakis
da63aaa7ab extract input_output code into its own module
No functional change.
2017-12-20 14:04:52 -05:00
Niko Matsakis
a66c6512aa pass UniversalRegions to MIR type-checker instead of fields
No functional change.
2017-12-20 14:04:52 -05:00
Niko Matsakis
4a967c9df7 propagate region_bound_pairs into MIR type-check 2017-12-20 14:04:51 -05:00
Niko Matsakis
fe89f4ba86 get the DefiningTy from the body_owner_kind not type
The type isn't a good idea because we want to treat constants
uniformly, regardless of what type of value they produce.
2017-12-20 14:04:51 -05:00
Niko Matsakis
0e64a756f8 integrate -Znll-dump-cause into borrowck 2017-12-20 14:04:51 -05:00
Niko Matsakis
594c386549 dump out causal information for "free region" errors
The result is not especially illuminating, but that's ok.
2017-12-20 14:04:51 -05:00
Paul Daniel Faria
e447b54bc3 Add tracking of causes for nll 2017-12-20 14:04:50 -05:00
Niko Matsakis
f6741d0a7a region_infer/values.rs: rustfmt 2017-12-20 14:04:50 -05:00
Niko Matsakis
1816ede386 be specific about what kind of normalization we mean 2017-12-19 04:28:45 -05:00
Niko Matsakis
3d826e5681 remove dead is_foo_free_region helpers
Only `is_local_free_region` is used.
2017-12-19 04:26:56 -05:00
Niko Matsakis
3c56c3610e fix comment on check_type_tests 2017-12-19 04:21:57 -05:00
Niko Matsakis
03bfb0f316 tweak comment on TypeTest to be more accurate 2017-12-19 04:18:15 -05:00
Niko Matsakis
4f43c5b1e7 stop dumping DefPath into "failed type test" errors
The prior messages were not stable across platforms.
2017-12-15 17:04:48 -05:00
Niko Matsakis
0f8ef0ca1a more concise debug output when dumping the value of a region 2017-12-15 10:27:54 -05:00
Niko Matsakis
0d6bd42abb make blame_span deterministic 2017-12-15 10:27:54 -05:00
Niko Matsakis
e9824c50ed impose inputs/ouputs on MIR after the fact
The input/output types found in `UniversalRegions` are not normalized.
The old code used to assign them directly into the MIR, which would
lead to errors when there was a projection in a argument or return
type. This also led to some special cases in the `renumber` code.

We now renumber uniformly but then pass the input/output types into
the MIR type-checker, which equates them with the types found in MIR.
This allows us to normalize at the same time.
2017-12-15 10:27:53 -05:00
Niko Matsakis
3fcb13ae45 handle projections with regions 2017-12-15 10:27:52 -05:00
Niko Matsakis
85e1d4749e propagate type tests from closure to closure creators
Currently, we only propagate type tests that exclude all regions from
the type.
2017-12-15 10:27:51 -05:00
Niko Matsakis
5804637a81 permit ClosureOutlivesRequirement to constrain regions or types 2017-12-15 10:27:51 -05:00
Niko Matsakis
c7cfa2367b thread through an implicit region body of the fn body 2017-12-15 10:27:50 -05:00
Niko Matsakis
02e65250e4 mild refactors of the control flow (no functional changes)
In the future, `check_type_tests` will also potentially propagate
constriants to its caller.
2017-12-15 10:27:49 -05:00