Commit graph

70283 commits

Author SHA1 Message Date
Eduard-Mihai Burtescu
919ed409b0 tests: update to include move annotations in MIR. 2017-11-28 04:18:32 +02:00
Eduard-Mihai Burtescu
170b88dc79 rustc_mir: require that Copy(L) satisfies typeof L: Copy. 2017-11-28 04:18:32 +02:00
Eduard-Mihai Burtescu
c42a118188 MIR: split Operand::Consume into Copy and Move. 2017-11-28 04:18:32 +02:00
Eduard-Mihai Burtescu
73f5bab33f rustc_mir: enforce that arguments are replaced with Local's only. 2017-11-28 04:11:09 +02:00
Eduard-Mihai Burtescu
0477319afb rustc_mir: move storage_dead_or_drop_error_reported logic to access_lvalue. 2017-11-28 04:11:09 +02:00
bors
b087a991fc Auto merge of #46312 - kennytm:rollup, r=kennytm
Rollup of 10 pull requests

- Successful merges: #45506, #46174, #46231, #46240, #46249, #46258, #46262, #46275, #46282, #46285
- Failed merges:
2017-11-27 23:40:16 +00:00
kennytm
83a6f38556 Rollup merge of #46285 - SimonSapin:twos-complement, r=GuillaumeGomez
Document non-obvious behavior of fmt::UpperHex & co for negative integers

Before stabilization I’d have suggested changing the behavior,  but that time is past.
2017-11-28 03:16:50 +08:00
kennytm
8dd10e62cc Rollup merge of #46282 - estebank:impl-trait-cicle-span, r=arielb1
Shorten output of E0391

Use the shorter `def_span` on the impl-Trait cyclic reference errors.
2017-11-28 03:16:49 +08:00
kennytm
81ba35228c Rollup merge of #46275 - dtolnay:compiletest-libc, r=Mark-Simulacrum
Compiletest libc dependency can be unix-only

In main.rs libc is imported as:

```rust
#[cfg(unix)]
extern crate libc;
```

This came up in https://github.com/laumann/compiletest-rs/pull/90.
2017-11-28 03:16:48 +08:00
kennytm
7707b18621 Rollup merge of #46262 - udoprog:linked-list-remove-if, r=dtolnay
Introduce LinkedList::drain_filter

This introduces `LinkedList::remove_if`.

This operation embodies one of the use-cases where `LinkedList` would typically be preferred over `Vec`: random removal and retrieval.

There are a number of considerations with this:

Should there be two `remove_if` methods? One where elements are only removed, one which returns a collection of removed elements.

Should this be implemented using a draining iterator pattern that covers both cases? I suspect that would incur a bit of overhead (moving the element into the iterator, then into a new collection). But I'm not sure. Maybe that's an acceptable compromise to maximize flexibility.

I don't feel I've had enough exposure to unsafe programming in rust to be certain the implementation is correct. This relies quite heavily on moving around copies of Shared pointers to make the code reasonable. Please help me out :).
2017-11-28 03:16:47 +08:00
kennytm
f33edd2ed0 Rollup merge of #46258 - colinmarsh19:master, r=estebank
Remove semicolon note

In reference to issue #46186
r? @estebank

First time doing a pull request, if there are any suggestions on how to improve this please let me know.
@jjolly
2017-11-28 03:16:47 +08:00
kennytm
a60ffa06ae Rollup merge of #46249 - estebank:suggest-slice, r=arielb1
Suggest using slice when encountering `let x = ""[..];`

Fix #26319.
2017-11-28 03:16:46 +08:00
kennytm
840e6c12ba Rollup merge of #46240 - SimonSapin:from_str_radix-docs, r=estebank
Expand docs of <$Int>::from_str_radix, based on that of char::to_digit
2017-11-28 03:16:45 +08:00
kennytm
26330b1757 Rollup merge of #46231 - ritiek:verbs, r=arielb1
MIR: Fix value moved diagnose messages

#45960. I believe this will take a different approach. Simply replacing all nouns to verbs (`desired_action`) messes up the message `use of moved value` (although fixes the message in original issue). Here is what happens:

<pre>
$ rustc -Zborrowck-mir src/test/ui/borrowck/borrowck-reinit.rs

error[E0382]: <b>used</b> of moved value: `x` (Mir)
  --> src/test/ui/borrowck/borrowck-reinit.rs:18:16
   |
17 |     drop(x);
   |          - value moved here
18 |     let _ = (1,x);
   |                ^ value used here after move

error: aborting due to 2 previous errors
</pre>
(Notice: *"**used** of moved value: `x`"* instead of *"**use**"*)

Which does not seem to be okay.

After experimenting a bit, it looks like [`report_use_of_moved_value()`](1dc0b573e7/src/librustc_mir/borrow_check.rs (L1319)) tries to handle both these messages by taking in only one form of`desired_action`.

These messages rise from: *"[{noun} of moved value](1dc0b573e7/src/librustc_mir/borrow_check.rs (L1338-L1342))"* and *"[value {verb} here after move](1dc0b573e7/src/librustc_mir/borrow_check.rs (L1343))"*.

This PR fixes *"value {verb} here after move"* type messages by passing a corresponding verb (`desired_action`) instead of the original noun.
2017-11-28 03:16:44 +08:00
kennytm
aa99bd96fd Rollup merge of #46174 - stjepang:stabilize-spinloophint, r=sfackler
Stabilize spin_loop_hint

Stabilize `spin_loop_hint` in release `1.23.0`.
I've also renamed feature `hint_core_should_pause` to `spin_loop_hint`.

cc #41196
2017-11-28 03:16:43 +08:00
kennytm
2f012e4405 Rollup merge of #45506 - ia0:mpsc_recv_error_from, r=alexcrichton
Implement From<RecvError> for TryRecvError and RecvTimeoutError

According to the documentation, it looks to me that `TryRecvError` and `RecvTimeoutError` are strict extensions of `RecvError`. As such, it makes sense to allow conversion from the latter type to the two former types without constraining future developments.

This permits to write `input.recv()?` and `input.recv_timeout(timeout)?` in the same function for example.
2017-11-28 03:16:41 +08:00
Stjepan Glavina
d5e8b61054 Change the stabilization version to 1.24.0 2017-11-27 19:24:13 +01:00
bors
560a5da9f1 Auto merge of #46022 - matthewjasper:cannot-assign-twice-error, r=arielb1
Mir Borrowck: Parity with Ast for E0384 (Cannot assign twice to immutable)

- Closes #45199
- Don't allow assigning to dropped immutable variables
- Show the "first assignment" note on the first assignment that can actually come before the second assignment.
- Make "first assignment" notes point to function parameters if needed.
- Don't show a "first assignment" note if the first and second assignment have the same span (in a loop). This matches ast borrowck for now, but maybe this we should add "in previous loop iteration" as with some other borrowck errors. (Commit 2)
- Use revisions to check mir borrowck for the existing tests for this error. (Commit 3)

~~Still working on a less ad-hoc way to get 'first assignment' notes to show on the correct assignment. Also need to check mutating function arguments.~~ Now using a new dataflow pass.
2017-11-27 17:13:20 +00:00
bors
58e1234cdd Auto merge of #44884 - arielb1:pack-safe, r=nikomatsakis,eddyb
Make accesses to fields of packed structs unsafe

To handle packed structs with destructors (which you'll think are a rare
case, but the `#[repr(packed)] struct Packed<T>(T);` pattern is
ever-popular, which requires handling packed structs with destructors to
avoid monomorphization-time errors), drops of subfields of packed
structs should drop a local move of the field instead of the original
one.

That's it, I think I'll use a strategy suggested by @Zoxc, where this mir
```
drop(packed_struct.field)
```

is replaced by
```
tmp0 = packed_struct.field;
drop tmp0
```

cc #27060 - this should deal with that issue after codegen of drop glue
is updated.

The new errors need to be changed to future-compatibility warnings, but
I'll rather do a crater run first with them as errors to assess the
impact.

cc @eddyb

Things which still need to be done for this:
 - [ ] - handle `repr(packed)` structs in `derive` the same way I did in `Span`, and use derive there again
 - [ ] - implement the "fix packed drops" pass and call it in both the MIR shim and validated MIR pipelines
 - [ ] - do a crater run
 - [ ] - convert the errors to compatibility warnings
2017-11-27 14:23:02 +00:00
Esteban Küber
fa44927d2c reword to "consider borrowing here: {suggestion}" 2017-11-27 06:03:40 -08:00
Esteban Küber
487daabb52 Fix test 2017-11-27 06:01:16 -08:00
Esteban Küber
8a93deca9a Make main span in impl-trait ciclic reference point to def_span 2017-11-27 06:00:20 -08:00
bors
5face5f4f5 Auto merge of #46292 - cramertj:update-libc, r=alexcrichton
Update libc to include latest Fuchsia fix

r? @alexcrichton

cc @smklein
2017-11-27 11:44:17 +00:00
Matthew Jasper
d64a31882f Update tests involving E0384 for mir-borrowck 2017-11-27 08:07:58 +00:00
Matthew Jasper
6853b34f0e Don't show first assignment in loops
Matches current ast-borrowck behavior.
2017-11-27 08:07:49 +00:00
Matthew Jasper
d409dbf983 Add initialization info to MoveData
* Used for new dataflow to track if a variable has every been initialized
* Used for other dataflows that need to be updated for initializations
2017-11-27 08:06:36 +00:00
bors
ea51b19dc7 Auto merge of #46286 - SimonSapin:patch-6, r=alexcrichton
Increment Nightly version to 1.24.0

The beta channel is now at 1.23.0-beta.1.
2017-11-27 07:54:39 +00:00
bors
8270faf8dc Auto merge of #46284 - SimonSapin:deprecate-formatter-flags, r=sfackler
Deprecate the Formatter::flags method, fix #46237

This fixes #46237.
2017-11-27 05:26:23 +00:00
bors
73df30d467 Auto merge of #46273 - semarie:openbsd-libc++, r=alexcrichton
make OpenBSD to use libc++ instead of (e)stdc++
2017-11-27 01:43:41 +00:00
Taylor Cramer
9d96d77f77 Update libc to include latest Fuchsia fix 2017-11-26 17:01:15 -08:00
Simon Sapin
ef7cd00c8e
Increment Nightly version to 1.24.0
The beta channel is now at 1.23.0-beta.1.
2017-11-26 23:04:40 +01:00
Simon Sapin
a326d8d1ba Document non-obvious behavior of fmt::UpperHex & co for negative integers
Before stabilization I’d have suggested changing the behavior,
but that time is past.
2017-11-26 22:53:03 +01:00
Simon Sapin
5e11c8fc2b Deprecate the Formatter::flags method, fix #46237 2017-11-26 22:45:28 +01:00
bors
9015b142b4 Auto merge of #46168 - durka:macro-backtrace, r=durka
mention nightly in -Z external-macro-backtrace note

Fix #46167 by mentioning that you need nightly in the message that tells you to pass `-Z external-macro-backtrace`.

Rationale:

1. The reason for having this message is to increase discoverability of the functionality. If the message is only shown on nightly it's less disoverable.
2. The same approach is taken if you call a const fn in const context without its feature gate (previously, if you called it without `#![feature(const_fn)]`).

cc @kennytm
2017-11-26 21:30:28 +00:00
Esteban Küber
0b2d21e32b Make impl-trait ciclical reference error point to def_span 2017-11-26 12:35:19 -08:00
Esteban Küber
aabb604313 Move "auto trait leak" impl-trait cycle dependency test to ui 2017-11-26 12:32:30 -08:00
bors
827cb0d61e Auto merge of #46106 - est31:master, r=nikomatsakis
Add a MIR-borrowck-only output mode

Removes the `-Z borrowck-mir` flag in favour of a `-Z borrowck=mode` flag where mode can be `mir`, `ast`, or `compare`.

* The `ast` mode represents the current default, passing `-Z borrowck=ast` is equivalent to not passing it at all.
* The `compare` mode outputs both the output of the MIR borrow checker and the AST borrow checker, each error with `(Ast)` and `(Mir)` appended. This mode has the same behaviour as `-Z borrowck-mir` had before this commit.
* The `mir` mode only outputs the results of the MIR borrow checker, while suppressing the errors of the ast borrow checker

The PR also updates the tests to use the new flags.

closes  #46097
2017-11-26 19:03:57 +00:00
Alex Burka
5da957cbc6 mention nightly in -Z external-macro-backtrace note 2017-11-26 18:28:38 +00:00
Ariel Ben-Yehuda
f3b2d7f3a7 improve error messages 2017-11-26 19:01:19 +02:00
bors
71b21ed0da Auto merge of #46253 - eddyb:return-aliasing, r=nagisa
rustc_trans: don't apply noalias on returned references.

In #45225 frozen returned `&T` were accidentally maked `noalias`, unlike `&mut T`.
Return value `noalias` is only sound for functions that return dynamic allocations, e.g. `Box`, and using it on anything else can lead to miscompilation, as LLVM assumes certain usage patterns.
Fixes #46239.
2017-11-26 16:38:36 +00:00
est31
d79179891a Use the official abbrev. 2017-11-26 16:59:47 +01:00
est31
755fa9c23e Update tests for -Zborrowck-mir -> -Zborrowck=mode migration 2017-11-26 16:39:15 +01:00
est31
c9af68e90c Replace -Zborrowck-mir with -Zborrowck=mode
where mode is one of {ast,mir,compare}.

This commit only implements the functionality.
The tests will be updated in a follow up commit.
2017-11-26 16:36:52 +01:00
colinmarsh19
096e698e4e
Changed to correct quotes 2017-11-26 07:40:29 -07:00
colinmarsh19
f6b80d4164
Added .rs extension 2017-11-26 07:36:56 -07:00
Ariel Ben-Yehuda
47d53e8d78 mark rustfmt as broken
There's a trailing whitespace problem in one of the tests. @nrc said
he'll go fix it quickly, but until then I'll like to land this PR.

I suspect this happened because one of the dependencies in the
Cargo.lock I updated had changed the format of the XML they emit, but
that has to be investigated.
2017-11-26 16:12:43 +02:00
Ariel Ben-Yehuda
7dbbbf6607 fix NetBSD 2017-11-26 16:12:43 +02:00
Ariel Ben-Yehuda
617b413e18 limit packed copy-out to non-generic Copy structs 2017-11-26 16:12:43 +02:00
Ariel Ben-Yehuda
dee8a71cd5 fix #[derive] implementation for repr(packed) structs
Fix the derive implementation for repr(packed) structs to move the
fields out instead of calling functions on references to each subfield.

That's it, `#[derive(PartialEq)]` on a packed struct now does:
```Rust
fn eq(&self, other: &Self) {
    let field_0 = self.0;
    let other_field_0 = other.0;
    &field_0 == &other_field_0
}
```

Instead of
```Rust
fn eq(&self, other: &Self) {
    let ref field_0 = self.0;
    let ref other_field_0 = other.0;
    &*field_0 == &*other_field_0
}
```

Taking (unaligned) references to each subfield is undefined, unsound and
is an error with MIR effectck, so it had to be prevented. This causes
a borrowck error when a `repr(packed)` struct has a non-Copy field (and
therefore is a [breaking-change]), but I don't see a sound way to avoid
that error.
2017-11-26 16:12:43 +02:00
Ariel Ben-Yehuda
1a2d443f55 make accessing packed fields a future-compat warning 2017-11-26 16:12:42 +02:00