Add test for drop-before-await FP

This commit is contained in:
flip1995 2022-02-12 11:30:03 +01:00
parent c4944fb60d
commit c5709419b1
No known key found for this signature in database
GPG Key ID: 1CA0DF2AF59D68A5
2 changed files with 64 additions and 33 deletions

View File

@ -2,6 +2,7 @@
// When adding or modifying a test, please do the same for parking_lot::Mutex.
mod std_mutex {
use super::baz;
use std::sync::{Mutex, RwLock};
pub async fn bad(x: &Mutex<u32>) -> u32 {
@ -43,10 +44,6 @@ mod std_mutex {
47
}
pub async fn baz() -> u32 {
42
}
pub async fn also_bad(x: &Mutex<u32>) -> u32 {
let first = baz().await;
@ -83,6 +80,7 @@ mod std_mutex {
// When adding or modifying a test, please do the same for std::Mutex.
mod parking_lot_mutex {
use super::baz;
use parking_lot::{Mutex, RwLock};
pub async fn bad(x: &Mutex<u32>) -> u32 {
@ -124,10 +122,6 @@ mod parking_lot_mutex {
47
}
pub async fn baz() -> u32 {
42
}
pub async fn also_bad(x: &Mutex<u32>) -> u32 {
let first = baz().await;
@ -162,6 +156,26 @@ mod parking_lot_mutex {
}
}
async fn baz() -> u32 {
42
}
async fn no_await(x: std::sync::Mutex<u32>) {
let mut guard = x.lock().unwrap();
*guard += 1;
}
// FIXME: FP, because the `MutexGuard` is dropped before crossing the await point. This is
// something the needs to be fixed in rustc. There's already drop-tracking, but this is currently
// disabled, see rust-lang/rust#93751. This case isn't picked up by drop-tracking though. If the
// `*guard += 1` is removed it is picked up.
async fn dropped_before_await(x: std::sync::Mutex<u32>) {
let mut guard = x.lock().unwrap();
*guard += 1;
drop(guard);
baz().await;
}
fn main() {
let m = std::sync::Mutex::new(100);
std_mutex::good(&m);

View File

@ -1,5 +1,5 @@
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:8:13
--> $DIR/await_holding_lock.rs:9:13
|
LL | let guard = x.lock().unwrap();
| ^^^^^
@ -7,7 +7,7 @@ LL | let guard = x.lock().unwrap();
= note: `-D clippy::await-holding-lock` implied by `-D warnings`
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:8:9
--> $DIR/await_holding_lock.rs:9:9
|
LL | / let guard = x.lock().unwrap();
LL | | baz().await
@ -15,14 +15,14 @@ LL | | }
| |_____^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:23:13
--> $DIR/await_holding_lock.rs:24:13
|
LL | let guard = x.read().unwrap();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:23:9
--> $DIR/await_holding_lock.rs:24:9
|
LL | / let guard = x.read().unwrap();
LL | | baz().await
@ -30,14 +30,14 @@ LL | | }
| |_____^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:28:13
--> $DIR/await_holding_lock.rs:29:13
|
LL | let mut guard = x.write().unwrap();
| ^^^^^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:28:9
--> $DIR/await_holding_lock.rs:29:9
|
LL | / let mut guard = x.write().unwrap();
LL | | baz().await
@ -45,14 +45,14 @@ LL | | }
| |_____^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:53:13
--> $DIR/await_holding_lock.rs:50:13
|
LL | let guard = x.lock().unwrap();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:53:9
--> $DIR/await_holding_lock.rs:50:9
|
LL | / let guard = x.lock().unwrap();
LL | |
@ -64,14 +64,14 @@ LL | | }
| |_____^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:66:17
--> $DIR/await_holding_lock.rs:63:17
|
LL | let guard = x.lock().unwrap();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:66:13
--> $DIR/await_holding_lock.rs:63:13
|
LL | / let guard = x.lock().unwrap();
LL | | baz().await
@ -79,14 +79,14 @@ LL | | };
| |_________^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:78:17
--> $DIR/await_holding_lock.rs:75:17
|
LL | let guard = x.lock().unwrap();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:78:13
--> $DIR/await_holding_lock.rs:75:13
|
LL | / let guard = x.lock().unwrap();
LL | | baz().await
@ -94,14 +94,14 @@ LL | | }
| |_________^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:89:13
--> $DIR/await_holding_lock.rs:87:13
|
LL | let guard = x.lock();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:89:9
--> $DIR/await_holding_lock.rs:87:9
|
LL | / let guard = x.lock();
LL | | baz().await
@ -109,14 +109,14 @@ LL | | }
| |_____^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:104:13
--> $DIR/await_holding_lock.rs:102:13
|
LL | let guard = x.read();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:104:9
--> $DIR/await_holding_lock.rs:102:9
|
LL | / let guard = x.read();
LL | | baz().await
@ -124,14 +124,14 @@ LL | | }
| |_____^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:109:13
--> $DIR/await_holding_lock.rs:107:13
|
LL | let mut guard = x.write();
| ^^^^^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:109:9
--> $DIR/await_holding_lock.rs:107:9
|
LL | / let mut guard = x.write();
LL | | baz().await
@ -139,14 +139,14 @@ LL | | }
| |_____^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:134:13
--> $DIR/await_holding_lock.rs:128:13
|
LL | let guard = x.lock();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:134:9
--> $DIR/await_holding_lock.rs:128:9
|
LL | / let guard = x.lock();
LL | |
@ -158,14 +158,14 @@ LL | | }
| |_____^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:147:17
--> $DIR/await_holding_lock.rs:141:17
|
LL | let guard = x.lock();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:147:13
--> $DIR/await_holding_lock.rs:141:13
|
LL | / let guard = x.lock();
LL | | baz().await
@ -173,19 +173,36 @@ LL | | };
| |_________^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:159:17
--> $DIR/await_holding_lock.rs:153:17
|
LL | let guard = x.lock();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:159:13
--> $DIR/await_holding_lock.rs:153:13
|
LL | / let guard = x.lock();
LL | | baz().await
LL | | }
| |_________^
error: aborting due to 12 previous errors
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:173:9
|
LL | let mut guard = x.lock().unwrap();
| ^^^^^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:173:5
|
LL | / let mut guard = x.lock().unwrap();
LL | | *guard += 1;
LL | | drop(guard);
LL | | baz().await;
LL | | }
| |_^
error: aborting due to 13 previous errors