diff options
| author | Gus Wynn <guswynn@gmail.com> | 2021-09-13 08:19:40 -0700 |
|---|---|---|
| committer | Gus Wynn <guswynn@gmail.com> | 2021-09-13 08:19:40 -0700 |
| commit | 2af1ebfbdf01e4aa43fd9b1b5af602b545101e1f (patch) | |
| tree | 61263b7478f56fd26bb4b3638167105dbab06eee | |
| parent | ee1d2ea3b73d07d95d5c22ccd1e884e3674fcec6 (diff) | |
| download | rust-2af1ebfbdf01e4aa43fd9b1b5af602b545101e1f.tar.gz rust-2af1ebfbdf01e4aa43fd9b1b5af602b545101e1f.zip | |
error formatting and fix build
| -rw-r--r-- | compiler/rustc_feature/src/active.rs | 4 | ||||
| -rw-r--r-- | compiler/rustc_lint_defs/src/builtin.rs | 26 | ||||
| -rw-r--r-- | compiler/rustc_typeck/src/check/generator_interior.rs | 15 | ||||
| -rw-r--r-- | src/test/ui/lint/must_not_suspend/boxed.stderr | 11 | ||||
| -rw-r--r-- | src/test/ui/lint/must_not_suspend/ref.stderr | 22 | ||||
| -rw-r--r-- | src/test/ui/lint/must_not_suspend/trait.stderr | 10 | ||||
| -rw-r--r-- | src/test/ui/lint/must_not_suspend/unit.stderr | 11 | ||||
| -rw-r--r-- | src/test/ui/lint/must_not_suspend/warn.stderr | 11 |
8 files changed, 67 insertions, 43 deletions
diff --git a/compiler/rustc_feature/src/active.rs b/compiler/rustc_feature/src/active.rs index 66569270bd2..6ab925cfa9b 100644 --- a/compiler/rustc_feature/src/active.rs +++ b/compiler/rustc_feature/src/active.rs @@ -679,8 +679,8 @@ declare_features! ( /// Allows `let...else` statements. (active, let_else, "1.56.0", Some(87335), None), - /// Allows `#[must_not_suspend]`. - (active, must_not_suspend, "1.56.0", Some(83310), None), + /// Allows the `#[must_not_suspend]` attribute. + (active, must_not_suspend, "1.57.0", Some(83310), None), // ------------------------------------------------------------------------- diff --git a/compiler/rustc_lint_defs/src/builtin.rs b/compiler/rustc_lint_defs/src/builtin.rs index 781ac6a14a4..a192056e244 100644 --- a/compiler/rustc_lint_defs/src/builtin.rs +++ b/compiler/rustc_lint_defs/src/builtin.rs @@ -315,14 +315,8 @@ declare_lint! { } declare_lint! { - /// The `must_not_suspend` lint detects values that are marked with the `#[must_not_suspend]` - /// attribute being held across yield points. A "yield" point is usually a `.await` in an async - /// function. - /// - /// This attribute can be used to mark values that are semantically incorrect across yields - /// (like certain types of timers), values that have async alternatives, and values that - /// regularly cause problems with the `Send`-ness of async fn's returned futures (like - /// `MutexGuard`'s) + /// The `must_not_suspend` lint guards against values that shouldn't be held across yield points + /// (`.await`) /// /// ### Example /// @@ -339,9 +333,23 @@ declare_lint! { /// yield_now().await; /// } /// ``` + /// + /// {{produces}} + /// + /// ### Explanation + /// + /// The `must_not_suspend` lint detects values that are marked with the `#[must_not_suspend]` + /// attribute being held across yield points. A "yield" point is usually a `.await` in an async + /// function. + /// + /// This attribute can be used to mark values that are semantically incorrect across yields + /// (like certain types of timers), values that have async alternatives, and values that + /// regularly cause problems with the `Send`-ness of async fn's returned futures (like + /// `MutexGuard`'s) + /// pub MUST_NOT_SUSPEND, Warn, - "Use of a `#[must_not_suspend]` value across a yield point", + "use of a `#[must_not_suspend]` value across a yield point", } declare_lint! { diff --git a/compiler/rustc_typeck/src/check/generator_interior.rs b/compiler/rustc_typeck/src/check/generator_interior.rs index 1b63d6d9741..7e4bc08c172 100644 --- a/compiler/rustc_typeck/src/check/generator_interior.rs +++ b/compiler/rustc_typeck/src/check/generator_interior.rs @@ -463,8 +463,10 @@ pub fn check_must_not_suspend_ty<'tcx>( plural_len: usize, ) -> bool { if ty.is_unit() + // FIXME: should this check `is_ty_uninhabited_from`. This query is not available in this stage + // of typeck (before ReVar and RePlaceholder are removed), but may remove noise, like in + // `must_use` // || fcx.tcx.is_ty_uninhabited_from(fcx.tcx.parent_module(hir_id).to_def_id(), ty, fcx.param_env) - // FIXME: should this check is_ty_uninhabited_from { return true; } @@ -496,6 +498,7 @@ pub fn check_must_not_suspend_ty<'tcx>( descr_pre, descr_post, ), + // FIXME: support adding the attribute to TAITs ty::Opaque(def, _) => { let mut has_emitted = false; for &(predicate, _) in fcx.tcx.explicit_item_bounds(def) { @@ -604,18 +607,18 @@ fn check_must_not_suspend_def( ); let mut err = lint.build(&msg); + // add span pointing to the offending yield/await + err.span_label(yield_span, "the value is held across this yield point"); + // Add optional reason note if let Some(note) = attr.value_str() { - err.note(¬e.as_str()); + err.span_note(source_span, ¬e.as_str()); } - // add span pointing to the offending yield/await) - err.span_label(yield_span, "The value is held across this yield point"); - // Add some quick suggestions on what to do err.span_help( source_span, - "`drop` this value before the yield point, or use a block (`{ ... }`) \" + "`drop` this value before the yield point, or use a block (`{ ... }`) \ to shrink its scope", ); diff --git a/src/test/ui/lint/must_not_suspend/boxed.stderr b/src/test/ui/lint/must_not_suspend/boxed.stderr index c3c23db7d72..7bd80405b5d 100644 --- a/src/test/ui/lint/must_not_suspend/boxed.stderr +++ b/src/test/ui/lint/must_not_suspend/boxed.stderr @@ -4,16 +4,19 @@ error: boxed `Umm` held across a yield point, but should not be LL | let _guard = bar(); | ^^^^^^ LL | other().await; - | ------------- The value is held across this yield point + | ------------- the value is held across this yield point | note: the lint level is defined here --> $DIR/boxed.rs:3:9 | LL | #![deny(must_not_suspend)] | ^^^^^^^^^^^^^^^^ - = note: You gotta use Umm's, ya know? -help: `drop` this value before the yield point, or use a block (`{ ... }`) " - to shrink its scope +note: You gotta use Umm's, ya know? + --> $DIR/boxed.rs:20:9 + | +LL | let _guard = bar(); + | ^^^^^^ +help: `drop` this value before the yield point, or use a block (`{ ... }`) to shrink its scope --> $DIR/boxed.rs:20:9 | LL | let _guard = bar(); diff --git a/src/test/ui/lint/must_not_suspend/ref.stderr b/src/test/ui/lint/must_not_suspend/ref.stderr index 91c91a4b545..d2a550d7b45 100644 --- a/src/test/ui/lint/must_not_suspend/ref.stderr +++ b/src/test/ui/lint/must_not_suspend/ref.stderr @@ -5,16 +5,19 @@ LL | let guard = &mut self.u; | ^^^^^^ ... LL | other().await; - | ------------- The value is held across this yield point + | ------------- the value is held across this yield point | note: the lint level is defined here --> $DIR/ref.rs:3:9 | LL | #![deny(must_not_suspend)] | ^^^^^^^^^^^^^^^^ - = note: You gotta use Umm's, ya know? -help: `drop` this value before the yield point, or use a block (`{ ... }`) " - to shrink its scope +note: You gotta use Umm's, ya know? + --> $DIR/ref.rs:18:26 + | +LL | let guard = &mut self.u; + | ^^^^^^ +help: `drop` this value before the yield point, or use a block (`{ ... }`) to shrink its scope --> $DIR/ref.rs:18:26 | LL | let guard = &mut self.u; @@ -27,11 +30,14 @@ LL | let guard = &mut self.u; | ^^^^^^ ... LL | other().await; - | ------------- The value is held across this yield point + | ------------- the value is held across this yield point | - = note: You gotta use Umm's, ya know? -help: `drop` this value before the yield point, or use a block (`{ ... }`) " - to shrink its scope +note: You gotta use Umm's, ya know? + --> $DIR/ref.rs:18:26 + | +LL | let guard = &mut self.u; + | ^^^^^^ +help: `drop` this value before the yield point, or use a block (`{ ... }`) to shrink its scope --> $DIR/ref.rs:18:26 | LL | let guard = &mut self.u; diff --git a/src/test/ui/lint/must_not_suspend/trait.stderr b/src/test/ui/lint/must_not_suspend/trait.stderr index 1175cbb9192..8d7bb808764 100644 --- a/src/test/ui/lint/must_not_suspend/trait.stderr +++ b/src/test/ui/lint/must_not_suspend/trait.stderr @@ -5,15 +5,14 @@ LL | let _guard1 = r#impl(); | ^^^^^^^ ... LL | other().await; - | ------------- The value is held across this yield point + | ------------- the value is held across this yield point | note: the lint level is defined here --> $DIR/trait.rs:3:9 | LL | #![deny(must_not_suspend)] | ^^^^^^^^^^^^^^^^ -help: `drop` this value before the yield point, or use a block (`{ ... }`) " - to shrink its scope +help: `drop` this value before the yield point, or use a block (`{ ... }`) to shrink its scope --> $DIR/trait.rs:21:9 | LL | let _guard1 = r#impl(); @@ -26,10 +25,9 @@ LL | let _guard2 = r#dyn(); | ^^^^^^^ LL | LL | other().await; - | ------------- The value is held across this yield point + | ------------- the value is held across this yield point | -help: `drop` this value before the yield point, or use a block (`{ ... }`) " - to shrink its scope +help: `drop` this value before the yield point, or use a block (`{ ... }`) to shrink its scope --> $DIR/trait.rs:22:9 | LL | let _guard2 = r#dyn(); diff --git a/src/test/ui/lint/must_not_suspend/unit.stderr b/src/test/ui/lint/must_not_suspend/unit.stderr index cff00dd8ca4..87e0fd27e70 100644 --- a/src/test/ui/lint/must_not_suspend/unit.stderr +++ b/src/test/ui/lint/must_not_suspend/unit.stderr @@ -4,16 +4,19 @@ error: `Umm` held across a yield point, but should not be LL | let _guard = bar(); | ^^^^^^ LL | other().await; - | ------------- The value is held across this yield point + | ------------- the value is held across this yield point | note: the lint level is defined here --> $DIR/unit.rs:3:9 | LL | #![deny(must_not_suspend)] | ^^^^^^^^^^^^^^^^ - = note: You gotta use Umm's, ya know? -help: `drop` this value before the yield point, or use a block (`{ ... }`) " - to shrink its scope +note: You gotta use Umm's, ya know? + --> $DIR/unit.rs:20:9 + | +LL | let _guard = bar(); + | ^^^^^^ +help: `drop` this value before the yield point, or use a block (`{ ... }`) to shrink its scope --> $DIR/unit.rs:20:9 | LL | let _guard = bar(); diff --git a/src/test/ui/lint/must_not_suspend/warn.stderr b/src/test/ui/lint/must_not_suspend/warn.stderr index bda44d051ee..03b77520c9f 100644 --- a/src/test/ui/lint/must_not_suspend/warn.stderr +++ b/src/test/ui/lint/must_not_suspend/warn.stderr @@ -4,12 +4,15 @@ warning: `Umm` held across a yield point, but should not be LL | let _guard = bar(); | ^^^^^^ LL | other().await; - | ------------- The value is held across this yield point + | ------------- the value is held across this yield point | = note: `#[warn(must_not_suspend)]` on by default - = note: You gotta use Umm's, ya know? -help: `drop` this value before the yield point, or use a block (`{ ... }`) " - to shrink its scope +note: You gotta use Umm's, ya know? + --> $DIR/warn.rs:20:9 + | +LL | let _guard = bar(); + | ^^^^^^ +help: `drop` this value before the yield point, or use a block (`{ ... }`) to shrink its scope --> $DIR/warn.rs:20:9 | LL | let _guard = bar(); |
