// Returns whether it emitted a diagnostic or not
// Note that this fn and the proceding one are based on the code
// for creating must_use diagnostics
+//
+// Note that this technique was chosen over things like a `Suspend` marker trait
+// as it is simpler and has precendent in the compiler
pub fn check_must_not_suspend_ty<'tcx>(
fcx: &FnCtxt<'_, 'tcx>,
ty: Ty<'tcx>,
--- /dev/null
+// edition:2018
+#![feature(must_not_suspend)]
+#![deny(must_not_suspend)]
+
+#[must_not_suspend]
+struct No {}
+
+async fn shushspend() {}
+
+async fn wheeee<T>(t: T) {
+ shushspend().await;
+ drop(t);
+}
+
+async fn yes() {
+ wheeee(No {}).await; //~ ERROR `No` held across
+ //~^ ERROR `No` held across
+}
+
+fn main() {
+}
--- /dev/null
+error: `No` held across a suspend point, but should not be
+ --> $DIR/generic.rs:16:12
+ |
+LL | wheeee(No {}).await;
+ | -------^^^^^------- the value is held across this suspend point
+ |
+note: the lint level is defined here
+ --> $DIR/generic.rs:3:9
+ |
+LL | #![deny(must_not_suspend)]
+ | ^^^^^^^^^^^^^^^^
+help: consider using a block (`{ ... }`) to shrink the value's scope, ending before the suspend point
+ --> $DIR/generic.rs:16:12
+ |
+LL | wheeee(No {}).await;
+ | ^^^^^
+
+error: `No` held across a suspend point, but should not be
+ --> $DIR/generic.rs:16:12
+ |
+LL | wheeee(No {}).await;
+ | -------^^^^^------- the value is held across this suspend point
+ |
+help: consider using a block (`{ ... }`) to shrink the value's scope, ending before the suspend point
+ --> $DIR/generic.rs:16:12
+ |
+LL | wheeee(No {}).await;
+ | ^^^^^
+
+error: aborting due to 2 previous errors
+