error formatting and fix build
This commit is contained in:
parent
ee1d2ea3b7
commit
2af1ebfbdf
8 changed files with 67 additions and 43 deletions
|
@ -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),
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
|
|
@ -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! {
|
||||
|
|
|
@ -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",
|
||||
);
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue