Commit graph

7064 commits

Author SHA1 Message Date
bors
95a401609f Auto merge of #45384 - mikhail-m1:mir_add_false_edges_terminator_kind, r=arielb1
add TerminatorKind::FalseEdges and use it in matches

impl #45184 and fixes #45043 right way.

False edges unexpectedly affects uninitialized variables analysis in MIR borrowck.
2017-11-04 00:09:14 +00:00
bors
2278506f68 Auto merge of #45247 - leodasvacas:implement-auto-trait-syntax, r=nikomatsakis
[Syntax] Implement auto trait syntax

Implements `auto trait Send {}` as a substitute for `trait Send {} impl Send for .. {}`.

See the [internals thread](https://internals.rust-lang.org/t/pre-rfc-renaming-oibits-and-changing-their-declaration-syntax/3086) for motivation. Part of #13231.

The first commit is just a rename moving from "default trait" to "auto trait". The rest is parser->AST->HIR work and making it the same as the current syntax for everything below HIR. It's under the `optin_builtin_traits` feature gate.

When can we remove the old syntax? Do we need to wait for a new `stage0`? We also need to formally decide for the new form (even if the keyword is not settled yet).

Observations:
- If you `auto trait Auto {}` and then `impl Auto for .. {}` that's accepted even if it's redundant.
- The new syntax is simpler internally which will allow for a net removal of code, for example well-formedness checks are effectively moved to the parser.
- Rustfmt and clippy are broken, need to fix those.
- Rustdoc just ignores it for now.

ping @petrochenkov @nikomatsakis
2017-11-03 19:07:45 +00:00
leonardo.yvens
97de8cae6e Parse auto traits the same as traits.
This moves the well formedness checks to the AST validation pass. Tests
were adjusted.

The auto keyword should be back-compat now.
2017-11-03 16:13:22 -02:00
leonardo.yvens
9d181ac2de Fix tests and rebase conflict 2017-11-03 16:13:21 -02:00
leonardo.yvens
8b586e68b5 auto trait future compatibility lint 2017-11-03 16:13:21 -02:00
leonardo.yvens
acf50ee236 Add tests for auto trait, fix parsing bug
Now we can do the well formedness checks in the parser, yay!
2017-11-03 16:13:21 -02:00
leonardo.yvens
06506bb751 [Syntax Breaking] Rename DefaultImpl to AutoImpl
DefaultImpl is a highly confusing name for what we now call auto impls,
as in `impl Send for ..`. The name auto impl is not formally decided
but for sanity anything is better than `DefaultImpl` which refers
neither to `default impl` nor to `impl Default`.
2017-11-03 16:13:20 -02:00
bors
e340996ff5 Auto merge of #45409 - tamird:suggest-match-default-bindings, r=nikomatsakis
typeck: suggest use of match_default_bindings feature

Fixes #45383.
Updates #42640.

r? @nikomatsakis
cc @tschottdorf

This needs a UI test, but thought I'd get some early feedback.
2017-11-02 16:28:16 +00:00
Mikhail Modin
2d71c5f10c add TerminatorKind::FalseEdges and use it in matches 2017-11-02 09:43:36 +03:00
bors
2be4cc0402 Auto merge of #45538 - nikomatsakis:nll-liveness, r=pnkfelix
enable non-lexical lifetimes in the MIR borrow checker

This PR, joint work with @spastorino, fills out the NLL infrastructure and integrates it with the borrow checker. **Don't get too excited:** it includes still a number of hacks (the subtyping code is particularly hacky). However, it *does* kinda' work. =)

The final commit demonstrates this by including a test that -- with both the AST borrowck and MIR borrowck -- reports an error by default. But if you pass `-Znll`, you only get an error from the AST borrowck, demonstrating that the integration succeeds:

```
struct MyStruct {
    field: String
}

fn main() {
    let mut my_struct = MyStruct { field: format!("Hello") };

    let value = &my_struct.field;
    if value.is_empty() {
        my_struct.field.push_str("Hello, world!");
        //~^ ERROR cannot borrow (Ast)
    }
}
```
2017-11-01 18:14:13 +00:00
Niko Matsakis
bf57a230eb WIP patch compile-fail/nll/region-ends-after-if-condition.rs 2017-10-31 12:41:40 -04:00
Niko Matsakis
a94b01a0e2 connect MIR borrowck with NLL 2017-10-31 12:41:40 -04:00
Eduard-Mihai Burtescu
1a7fb7dc78 rustc_typeck: use subtyping on the LHS of binops. 2017-10-31 17:34:46 +02:00
Tamir Duberstein
9844777a50
typeck: suggest use of match_default_bindings feature
Fixes #45383.
Updates #42640.
2017-10-30 19:09:23 -04:00
Vadim Petrochenkov
bf0cdb52f2 Add several lints into unused lint group
Remove a couple of obsolete lints
2017-10-29 22:14:23 +03:00
bors
2e6a1a9fb4 Auto merge of #45489 - oli-obk:json_diagnostics, r=petrochenkov
Fix a quadradic duplication in json for multi-suggestions

r? @petrochenkov
2017-10-28 16:15:17 +00:00
bors
dce604a8fe Auto merge of #44295 - plietar:extern-types, r=arielb1
Implement RFC 1861: Extern types

A few notes :

- Type parameters are not supported. This was an unresolved question from the RFC. It is not clear how useful this feature is, and how variance should be treated. This can be added in a future PR.

- `size_of_val` / `align_of_val` can be called with extern types, and respectively return 0 and 1. This differs from the RFC, which specified that they should panic, but after discussion with @eddyb on IRC this seems like a better solution.
If/when a `DynSized` trait is added, this will be disallowed statically.

- Auto traits are not implemented by default, since the contents of extern types is unknown. This means extern types are `!Sync`, `!Send` and `!Freeze`. This seems like the correct behaviour to me.
Manual `unsafe impl Sync for Foo` is still possible.

- This PR allows extern type to be used as the tail of a struct, as described by the RFC :
```rust
extern {
    type OpaqueTail;
}

#[repr(C)]
struct FfiStruct {
    data: u8,
    more_data: u32,
    tail: OpaqueTail,
}
```

However this is undesirable, as the alignment of `tail` is unknown (the current PR assumes an alignment of 1). Unfortunately we can't prevent it in the general case as the tail could be a type parameter :
```rust
#[repr(C)]
struct FfiStruct<T: ?Sized> {
    data: u8,
    more_data: u32,
    tail: T,
}
```

Adding a `DynSized` trait would solve this as well, by requiring tail fields to be bound by it.

- Despite being unsized, pointers to extern types are thin and can be casted from/to integers. However it is not possible to write a `null<T>() -> *const T` function which works with extern types, as I've explained here : https://github.com/rust-lang/rust/issues/43467#issuecomment-321678621

- Trait objects cannot be built from extern types. I intend to support it eventually, although how this interacts with `DynSized`/`size_of_val` is still unclear.

- The definition of `c_void` is unmodified
2017-10-28 13:34:12 +00:00
bors
c1a0b6d9eb Auto merge of #45503 - thombles:tk/i44339-v5, r=petrochenkov
Improve diagnostics when list of tokens has incorrect separators

Make `parse_seq_to_before_tokens` more resilient to error conditions. Where possible it is better if it can consume up to the final bracket before returning. This change improves the diagnostics in a couple of situations:

```
struct S(pub () ()); // omitted separator
use std::{foo. bar}; // used a similar but wrong separator
```

Fixes #44339
r? @petrochenkov
2017-10-28 03:02:17 +00:00
Paul Lietar
77f7e85d7f Implement RFC 1861: Extern types 2017-10-27 23:01:34 +02:00
bors
b218a02ad8 Auto merge of #45519 - michaelwoerister:dedup-errors, r=arielb1
Don't emit the same compiler diagnostic twice.

This PR makes the compiler filter out diagnostic messages that have already been emitted during the same compilation session.
2017-10-26 18:16:15 +00:00
Carol (Nichols || Goulding)
0e46cf4db4 Reword to avoid using either re-assignment or reassignment in errors 2017-10-25 11:29:52 -04:00
Michael Woerister
621d6f0f6d Update compile-fail tests for error message deduplication. 2017-10-25 15:02:26 +02:00
Oliver Schneider
014100df49
Compiletest should parse suggestions from the spans 2017-10-25 08:33:02 +02:00
Thomas Karpiniec
ae6a9e6fd2 Update tests for less noisy error messages 2017-10-25 07:39:15 +11:00
Zack M. Davis
214b0f2293 crate shorthand visibility modifier
With regrets, this breaks rustfmt and rls.

