|  | //@ revisions: may_dangle may_not_dangle | 
|  | //@[may_dangle] check-pass | 
|  | //@ edition: 2018 | 
|  |  | 
|  | // Ensure that if a coroutine's interior has no drop types then we don't require the upvars to | 
|  | // be *use-live*, but instead require them to be *drop-live*. In this case, `Droppy<&'?0 ()>` | 
|  | // does not require that `'?0` is live for drops since the parameter is `#[may_dangle]` in | 
|  | // the may_dangle revision, but not in the may_not_dangle revision. | 
|  |  | 
|  | #![feature(dropck_eyepatch)] | 
|  |  | 
|  | struct Droppy<T>(T); | 
|  |  | 
|  | #[cfg(may_dangle)] | 
|  | unsafe impl<#[may_dangle] T> Drop for Droppy<T> { | 
|  | fn drop(&mut self) { | 
|  | // This does not use `T` of course. | 
|  | } | 
|  | } | 
|  |  | 
|  | #[cfg(may_not_dangle)] | 
|  | impl<T> Drop for Droppy<T> { | 
|  | fn drop(&mut self) {} | 
|  | } | 
|  |  | 
|  | fn main() { | 
|  | let drop_me; | 
|  | let fut; | 
|  | { | 
|  | let y = (); | 
|  | drop_me = Droppy(&y); | 
|  | //[may_not_dangle]~^ ERROR `y` does not live long enough | 
|  | fut = async { | 
|  | std::mem::drop(drop_me); | 
|  | }; | 
|  | } | 
|  | } |