descr_post: &str,
plural_len: usize,
) -> bool {
- debug!("FOUND TYPE: {:?}", ty);
if ty.is_unit()
// || 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
}
has_emitted
}
- ty::Array(ty, len) => match len.try_eval_usize(fcx.tcx, fcx.param_env) {
- // If the array is empty we don't lint, to avoid false positives
- Some(0) | None => false,
- // If the array is definitely non-empty, we can do `#[must_use]` checking.
- Some(n) => {
- let descr_pre = &format!("{}array{} of ", descr_pre, plural_suffix,);
- check_must_not_suspend_ty(
- fcx,
- ty,
- hir_id,
- expr,
- source_span,
- yield_span,
- descr_pre,
- descr_post,
- n as usize + 1,
- )
- }
- },
+ ty::Array(ty, len) => {
+ let descr_pre = &format!("{}array{} of ", descr_pre, plural_suffix,);
+ check_must_not_suspend_ty(
+ fcx,
+ ty,
+ hir_id,
+ expr,
+ source_span,
+ yield_span,
+ descr_pre,
+ descr_post,
+ len.try_eval_usize(fcx.tcx, fcx.param_env).unwrap_or(0) as usize + 1,
+ )
+ }
_ => false,
}
}
--- /dev/null
+// edition:2018
+#![feature(must_not_suspend)]
+#![deny(must_not_suspend)]
+
+#[must_not_suspend = "You gotta use Umm's, ya know?"]
+struct Umm {
+ i: i64
+}
+
+struct Bar {
+ u: Umm,
+}
+
+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;
+
+ *guard = Umm {
+ i: 2
+ }
+ }
+}
+
+fn main() {
+}
--- /dev/null
+error: `Umm` held across a yield 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 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
+ --> $DIR/ref.rs:18:26
+ |
+LL | let guard = &mut self.u;
+ | ^^^^^^
+
+error: `Umm` held across a yield 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 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
+ --> $DIR/ref.rs:18:26
+ |
+LL | let guard = &mut self.u;
+ | ^^^^^^
+
+error: aborting due to 2 previous errors
+