Commit graph

83 commits

Author SHA1 Message Date
Felix S. Klock II
a5a3f765eb NLL: On "cannot move out of type" error, print original source before rewrite.
* Arguably this change is sometimes injecting noise into the output
   (namely in the cases where the suggested rewrite is inline with the
   suggestion and we end up highlighting the original source code).
   I would not be opposed to something more aggressive/dynamic, like
   revising the suggestion code to automatically print the original
   source when necessary (e.g. when the error does not have a span
   that includes the span of the suggestion).

 * Also, as another note on this change: The doc comment for `Diagnostic::span_suggestion`
   says:
    /// The message
    ///
    /// * should not end in any punctuation (a `:` is added automatically)
    /// * should not be a question
    /// * should not contain any parts like "the following", "as shown"

   but the `:` is *not* added when the emitted line appears
   out-of-line relative to the suggestion. I find that to be an
   unfortunate UI experience.

----

As a drive-by fix, also changed code to combine multiple suggestions
for a pattern into a single multipart suggestion (which vastly
improves user experience IMO).

----

Includes the updates to expected NLL diagnostics.
2018-07-31 17:27:29 +02:00
bors
0560747652 Auto merge of #52678 - matthewjasper:better-spans, r=nikomatsakis
[NLL] Use better spans in some errors

* Use the span of the discriminant and patterns for "fake" statements created to properly check matches. I plan to special case these soon, but this felt like a good first step
* Use the span of the statement, rather than the initialization, when reporting move errors for `let x = ...`, which avoids giving an unhelpful suggestion to use `&{ }`.

r? @nikomatsakis cc @pnkfelix
2018-07-28 07:42:13 +00:00
bors
6998b369fa Auto merge of #52733 - pnkfelix:issue-51348-make-temp-for-each-candidate-in-arm, r=nikomatsakis
[NLL] make temp for each candidate in `match` arm

In NLL, `ref mut` patterns leverage the two-phase borrow infrastructure to allow the shared borrows within a guard before the "activation" of the mutable borrow when we begin execution of the match arm's body. (There is further discussion of this on PR #50783.)

To accommodate the restrictions we impose on two-phase borrows (namely that there is a one-to-one mapping between each activation and the original initialization), this PR is making separate temps for each candidate pattern. So in an arm like this:
```rust
PatA(_, ref mut ident) |
PatB(ref mut ident) |
PatC(_, _, ref mut ident) |
PatD(ref mut ident) if guard_stuff(ident) => ...
```

instead of 3 temps (two for the guard and one for the arm body), we now have 4 + 2 temps associated with `ident`: one for each candidate plus the actual temp that the guard uses directly, and then the sixth is the temp used in the arm body.

Fix #51348
2018-07-27 11:02:27 +00:00
bors
b18b9edf00 Auto merge of #52681 - pnkfelix:z-borrowck-migrate, r=nikomatsakis
Add `-Z borrowck=migrate`

This adds `-Z borrowck=migrate`, which represents the way we want to migrate to NLL under Rust versions to come. It also hooks this new mode into `--edition 2018`, which means we're officially turning NLL on in the 2018 edition.

The basic idea of `-Z borrowck=migrate` that there are cases where NLL is fixing old soundness bugs in the borrow-checker, but in order to avoid just breaking code by immediately rejecting the programs that hit those soundness bugs, we instead use the following strategy:

If your code is accepted by NLL, then we accept it.
If your code is rejected by both NLL and the old AST-borrowck, then we reject it.
If your code is rejected by NLL but accepted by the old AST-borrowck, then we emit the new NLL errors as **warnings**.

These warnings will be turned into hard errors in the future, and they say so in these diagnostics.

Fix #46908
2018-07-27 09:10:07 +00:00
Matthew Jasper
71637c2937 Use better spans for dummy accesses used in matches 2018-07-26 22:06:12 +01:00
bors
45b48b9b6d Auto merge of #52735 - Mark-Simulacrum:rollup, r=Mark-Simulacrum
Rollup of 16 pull requests

Successful merges:

 - #52558 (Add tests for ICEs which no longer repro)
 - #52610 (Clarify what a task is)
 - #52617 (Don't match on region kinds when reporting NLL errors)
 - #52635 (Fix #[linkage] propagation though generic functions)
 - #52647 (Suggest to take and ignore args while closure args count mismatching)
 - #52649 (Point spans to inner elements of format strings)
 - #52654 (Format linker args in a way that works for gcc and ld)
 - #52667 (update the stdsimd submodule)
 - #52674 (Impl Executor for Box<E: Executor>)
 - #52690 (ARM: expose `rclass` and `dsp` target features)
 - #52692 (Improve readability in a few sorts)
 - #52695 (Hide some lints which are not quite right the way they are reported to the user)
 - #52718 (State default capacity for BufReader/BufWriter)
 - #52721 (std::ops::Try impl for std::task::Poll)
 - #52723 (rustc: Register crates under their real names)
 - #52734 (sparc ABI issue - structure returning from function is returned in 64bit registers (with tests))

