error formatting and fix build

This commit is contained in:
Gus Wynn 2021-09-13 08:19:40 -07:00
parent ee1d2ea3b7
commit 2af1ebfbdf
8 changed files with 67 additions and 43 deletions

View file

@ -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),
// -------------------------------------------------------------------------

View file

@ -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! {

View file

@ -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(&note.as_str());
err.span_note(source_span, &note.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",
);

View file

@ -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();

View file

@ -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;

View file

@ -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();

View file

@ -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();

View file

@ -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();