From: Gus Wynn Date: Sat, 18 Sep 2021 20:00:36 +0000 (-0700) Subject: deduplication X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=08e026675ee38bb4ca81106e766a6456c8b7382e;hp=-c;p=rust.git deduplication --- 08e026675ee38bb4ca81106e766a6456c8b7382e diff --git a/compiler/rustc_typeck/src/check/generator_interior.rs b/compiler/rustc_typeck/src/check/generator_interior.rs index ac67d2b93c5..5ad9bdbe68d 100644 --- a/compiler/rustc_typeck/src/check/generator_interior.rs +++ b/compiler/rustc_typeck/src/check/generator_interior.rs @@ -33,6 +33,7 @@ struct InteriorVisitor<'a, 'tcx> { /// that they may succeed the said yield point in the post-order. guard_bindings: SmallVec<[SmallVec<[HirId; 4]>; 1]>, guard_bindings_set: HirIdSet, + linted_values: HirIdSet, } impl<'a, 'tcx> InteriorVisitor<'a, 'tcx> { @@ -122,18 +123,21 @@ fn record( // Insert the type into the ordered set. let scope_span = scope.map(|s| s.span(self.fcx.tcx, self.region_scope_tree)); - check_must_not_suspend_ty( - self.fcx, - ty, - hir_id, - SuspendCheckData { - expr, - source_span, - yield_span: yield_data.span, - plural_len: 1, - ..Default::default() - }, - ); + if !self.linted_values.contains(&hir_id) { + check_must_not_suspend_ty( + self.fcx, + ty, + hir_id, + SuspendCheckData { + expr, + source_span, + yield_span: yield_data.span, + plural_len: 1, + ..Default::default() + }, + ); + self.linted_values.insert(hir_id); + } self.types.insert(ty::GeneratorInteriorTypeCause { span: source_span, @@ -181,6 +185,7 @@ pub fn resolve_interior<'a, 'tcx>( prev_unresolved_span: None, guard_bindings: <_>::default(), guard_bindings_set: <_>::default(), + linted_values: <_>::default(), }; intravisit::walk_body(&mut visitor, body); diff --git a/src/test/ui/lint/must_not_suspend/dedup.rs b/src/test/ui/lint/must_not_suspend/dedup.rs new file mode 100644 index 00000000000..040fff5a5a5 --- /dev/null +++ b/src/test/ui/lint/must_not_suspend/dedup.rs @@ -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) { + shushspend().await; + drop(t); +} + +async fn yes() { + wheeee(No {}).await; //~ ERROR `No` held across +} + +fn main() { +} diff --git a/src/test/ui/lint/must_not_suspend/dedup.stderr b/src/test/ui/lint/must_not_suspend/dedup.stderr new file mode 100644 index 00000000000..542b7a3bc7e --- /dev/null +++ b/src/test/ui/lint/must_not_suspend/dedup.stderr @@ -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 + diff --git a/src/test/ui/lint/must_not_suspend/generic.rs b/src/test/ui/lint/must_not_suspend/generic.rs index 94457e37540..b3effa020c4 100644 --- a/src/test/ui/lint/must_not_suspend/generic.rs +++ b/src/test/ui/lint/must_not_suspend/generic.rs @@ -1,4 +1,7 @@ // edition:2018 +// run-pass +// +// this test shows a case where the lint doesn't fire in generic code #![feature(must_not_suspend)] #![deny(must_not_suspend)] @@ -12,10 +15,6 @@ async fn wheeee(t: T) { drop(t); } -async fn yes() { - wheeee(No {}).await; //~ ERROR `No` held across - //~^ ERROR `No` held across -} - fn main() { + let _fut = wheeee(No {}); } diff --git a/src/test/ui/lint/must_not_suspend/generic.stderr b/src/test/ui/lint/must_not_suspend/generic.stderr deleted file mode 100644 index d853ba720a3..00000000000 --- a/src/test/ui/lint/must_not_suspend/generic.stderr +++ /dev/null @@ -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 - diff --git a/src/test/ui/lint/must_not_suspend/ref.rs b/src/test/ui/lint/must_not_suspend/ref.rs index 89fd73c187e..738dd9e0465 100644 --- a/src/test/ui/lint/must_not_suspend/ref.rs +++ b/src/test/ui/lint/must_not_suspend/ref.rs @@ -16,7 +16,6 @@ async fn other() {} impl Bar { async fn uhoh(&mut self) { let guard = &mut self.u; //~ ERROR `Umm` held across - //~^ ERROR `Umm` held across other().await; diff --git a/src/test/ui/lint/must_not_suspend/ref.stderr b/src/test/ui/lint/must_not_suspend/ref.stderr index d4c58bcbcd2..78b44b00625 100644 --- a/src/test/ui/lint/must_not_suspend/ref.stderr +++ b/src/test/ui/lint/must_not_suspend/ref.stderr @@ -3,7 +3,7 @@ error: `Umm` held across a suspend point, but should not be | LL | let guard = &mut self.u; | ^^^^^^ -... +LL | LL | other().await; | ------------- 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; | ^^^^^^ -error: `Umm` held across a suspend point, but should not be - --> $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 +error: aborting due to previous error