This is in the matter of #45388.
2017-10-22 23:58:13 -07:00
bors
fc1a03d7d0 Auto merge of #45442 - matthewjasper:const-dynamic-capture-error, r=petrochenkov
Cleanly error for non-const variable in associated const

Not sure if wrapping the whole `visit::walk_impl_item` call is correct.
Closes #44239
2017-10-22 15:17:08 +00:00
bors
87a8e8e073 Auto merge of #45359 - arielb1:escaping-borrow, r=eddyb
Fix a few bugs in drop generation

This fixes a few bugs in drop generation, one of which causes spurious MIR borrowck errors.

Fixes #44832.

r? @eddyb
2017-10-20 14:33:43 +00:00
matthewjasper
02635c2d37 Cleanly error for non-const expression in associated const 2017-10-19 19:48:57 +01:00
kennytm
342e01b742
Rollup merge of #45352 - alexcrichton:emscripten-tests, r=nikomatsakis
test: Update Emscripten failures/passing

All tests should now have annotation for *why* they're ignored on emscripten. A
few tests no longer need such an annotation as well!

Closes #41299
2017-10-20 00:01:52 +08:00
bors
e3fb84e951 Auto merge of #45232 - zackmdavis:moar_lint_suggestions, r=estebank
code suggestions for non-shorthand field pattern, no-mangle lints

continuing in the spirit of #44942

![moar_lint_suggestions](https://user-images.githubusercontent.com/1076988/31485011-3b20cc80-aee7-11e7-993d-81267ab77732.png)

r? @estebank
2017-10-19 11:41:11 +00:00
Ariel Ben-Yehuda
0caba178df run EndRegion when unwinding otherwise-empty scopes
Improves #44832

borrowck-overloaded-index-move-index.rs - fixed
borrowck-multiple-captures.rs - still ICE
borrowck-issue-2657-1.rs - fixed
borrowck-loan-blocks-move.rs - fixed
borrowck-move-from-subpath-of-borrowed-path.rs - fixed
borrowck-mut-borrow-linear-errors.rs - still ICE
borrowck-no-cycle-in-exchange-heap.rs - fixed
borrowck-unary-move.rs - fixed
borrowck-loan-blocks-move-cc.rs - fixed
borrowck-vec-pattern-element-loan.rs - still broken
2017-10-18 14:11:06 +03:00
Alex Crichton
d9ecdfe3a7 test: Update Emscripten failures/passing
All tests should now have annotation for *why* they're ignored on emscripten. A
few tests no longer need such an annotation as well!

Closes #41299
2017-10-17 18:46:38 -07:00
toidiu
fe5cb1a517 add error to the correct line in unit test 2017-10-16 14:26:17 -04:00
toidiu
c021e5303f add a test case
dont duplicate error codes

choose unlikely error code

specify error pattern in test
2017-10-16 14:26:17 -04:00
Zack M. Davis
38e5a964f2 code suggestions for no-mangle lints
At reviewer's suggestion, we remove the function/static name from the
main lint message. While we're correspondingly adjusting the
expectations of a compile-fail test, we remove an obsolete FIXME
comment, another quantum of progress towards resolving the fabulous
metabug #44366.
2017-10-16 11:19:18 -07:00
bors
df095cefe2 Auto merge of #45123 - goffrie:fix-method-unit-call, r=oli-obk
Provide the full span of method calls to `check_argument_types`

... so that it includes the span of the passed arguments, not just the name of the called method.

Fixes #44760.
2017-10-15 11:31:46 +00:00
bors
f5eb33f4e5 Auto merge of #45200 - mikhail-m1:match-with-false-edges, r=nikomatsakis
MIR-borrowck: add false edges to match arms

basic fix for https://github.com/rust-lang/rust/issues/45043, should be modified with #45184
2017-10-15 02:20:13 +00:00
Vadim Petrochenkov
e6115af4bd Implement dyn Trait syntax 2017-10-14 12:51:13 +03:00
Geoffry Song
bb4d1caad7 Pass the full span for method calls 2017-10-13 20:20:22 -07:00
kennytm
b290568dcd Rollup merge of #45133 - GuillaumeGomez:usize-index-msg, r=dtolnay
usize index message for vec
2017-10-13 23:37:55 +08:00
bors
86e548747b Auto merge of #45025 - pnkfelix:mir-borrowck-moves-of-supporting-prefixes-invalidate-uses-too, r=arielb1
MIR-borrowck: moves of prefixes invalidate uses too

I overlooked the fact that when we check if a path is moved, we need to check for interference between the (shallow) prefixes and the use in question.

~~Long term, we may want to revise how this computation is done. For example, it might be better to represent the set of invalidated prefixes in the dataflow computation (the `maybe_uninitialized` dataflow), and thus avoid one of the loops in the code here.~~
 * Update: I was wrong in my original recollection of the dataflow code, which actually does the right thing, in terms of precisely tracking substructure initialization and movement.

Fix #44833

----

Update: The initial version of this PR's description (and the code as well) erroneously focused on supporting prefixes. ~~But the two main cases of interest are: 1. the *shallow* prefixes, and 2. the deref-free prefix built off a local (if the lvalue is indeed built off a local)~~

Update 2: The main cases of interest are in fact: 1. the nearest prefix with a MovePath, and 2. the suffixes.
2017-10-13 04:00:55 +00:00
bors
d27411494a Auto merge of #44985 - zilbuz:issue-44974, r=pnkfelix
MIR borrowck: print lvalues in error messages in the same way that the AST borrowck

Fix #44974

- Print fields with `.name` rather than `.<num>`
- Autoderef values if followed by a field or an index
- Output `[..]` when borrowing inside a slice
2017-10-12 03:40:10 +00:00
Felix S. Klock II
d6caf737b3 Added revisions: ast mir template to tests that this PR sync'ed ast+mir borrowcks.
(There are other tests that this PR also improves, but were not
completely synchronized. I chose to wait until later to pull those
into the `revisions: ast mir` testing pattern; later being either when
they *are* synchronized, or in some PR where we migrate all borrowck
tests, regardless of whether MIR-borrowck is "finished" for them or
not.)
2017-10-11 22:42:29 +02:00
Felix S. Klock II
b62b67a732 Test case illustrating some variants of the issue pointed out by ariel.
Expanded to cover partial-initialization ideas.
2017-10-11 22:42:29 +02:00
Felix S. Klock II
ae5fc76dce Test against accesses to uninitialized fields. 2017-10-11 22:42:29 +02:00
bors
cbf5d39cca Auto merge of #44888 - tirr-c:binder-hr-region, r=arielb1
Refactor fmt::Display and fmt::Debug impls in ppaux

Also fixes #44887.

There was a problem that unnamed late-bound regions are *always* named `'r` while they are displayed using `std::fmt::Display`.

---

```rust
fn main() {
    f(|_: (), _: ()| {});
}
fn f<F>(_: F) where F: Fn(&(), for<'r> fn(&'r ())) {}
```

Before (incorrectly shadows lifetime, `for<'r>` omitted for the second argument):

```
error[E0631]: type mismatch in closure arguments
 --> test.rs:2:5
  |
2 |     f(|_: (), _: ()| {});
  |     ^ ----------------- found signature of `fn((), ()) -> _`
  |     |
  |     expected signature of `for<'r> fn(&'r (), fn(&'r ())) -> _`
  |
  = note: required by `f`
```

After:

```
error[E0631]: type mismatch in closure arguments
 --> test.rs:2:5
  |
2 |     f(|_: (), _: ()| {});
  |     ^ ----------------- found signature of `fn((), ()) -> _`
  |     |
  |     expected signature of `for<'s> fn(&'s (), for<'r> fn(&'r ())) -> _`
  |
  = note: required by `f`
```

r? @nikomatsakis
2017-10-11 16:00:25 +00:00
Your Name
8a28c676c8 MIR-borrowck: add false edges to match arms 2017-10-11 17:39:45 +03:00
Michael Woerister
4a9df0ec62 incr.comp.: Move macro-export test case to src/test/incremental. 2017-10-09 15:38:51 +02:00
Guillaume Gomez
a28b2465d3 usize index message for vec 2017-10-09 14:45:41 +02:00
bors
650b1b1f3a Auto merge of #45016 - pnkfelix:mir-borrowck-gather-and-signal-move-errors, r=nikomatsakis
MIR-borrowck: gather and signal any move errors

When building up the `MoveData` structure for a given MIR, also accumulate any erroneous actions, and then report all of those errors when the construction is complete.

This PR adds a host of move-related error constructor methods to `trait BorrowckErrors`. I think I got the notes right; but we should plan to audit all of the notes before turning MIR-borrowck on by default.

Fix #44830
2017-10-08 18:12:26 +00:00