1
Fork 0

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. /// Allows `let...else` statements.
(active, let_else, "1.56.0", Some(87335), None), (active, let_else, "1.56.0", Some(87335), None),
/// Allows `#[must_not_suspend]`. /// Allows the `#[must_not_suspend]` attribute.
(active, must_not_suspend, "1.56.0", Some(83310), None), (active, must_not_suspend, "1.57.0", Some(83310), None),
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------

View file

@ -315,14 +315,8 @@ declare_lint! {
} }
declare_lint! { declare_lint! {
/// The `must_not_suspend` lint detects values that are marked with the `#[must_not_suspend]` /// The `must_not_suspend` lint guards against values that shouldn't be held across yield points
/// attribute being held across yield points. A "yield" point is usually a `.await` in an async /// (`.await`)
/// 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)
/// ///
/// ### Example /// ### Example
/// ///
@ -339,9 +333,23 @@ declare_lint! {
/// yield_now().await; /// 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, pub MUST_NOT_SUSPEND,
Warn, 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! { declare_lint! {

View file

@ -463,8 +463,10 @@ pub fn check_must_not_suspend_ty<'tcx>(
plural_len: usize, plural_len: usize,
) -> bool { ) -> bool {
if ty.is_unit() 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) // || 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; return true;
} }
@ -496,6 +498,7 @@ pub fn check_must_not_suspend_ty<'tcx>(
descr_pre, descr_pre,
descr_post, descr_post,
), ),
// FIXME: support adding the attribute to TAITs
ty::Opaque(def, _) => { ty::Opaque(def, _) => {
let mut has_emitted = false; let mut has_emitted = false;
for &(predicate, _) in fcx.tcx.explicit_item_bounds(def) { 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); 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 // Add optional reason note
if let Some(note) = attr.value_str() { 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 // Add some quick suggestions on what to do
err.span_help( err.span_help(
source_span, 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", 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 | let _guard = bar();
| ^^^^^^ | ^^^^^^
LL | other().await; 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 note: the lint level is defined here
--> $DIR/boxed.rs:3:9 --> $DIR/boxed.rs:3:9
| |
LL | #![deny(must_not_suspend)] LL | #![deny(must_not_suspend)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
= note: You gotta use Umm's, ya know? note: You gotta use Umm's, ya know?
help: `drop` this value before the yield point, or use a block (`{ ... }`) " --> $DIR/boxed.rs:20:9
to shrink its scope |
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 --> $DIR/boxed.rs:20:9
| |
LL | let _guard = bar(); LL | let _guard = bar();

View file

@ -5,16 +5,19 @@ LL | let guard = &mut self.u;
| ^^^^^^ | ^^^^^^
... ...
LL | other().await; 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 note: the lint level is defined here
--> $DIR/ref.rs:3:9 --> $DIR/ref.rs:3:9
| |
LL | #![deny(must_not_suspend)] LL | #![deny(must_not_suspend)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
= note: You gotta use Umm's, ya know? note: You gotta use Umm's, ya know?
help: `drop` this value before the yield point, or use a block (`{ ... }`) " --> $DIR/ref.rs:18:26
to shrink its scope |
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 --> $DIR/ref.rs:18:26
| |
LL | let guard = &mut self.u; LL | let guard = &mut self.u;
@ -27,11 +30,14 @@ LL | let guard = &mut self.u;
| ^^^^^^ | ^^^^^^
... ...
LL | other().await; 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? note: You gotta use Umm's, ya know?
help: `drop` this value before the yield point, or use a block (`{ ... }`) " --> $DIR/ref.rs:18:26
to shrink its scope |
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 --> $DIR/ref.rs:18:26
| |
LL | let guard = &mut self.u; LL | let guard = &mut self.u;

View file

@ -5,15 +5,14 @@ LL | let _guard1 = r#impl();
| ^^^^^^^ | ^^^^^^^
... ...
LL | other().await; 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 note: the lint level is defined here
--> $DIR/trait.rs:3:9 --> $DIR/trait.rs:3:9
| |
LL | #![deny(must_not_suspend)] LL | #![deny(must_not_suspend)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
help: `drop` this value before the yield point, or use a block (`{ ... }`) " help: `drop` this value before the yield point, or use a block (`{ ... }`) to shrink its scope
to shrink its scope
--> $DIR/trait.rs:21:9 --> $DIR/trait.rs:21:9
| |
LL | let _guard1 = r#impl(); LL | let _guard1 = r#impl();
@ -26,10 +25,9 @@ LL | let _guard2 = r#dyn();
| ^^^^^^^ | ^^^^^^^
LL | LL |
LL | other().await; 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 (`{ ... }`) " help: `drop` this value before the yield point, or use a block (`{ ... }`) to shrink its scope
to shrink its scope
--> $DIR/trait.rs:22:9 --> $DIR/trait.rs:22:9
| |
LL | let _guard2 = r#dyn(); 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 | let _guard = bar();
| ^^^^^^ | ^^^^^^
LL | other().await; 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 note: the lint level is defined here
--> $DIR/unit.rs:3:9 --> $DIR/unit.rs:3:9
| |
LL | #![deny(must_not_suspend)] LL | #![deny(must_not_suspend)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
= note: You gotta use Umm's, ya know? note: You gotta use Umm's, ya know?
help: `drop` this value before the yield point, or use a block (`{ ... }`) " --> $DIR/unit.rs:20:9
to shrink its scope |
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 --> $DIR/unit.rs:20:9
| |
LL | let _guard = bar(); 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 | let _guard = bar();
| ^^^^^^ | ^^^^^^
LL | other().await; 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: `#[warn(must_not_suspend)]` on by default
= note: You gotta use Umm's, ya know? note: You gotta use Umm's, ya know?
help: `drop` this value before the yield point, or use a block (`{ ... }`) " --> $DIR/warn.rs:20:9
to shrink its scope |
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 --> $DIR/warn.rs:20:9
| |
LL | let _guard = bar(); LL | let _guard = bar();