Failed merges:

 - #52678 ([NLL] Use better spans in some errors)

r? @ghost
2018-07-26 17:42:59 +00:00
Felix S. Klock II
a0ac188220 Regression test for the bug. 2018-07-26 15:15:19 +02:00
Felix S. Klock II
9f05f29e56 Incorporate edition flag testing into tests of -Z borrowck=migrate. 2018-07-26 14:59:00 +02:00
Felix S. Klock II
1a59dafe11 Bug fix: #![feature(nll)] takes precedence over -Z borrowck=migrate.
(Includes test illustrating desired behavior; compare its diagnostic
output to that of the file `borrowck-migreate-to-nll.rs`.)
2018-07-26 13:17:55 +02:00
Felix S. Klock II
f808405328 Test for -Z borrowck=migrate.
Note that this test is carefully crafted to *try* to not segfault
during its run.  Howver, it really is representing unsound code that
should be rejected after we manage to remove the AST-borrowck entirely
from the compiler.
2018-07-26 13:17:55 +02:00
Niko Matsakis
92786a48f8 consolidate and use find_sub_region_live_at for everything
remove the old blame system
2018-07-25 06:38:21 +03:00
Matthew Jasper
338d545b90 Don't match on region kinds when reporting NLL errors
With NLL region kinds are always ReVar
2018-07-23 20:54:09 +01:00
David Wood
c64db0078a
Fallback to general error handling in ICE cases. 2018-07-22 12:53:55 +01:00
David Wood
571eec627c
Improved closure errors. 2018-07-22 12:49:35 +01:00
David Wood
24c5751197
Classify aggregate rvalues as assignments. 2018-07-22 12:23:53 +01:00
Matthew Jasper
12412749ab Add specific message when moving from upvars in a non-FnOnce closure 2018-07-21 18:40:46 +01:00
Matthew Jasper
a06b2433fc Update tests for new NLL mutability errors 2018-07-20 20:01:15 +01:00
Niko Matsakis
a6adb1ebff find and highlight the & or '_ in region_name 2018-07-09 00:20:36 -04:00
bors
a178cba9f1 Auto merge of #52021 - nikomatsakis:nll-region-errors, r=estebank
refactor and cleanup region errors for NLL

This is a WIP commit. It simplifies some of the code from https://github.com/rust-lang/rust/pull/51536 and extends a few more steps towards the errors that @davidtwco and I were shooting for. These are intended as a replacement for the general "unable to infer lifetime" messages -- one that is actually actionable. We're certainly not there yet, but the overall shape hopefully gets a bit clearer.

I'm thinking about trying to open up an internals thread to sketch out the overall plan and perhaps discuss how to get the wording right, which special cases to handle, etc.

r? @estebank
cc @davidtwco
2018-07-06 23:36:16 +00:00
Mikhail Modin
f247a3e490 fix for issue #8636 2018-07-05 11:34:10 +01:00
Niko Matsakis
727f01700b write code to extract region names and emit new style message 2018-07-04 05:09:33 -04:00
bors
8772747c5f Auto merge of #51862 - estebank:lifetime-spans, r=nikomatsakis
Point to lifetime spans on lifetime errors
2018-06-30 16:52:12 +00:00
Esteban Küber
03bcebbc60 Also point to free named region on lifetime errors 2018-06-28 11:12:44 -07:00
Esteban Küber
3005162f98 Extend support to get_generics for all NodeItems 2018-06-28 11:12:43 -07:00
Esteban Küber
5436a5c55a Point to lifetime in fn definition on lifetime error note 2018-06-28 11:12:42 -07:00
Esteban Küber
cd8ca26257 Point at lifetimes instead of def span for E0195 2018-06-28 11:12:41 -07:00
Matthew Jasper
2cb0a0631a Update tests for grouped nll move errors 2018-06-27 22:46:58 +01:00
Santiago Pastorino
ad612d660c
Fix erroneous error note when using field after move 2018-06-22 18:23:33 -03:00
Niko Matsakis
8289bf2994 use pat_ty_adjusted from expr_use_visitor to type of arguments 2018-06-21 14:32:52 -04:00
Felix S. Klock II
35971ccc41 Update the existing UI tests to reflect diagnostic changes in NLL. 2018-06-19 19:41:48 +02:00
Felix S. Klock II
2d4df5b53e NLL: Updates to diagnostic output in test/ui. 2018-06-19 19:38:37 +02:00
Felix S. Klock II
e5b378b18d Update the expected error output to reflect changes in this PR. 2018-06-06 22:42:27 +02:00
Felix S. Klock II
9b24595226 Drive-by: Make assignment conflict tests in borrowck-vec-pattern-nesting.rs robust for NLL. 2018-06-06 22:42:27 +02:00
bors
f9157f5b86 Auto merge of #51242 - ytausky:mut-ref, r=estebank
Suggest not mutably borrowing a mutable reference

