Files
rust/tests/ui
Guillaume Gomez 02ee8a8cee Rollup merge of #123350 - compiler-errors:async-closure-by-move, r=oli-obk
Actually use the inferred `ClosureKind` from signature inference in coroutine-closures

A follow-up to https://github.com/rust-lang/rust/pull/123349, which fixes another subtle bug: We were not taking into account the async closure kind we infer during closure signature inference.

When I pass a closure directly to an arg like `fn(x: impl async FnOnce())`, that should have the side-effect of artificially restricting the kind of the async closure to `ClosureKind::FnOnce`. We weren't doing this -- that's a quick fix; however, it uncovers a second, more subtle bug with the way that `move`, async closures, and `FnOnce` interact.

Specifically, when we have an async closure like:
```
let x = Struct;
let c = infer_as_fnonce(async move || {
  println!("{x:?}");
}
```

The outer closure captures `x` by move, but the inner coroutine still immutably borrows `x` from the outer closure. Since we've forced the closure to by `async FnOnce()`, we can't actually *do* a self borrow, since the signature of `AsyncFnOnce::call_once` doesn't have a borrowed lifetime. This means that all `async move` closures that are constrained to `FnOnce` will fail borrowck.

We can fix that by detecting this case specifically, and making the *inner* async closure `move` as well. This is always beneficial to closure analysis, since if we have an `async FnOnce()` that's `move`, there's no reason to ever borrow anything, so `move` isn't artificially restrictive.
2024-04-05 16:38:51 +02:00
..
2024-04-03 08:50:12 +00:00
2024-03-31 14:58:17 -03:00
2024-03-15 13:37:41 +00:00
2024-03-23 12:38:50 +01:00
2024-02-01 03:31:03 +00:00
2024-03-03 16:30:48 -03:00
2024-03-06 12:01:54 +00:00
2024-03-28 06:00:25 +00:00
2024-04-04 01:55:29 +01:00
2024-04-03 22:48:55 +01:00
2024-03-31 14:58:17 -03:00
2024-03-31 14:58:17 -03:00
2024-04-04 15:45:50 +00:00
2024-03-17 21:45:03 +00:00
2024-03-27 11:20:28 -04:00
2024-04-03 23:16:27 +02:00
2024-03-24 09:19:29 +01:00
2024-03-23 16:14:42 +01:00
2024-02-29 14:43:43 +01:00
2024-03-31 14:58:17 -03:00
2024-03-03 16:30:48 -03:00
2024-03-27 09:53:23 -04:00
2024-03-15 13:37:41 +00:00
2024-03-12 10:59:41 +01:00
2024-04-04 02:14:57 +01:00
2024-02-22 18:05:28 +00:00
2024-02-07 10:42:01 +08:00
2024-02-07 10:42:01 +08:00

UI Tests

This folder contains rustc's UI tests.

Test Directives (Headers)

Typically, a UI test will have some test directives / headers which are special comments that tell compiletest how to build and intepret a test.

As part of an on-going effort to rewrite compiletest (see https://github.com/rust-lang/compiler-team/issues/536), a major change proposal to change legacy compiletest-style headers // <directive> to ui_test-style headers //@ <directive> was accepted (see https://github.com/rust-lang/compiler-team/issues/512.

An example directive is ignore-test. In legacy compiletest style, the header would be written as

// ignore-test

but in ui_test style, the header would be written as

//@ ignore-test

compiletest is changed to accept only //@ directives for UI tests (currently), and will reject and report an error if it encounters any comments // <content> that may be parsed as an legacy compiletest-style test header. To fix this, you should migrate to the ui_test-style header //@ <content>.