deduplication
This commit is contained in:
parent
f1021bf054
commit
08e026675e
7 changed files with 62 additions and 71 deletions
|
@ -33,6 +33,7 @@ struct InteriorVisitor<'a, 'tcx> {
|
||||||
/// that they may succeed the said yield point in the post-order.
|
/// that they may succeed the said yield point in the post-order.
|
||||||
guard_bindings: SmallVec<[SmallVec<[HirId; 4]>; 1]>,
|
guard_bindings: SmallVec<[SmallVec<[HirId; 4]>; 1]>,
|
||||||
guard_bindings_set: HirIdSet,
|
guard_bindings_set: HirIdSet,
|
||||||
|
linted_values: HirIdSet,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> InteriorVisitor<'a, 'tcx> {
|
impl<'a, 'tcx> InteriorVisitor<'a, 'tcx> {
|
||||||
|
@ -122,6 +123,7 @@ impl<'a, 'tcx> InteriorVisitor<'a, 'tcx> {
|
||||||
// Insert the type into the ordered set.
|
// Insert the type into the ordered set.
|
||||||
let scope_span = scope.map(|s| s.span(self.fcx.tcx, self.region_scope_tree));
|
let scope_span = scope.map(|s| s.span(self.fcx.tcx, self.region_scope_tree));
|
||||||
|
|
||||||
|
if !self.linted_values.contains(&hir_id) {
|
||||||
check_must_not_suspend_ty(
|
check_must_not_suspend_ty(
|
||||||
self.fcx,
|
self.fcx,
|
||||||
ty,
|
ty,
|
||||||
|
@ -134,6 +136,8 @@ impl<'a, 'tcx> InteriorVisitor<'a, 'tcx> {
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
self.linted_values.insert(hir_id);
|
||||||
|
}
|
||||||
|
|
||||||
self.types.insert(ty::GeneratorInteriorTypeCause {
|
self.types.insert(ty::GeneratorInteriorTypeCause {
|
||||||
span: source_span,
|
span: source_span,
|
||||||
|
@ -181,6 +185,7 @@ pub fn resolve_interior<'a, 'tcx>(
|
||||||
prev_unresolved_span: None,
|
prev_unresolved_span: None,
|
||||||
guard_bindings: <_>::default(),
|
guard_bindings: <_>::default(),
|
||||||
guard_bindings_set: <_>::default(),
|
guard_bindings_set: <_>::default(),
|
||||||
|
linted_values: <_>::default(),
|
||||||
};
|
};
|
||||||
intravisit::walk_body(&mut visitor, body);
|
intravisit::walk_body(&mut visitor, body);
|
||||||
|
|
||||||
|
|
20
src/test/ui/lint/must_not_suspend/dedup.rs
Normal file
20
src/test/ui/lint/must_not_suspend/dedup.rs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
// edition:2018
|
||||||
|
#![feature(must_not_suspend)]
|
||||||
|
#![deny(must_not_suspend)]
|
||||||
|
|
||||||
|
#[must_not_suspend]
|
||||||
|
struct No {}
|
||||||
|
|
||||||
|
async fn shushspend() {}
|
||||||
|
|
||||||
|
async fn wheeee<T>(t: T) {
|
||||||
|
shushspend().await;
|
||||||
|
drop(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn yes() {
|
||||||
|
wheeee(No {}).await; //~ ERROR `No` held across
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
}
|
19
src/test/ui/lint/must_not_suspend/dedup.stderr
Normal file
19
src/test/ui/lint/must_not_suspend/dedup.stderr
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
error: `No` held across a suspend point, but should not be
|
||||||
|
--> $DIR/dedup.rs:16:12
|
||||||
|
|
|
||||||
|
LL | wheeee(No {}).await;
|
||||||
|
| -------^^^^^------- the value is held across this suspend point
|
||||||
|
|
|
||||||
|
note: the lint level is defined here
|
||||||
|
--> $DIR/dedup.rs:3:9
|
||||||
|
|
|
||||||
|
LL | #![deny(must_not_suspend)]
|
||||||
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
help: consider using a block (`{ ... }`) to shrink the value's scope, ending before the suspend point
|
||||||
|
--> $DIR/dedup.rs:16:12
|
||||||
|
|
|
||||||
|
LL | wheeee(No {}).await;
|
||||||
|
| ^^^^^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
// edition:2018
|
// edition:2018
|
||||||
|
// run-pass
|
||||||
|
//
|
||||||
|
// this test shows a case where the lint doesn't fire in generic code
|
||||||
#![feature(must_not_suspend)]
|
#![feature(must_not_suspend)]
|
||||||
#![deny(must_not_suspend)]
|
#![deny(must_not_suspend)]
|
||||||
|
|
||||||
|
@ -12,10 +15,6 @@ async fn wheeee<T>(t: T) {
|
||||||
drop(t);
|
drop(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn yes() {
|
|
||||||
wheeee(No {}).await; //~ ERROR `No` held across
|
|
||||||
//~^ ERROR `No` held across
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
let _fut = wheeee(No {});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
error: `No` held across a suspend point, but should not be
|
|
||||||
--> $DIR/generic.rs:16:12
|
|
||||||
|
|
|
||||||
LL | wheeee(No {}).await;
|
|
||||||
| -------^^^^^------- the value is held across this suspend point
|
|
||||||
|
|
|
||||||
note: the lint level is defined here
|
|
||||||
--> $DIR/generic.rs:3:9
|
|
||||||
|
|
|
||||||
LL | #![deny(must_not_suspend)]
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
help: consider using a block (`{ ... }`) to shrink the value's scope, ending before the suspend point
|
|
||||||
--> $DIR/generic.rs:16:12
|
|
||||||
|
|
|
||||||
LL | wheeee(No {}).await;
|
|
||||||
| ^^^^^
|
|
||||||
|
|
||||||
error: `No` held across a suspend point, but should not be
|
|
||||||
--> $DIR/generic.rs:16:12
|
|
||||||
|
|
|
||||||
LL | wheeee(No {}).await;
|
|
||||||
| -------^^^^^------- the value is held across this suspend point
|
|
||||||
|
|
|
||||||
help: consider using a block (`{ ... }`) to shrink the value's scope, ending before the suspend point
|
|
||||||
--> $DIR/generic.rs:16:12
|
|
||||||
|
|
|
||||||
LL | wheeee(No {}).await;
|
|
||||||
| ^^^^^
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
|
@ -16,7 +16,6 @@ async fn other() {}
|
||||||
impl Bar {
|
impl Bar {
|
||||||
async fn uhoh(&mut self) {
|
async fn uhoh(&mut self) {
|
||||||
let guard = &mut self.u; //~ ERROR `Umm` held across
|
let guard = &mut self.u; //~ ERROR `Umm` held across
|
||||||
//~^ ERROR `Umm` held across
|
|
||||||
|
|
||||||
other().await;
|
other().await;
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ error: `Umm` held across a suspend point, but should not be
|
||||||
|
|
|
|
||||||
LL | let guard = &mut self.u;
|
LL | let guard = &mut self.u;
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
...
|
LL |
|
||||||
LL | other().await;
|
LL | other().await;
|
||||||
| ------------- the value is held across this suspend point
|
| ------------- the value is held across this suspend point
|
||||||
|
|
|
|
||||||
|
@ -23,25 +23,5 @@ help: consider using a block (`{ ... }`) to shrink the value's scope, ending bef
|
||||||
LL | let guard = &mut self.u;
|
LL | let guard = &mut self.u;
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
|
|
||||||
error: `Umm` held across a suspend point, but should not be
|
error: aborting due to previous error
|
||||||
--> $DIR/ref.rs:18:26
|
|
||||||
|
|
|
||||||
LL | let guard = &mut self.u;
|
|
||||||
| ^^^^^^
|
|
||||||
...
|
|
||||||
LL | other().await;
|
|
||||||
| ------------- the value is held across this suspend point
|
|
||||||
|
|
|
||||||
note: You gotta use Umm's, ya know?
|
|
||||||
--> $DIR/ref.rs:18:26
|
|
||||||
|
|
|
||||||
LL | let guard = &mut self.u;
|
|
||||||
| ^^^^^^
|
|
||||||
help: consider using a block (`{ ... }`) to shrink the value's scope, ending before the suspend point
|
|
||||||
--> $DIR/ref.rs:18:26
|
|
||||||
|
|
|
||||||
LL | let guard = &mut self.u;
|
|
||||||
| ^^^^^^
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue