Commit Graph

135 Commits

Author SHA1 Message Date
Esteban Küber
7cef8b3495 ignore-x86 instead of ignore-musl 2019-09-22 11:33:13 -07:00
Esteban Küber
f81734bcaa ignore musl target in tests to avoid issues with output differences 2019-09-22 11:33:13 -07:00
Esteban Küber
b370c111fd On obligation errors point at the unfulfilled binding when possible 2019-09-22 11:33:12 -07:00
bors
97e58c0d32 Auto merge of #64584 - nikomatsakis:issue-64477-generator-capture-types, r=eddyb
record fewer adjustment types in generator witnesses, avoid spurious drops in MIR construction

Don't record all intermediate adjustment types -- That's way more than is needed, and winds up recording types that will never appear in MIR.

Note: I'm like 90% sure that this logic is correct, but this stuff is subtle and can be hard to keep straight.  However, the risk of this PR is fairly low -- if we miss types here, I believe the most common outcome is an ICE.

This fixes the original issue cited by #64477, but I'm leaving the issue open for now since there may be other cases we can detect and improve in a targeted way.

r? @Zoxc
2019-09-20 15:35:51 +00:00
Niko Matsakis
2655663345 fix tests for 2018 2019-09-19 13:15:54 -04:00
Niko Matsakis
b2c51c24c9 avoid generating drops for moved operands of calls
Currently, after a CALL terminator is created in MIR, we insert DROP
statements for all of its operands -- even though they were just moved
shortly before! These spurious drops are later removed, but not before
causing borrow check errors.

This PR series modifies the drop code to track operands that were
moved and avoid creating drops for them.

Right now, I'm only using this mechanism for calls, but it seems
likely it could be used in more places.
2019-09-19 11:50:00 -04:00
Mazdak Farrokhzad
0835100412
Rollup merge of #64554 - lqd:polonius_tests4, r=nikomatsakis
Polonius: more `ui` test suite fixes

Since #62736, new tests have been added, and the `run-pass` suite was merged into the `ui` suite.

This PR adds the missing tests expectations for Polonius, and updates the existing ones where the NLL output has changed in some manner (e.g. ordering of notes)