This PR would (hopefully) solve #45392. I deviated a bit from @estebank's instructions since the error span only included the borrowed expression (e.g. the `b` in `&mut b`). I also didn't check the mutability of the local binding, since this whole case is concerned with an immutable local.

I can see two outstanding questions:
1. `note_immutability_blame` is called in two places, but I only have one test case. I think it covers the call in `report_bckerror`, but I'm not sure how to trigger the call from `report_aliasability_violation`.
2. There is one failing test, where the local binding is `self: &mut Self`. I'm not entirely sure what the correct output should be, but I think the new message should also apply. Unfortunately, since this parameter is parsed differently, its `let_span` covers both the pattern and the type, leading to a wrong suggestion text. I'm not sure how to correctly identify this case.
2018-06-05 01:47:13 +00:00
Yaron Tausky
3303e6847b Suggest not mutably borrowing a mutable reference
This commit is concerned with the case where the user tries to mutably
borrow a mutable reference, thereby triggering an error. Instead of the
existing suggestion to make the binding mutable, the compiler will now
suggest to avoid borrowing altogether.
2018-06-01 23:17:10 +02:00
Niko Matsakis
a667049c33 also check let arms and nested patterns for mutable borrows 2018-06-01 10:06:02 -04:00
Niko Matsakis
8a624b737a change PointerKind::Implicit to a note
`PointerKind` is included in `LoanPath` and hence forms part of the
equality check; this led to having two unequal paths that both
represent `*x`, depending on whether the `*` was inserted
automatically or explicitly. Bad mojo. The `note` field, in contrast,
is intended more-or-less primarily for this purpose of adding extra
data.
2018-05-31 10:17:51 -04:00
Felix S. Klock II
5c30dc85c2 rust-lang/rust#41962 has a new error with my new code. Incorporate that into my code.
In particular, I am adding an implicit injected borrow on the pattern
matches, and when we go around the loop, the compiler is reporting
that this injected borrow is conflicting with the move of the original
value when the match succeeds.
2018-05-29 23:02:40 +02:00
Felix S. Klock II
d8bd5336c9 rust-lang/rust#51025: improve test robustness so that they work under NLL too. 2018-05-25 13:00:51 +02:00
Niko Matsakis
ed72950fde rework causal tracking to explore outlives relationships
Instead of tracking the "cause" of each bit that gets added, try to
recover that by walking outlives relationships. This is currently
imprecise, since it ignores the "point" where the outlives relationship
is incurred -- but that's ok, since we're about to stop considering that
overall in a later commit. This does seem to affect one error message
negatively, I didn't dig *too* hard to find out why.
2018-05-09 23:21:24 -03:00
Felix S. Klock II
699c98ec6a Removed .nll.stderr files that currently match their corresponding .stderr files. 2018-04-18 15:37:30 +02:00
Felix S. Klock II
032081cdff Trivial updates to .nll.stderr files post-rebase, reflecting s/-Znll/nll/ in messages. 2018-04-18 15:37:23 +02:00
Felix S. Klock II
ea454746b3 Update the previously checkpointed (but unused by bors) tests to reflect current reality. 2018-04-18 15:37:18 +02:00
Niko Matsakis
45d281d7fa remove -Znll -- borrowck=mir implies nll now 2018-04-15 07:13:42 -04:00
Felix S. Klock II
746d63a203 Checkpoint the current status of NLL on ui tests via compare-mode=nll. 2018-04-11 00:38:35 +02:00
Felix S. Klock II
1c8d2bdda1 Workaround rust-lang/rust#49855 by forcing rustc_error in any mode, including NLL.
NOTE: I was careful to make each change in a manner that preserves the
existing diagnostic output (usually by ensuring that no lines were
added or removed). This means that the resulting source files are not
as nice to read as they were at the start. But we will have to review
these cases by hand anyway as follow-up work, so cleanup could
reasonably happen then (or not at all).
2018-04-11 00:20:05 +02:00
bobtwinkles
bacd120957 Add test from #49736
Fixes #49736
2018-04-06 15:00:45 -04:00
bobtwinkles
0801bd1d0e two-phase borrows: support multiple activations in one statement
The need for this has arisen since the introduction of two-phase borrows on
method autorefs.

Fixes 49635
Fixes 49662
2018-04-04 23:08:10 -04:00
bors
b12af86a77 Auto merge of #49348 - bobtwinkles:extend_2pb, r=nikomatsakis
Extend two-phase borrows to apply to method receiver autorefs

Fixes #48598 by permitting two-phase borrows on the autorefs created when functions and methods.
2018-04-03 09:11:35 +00:00
bobtwinkles
d37a7ab32b Extend two-phase borrows to apply to method receiver autorefs
This is required to compile things like

src/test/ui/borrowck/two-phase-method-receivers.rs
2018-03-24 22:00:38 -04:00