Those are the trivial cases, but a more-detailed explanation is available [in this write-up](https://hackmd.io/CjYB0fs4Q9CweyeTdKWyEg?both#26-async-awaitasync-borrowck-escaping-closure-errorrs-outputs-from-NLL-Polonius-diff) starting at test case 26: they are only differing in diagnostics and instances of other existing test cases differences.

Only 3 of the 9020 tests are still "failing" at the moment (1 failure, 2 OOMs).

r? @nikomatsakis
2019-09-19 04:53:09 +02:00
Niko Matsakis
d95a7768a1 don't record all intermediate adjustment types
That's way more than is needed, and winds up recording types
that will never appear in MIR.
2019-09-18 14:33:14 -04:00
lqd
9f4351d406 Bless output of test borrowck/return-local-binding-from-desugaring.rs for Polonius 2019-09-17 19:28:49 +02:00
Niko Matsakis
123f129f79 apply nits from centril
Co-Authored-By: Mazdak Farrokhzad <twingoow@gmail.com>
2019-09-17 04:53:28 -04:00
Niko Matsakis
9ae1a664f7 add regression test for issue-64391 2019-09-16 16:44:18 -04:00
Niko Matsakis
ab1a3f09fd add test for drop order of temporary in tail return expression 2019-09-16 16:13:45 -04:00
Mazdak Farrokhzad
a1755dfbc7
Rollup merge of #64292 - davidtwco:issue-63832-await-temporary-lifetimes, r=matthewjasper
lowering: extend temporary lifetimes around await

Fixes #63832.

r? @matthewjasper
cc @nikomatsakis
2019-09-10 17:19:25 +02:00
David Wood
63fad69a99
lowering: extend temporary lifetimes around await
This commit changes the HIR lowering around `await` so that temporary
lifetimes are extended. Previously, await was lowered as:

```rust
{
    let mut pinned = future;
    loop {
        match ::std::future::poll_with_tls_context(unsafe {
            <::std::pin::Pin>::new_unchecked(&mut pinned)
        }) {
            ::std::task::Poll::Ready(result) => break result,
            ::std::task::Poll::Pending => {}
        }
        yield ();
    }
}
```

With this commit, await is lowered as:

```rust
match future {
    mut pinned => loop {
        match ::std::future::poll_with_tls_context(unsafe {
            <::std::pin::Pin>::new_unchecked(&mut pinned)
        }) {
            ::std::task::Poll::Ready(result) => break result,
            ::std::task::Poll::Pending => {}
        }
        yield ();
    }
}
```

However, this change has the following side-effects:

- All temporaries in future will be considered to live across a
  yield for the purpose of auto-traits.
- Borrowed temporaries in future are likely to be considered to be live
  across the yield for the purpose of the generator transform.

Signed-off-by: David Wood <david@davidtw.co>
2019-09-10 11:27:57 +01:00
Mark Rousskov
6fdbece55f Update test stderr with results of enabling unused lints 2019-09-08 11:32:28 -04:00
Alexander Regueiro
022d9c8eb5 Fixed grammar/style in error messages and reblessed tests. 2019-09-06 03:46:08 +01:00
Mazdak Farrokhzad
9024032591
Rollup merge of #64038 - matthewjasper:deny-mutual-impl-trait-recursion, r=varkor
Check impl trait substs when checking for recursive types

closes #64004
2019-09-05 03:59:40 +02:00
Matthew Jasper
877faf3844 Check impl trait substs when checking for recursive types
This prevents mutual `async fn` recursion
2019-08-31 15:44:09 +01:00
Matthew Jasper
7bb2d8b076 Slightly clean up the error for recursive async fn
* Make it clear that type erasure is required, not just pointer
  indirection.
* Don't make the message specific to direct recursion.
2019-08-31 15:43:24 +01:00
Esteban Küber
444bc3ca66 Use span label instead of note for cause in E0631 2019-08-31 00:14:23 -07:00
Kevin Per
97319b2b95 Changing error messages and renaming tests #63127
`async-await/no-args-non-move-async-closure`
`generator/no-arguments-on-generators`
2019-08-27 17:31:57 +02:00
Kevin Per
e0ce9f8c0a Cleanup: Consistently use Param instead of Arg #62426 2019-08-27 14:07:41 +02:00
Artem Varaksa
600a64bdb5 more --blessing + test error annotations fixes 2019-08-21 15:13:13 +03:00
Artem Varaksa
a8d7ea74a4 improve diagnostics: break/continue wrong context 2019-08-21 13:17:59 +03:00
Mazdak Farrokhzad
21476e7d6c --bless post no async_await gates in tests. 2019-08-20 03:08:42 +02:00
Mazdak Farrokhzad
228015acd2 Remove async_await gates from tests. 2019-08-20 03:08:42 +02:00
Mazdak Farrokhzad
2c0f05a04f
Rollup merge of #63699 - gilescope:async-move-diagnostic, r=estebank
Fix suggestion from incorrect `move async` to `async move`.

PR for #61920. Happy with the test. There must be a better implementation though - possibly a MIR visitor to estabilsh a span that doesn't include the `async` keyword?
2019-08-19 22:48:57 +02:00
Niko Matsakis
7ee1af51cc adjust test to be check-pass 2019-08-19 13:53:06 -04:00
Niko Matsakis
af86fb1959 distinguish object-lifetime-default elision from other elision
Object-lifetime-default elision is distinct from other forms of
elision; it always refers to some enclosing lifetime *present in the
surrounding type* (e.g., `&dyn Bar` expands to `&'a (dyn Bar + 'a)`.
If there is no enclosing lifetime, then it expands to `'static`.

Therefore, in an `impl Trait<Item = dyn Bar>` setting, we don't expand
to create a lifetime parameter for the `dyn Bar + 'X` bound.  It will
just be resolved to `'static`.

Annoyingly, the responsibility for this resolution is spread across
multiple bits of code right now (`middle::resolve_lifetimes`,
`lowering`). The lowering code knows that the default is for an object
lifetime, but it doesn't know what the correct result would be.
Probably this should be fixed, but what we do now is a surgical fix:
we have it generate a different result for elided lifetimes in a
object context, and then we can ignore those results when figuring out
the lifetimes that are captured in the opaque type.
2019-08-19 13:50:42 -04:00
Giles Cope
ef3e66d69f Fix suggestion from move async to async move. 2019-08-19 17:14:38 +01:00
bors
4cf7673076 Auto merge of #63659 - gilescope:async-in-closure, r=Centril
Improved error message for break in async block

Fixes #63391
2019-08-18 18:23:28 +00:00
Giles Cope
1e02bc62bc Better error message for break in async blocks. 2019-08-18 10:39:15 +01:00
Eduard-Mihai Burtescu
45980e809f bless you nll 2019-08-16 15:54:11 +03:00
Mazdak Farrokhzad
d9a429a1eb
Rollup merge of #63539 - Centril:2015.await, r=oli-obk
Suggest Rust 2018 on `<expr>.await` with no such field

When type checking a field projection (`fn check_field`) to `<expr>.await` where `<expr>: τ` and `τ` is not a primitive type, suggest switching to Rust 2018. E.g.

```
error[E0609]: no field `await` on type `std::pin::Pin<&mut dyn std::future::Future<Output = ()>>`
  --> $DIR/suggest-switching-edition-on-await.rs:31:7
   |
LL |     x.await;
   |       ^^^^^ unknown field
   |
   = note: to `.await` a `Future`, switch to Rust 2018
   = help: set `edition = "2018"` in `Cargo.toml`
   = note: for more on editions, read https://doc.rust-lang.org/edition-guide
```

Fixes https://github.com/rust-lang/rust/issues/63533

This PR also performs some preparatory cleanups in `fn check_field`; the last 2 commits are where the suggestion is introduced and tested respectively.

r? @varkor
2019-08-16 08:26:38 +02:00
Mazdak Farrokhzad
02e2a57f26
Rollup merge of #63509 - estebank:async-span, r=Centril
Point at the right enclosing scope when using `await` in non-async fn

Fix #63398.
2019-08-14 22:56:24 +02:00
Mazdak Farrokhzad
5741e29417
Rollup merge of #63501 - nikomatsakis:issue-63500-async-anon-impl-lifetime, r=cramertj
use `ParamName` to track in-scope lifetimes instead of Ident

Also, clear in-scope lifetimes when visiting nested items.

Fixes #63500.
Fixes #63225.
Fixes #52532.

r? @cramertj
2019-08-14 04:18:49 +02:00
Mazdak Farrokhzad
4134241bcf
Rollup merge of #63499 - nikomatsakis:issuee-63388-async-fn-elision-self-mut-self, r=cramertj
handle elision in async fn correctly

We now always make fresh lifetimne parameters for all elided
lifetimes, whether they are in the inputs or outputs. But then
we generate `'_` in the case of elided lifetimes from the outputs.

Example:

```rust
async fn foo<'a>(x: &'a u32) -> &u32 { .. }
```

becomes

```rust
type Foo<'a, 'b> = impl Future<Output = &'b u32>;
fn foo<'a>(x: &'a u32) -> Foo<'a, '_>
```

Fixes #63388
2019-08-14 04:18:48 +02:00
Mazdak Farrokhzad
9287eb647f typeck: add tests for suggesting -> 2018 on wrong <expr>.await 2019-08-14 01:52:16 +02:00
Esteban Küber
25d507f497 review comment: move test 2019-08-13 11:29:33 -07:00
Niko Matsakis
18d69c8ebe bless tests with compare-mode=nll 2019-08-13 09:13:50 -04:00
Niko Matsakis
e4756e6b07 clear in-scope lifetimes for nested items in HIR lowering
This was causing us to incorrectly think the lifetimes were
already declared on the scope for the nested item, when in fact
they are not inherited.
2019-08-12 21:08:32 -04:00
Niko Matsakis
a02a171e6a add edition to regression test 2019-08-12 18:33:53 -04:00
Niko Matsakis
03e7b96281 revamp how we handle elision in async fn
We now always make fresh lifetimne parameters for all elided
lifetimes, whether they are in the inputs or outputs. But then
we generate `'_` in the case of elided lifetimes from the outputs.

Example:

```rust
async fn foo<'a>(x: &'a u32) -> &u32 { .. }
```

becomes

```rust
type Foo<'a, 'b> = impl Future<Output = &'b u32>;
fn foo<'a>(x: &'a u32) -> Foo<'a, '_>
```
2019-08-12 17:18:26 -04:00
Niko Matsakis
18e54539ca use ParamName to track in-scope lifetimes instead of Ident
This allows us to record "fresh" lifetime names for cases like `impl
Foo<'_>`.
2019-08-12 15:19:30 -04:00
David Wood
861d1bb365
typeck: Prohibit RPIT types that inherit lifetimes
This commit prohibits return position `impl Trait` types that "inherit
lifetimes" from the parent scope. The intent is to forbid cases that are
challenging until they can be addressed properly.
2019-08-12 19:04:11 +01:00
Esteban Küber
45a5bc7619 fix tests 2019-08-09 07:57:16 -07:00
Mazdak Farrokhzad
87fb0ad485
Rollup merge of #63387 - Centril:async-block-control-flow-tests, r=cramertj
Test interaction between `async { ... }` and `?`, `return`, and `break`

Per the second checkbox in https://github.com/rust-lang/rust/issues/62121#issuecomment-506884048, test that `async { .. }` blocks:
1. do not allow `break` expressions.
2. get targeted by `return` and not the parent function.
3. get targeted by `?` and not the parent function.

Works towards resolving blockers in #63209.

r? @cramertj
2019-08-09 01:38:36 +02:00
Mazdak Farrokhzad
48fbf4891a Test interaction btw async blocks and ?, return, break. 2019-08-09 00:21:21 +02:00
Mazdak Farrokhzad
4f415fca37
Rollup merge of #63331 - gorup:conditionalinit, r=cramertj
Test conditional initialization validation in async fns

r? @cramertj

Per [paper doc](https://paper.dropbox.com/doc/async.await-Call-for-Tests--AiWF2Nt8tgDiA70qFI~oiLOOAg-nMyZGrra7dz9KcFRMLKJy) calling for async/.await tests, tests are desired for conditionally initialized local variables. This PR hopes to provide tests for that.

#63294 seems to be tracking the items from the paper doc that this PR is related to
#62121 is an open issue asking for more async/.await tests that this relates to

---
👍 executed 2 new tests
👍 tidy
2019-08-08 07:35:35 +02:00
Ryan Gorup
811c304029 Test conditional initialization validation in async fns 2019-08-06 16:44:12 -07:00