mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
Add test for upvar breakage
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
error[E0597]: `y` does not live long enough
|
||||
--> $DIR/drop-live-upvar-2.rs:31:26
|
||||
|
|
||||
LL | let y = ();
|
||||
| - binding `y` declared here
|
||||
LL | drop_me = Droppy(&y);
|
||||
| ^^ borrowed value does not live long enough
|
||||
...
|
||||
LL | }
|
||||
| - `y` dropped here while still borrowed
|
||||
LL | }
|
||||
| - borrow might be used here, when `fut` is dropped and runs the destructor for coroutine
|
||||
|
|
||||
= note: values in a scope are dropped in the opposite order they are defined
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0597`.
|
||||
@@ -0,0 +1,37 @@
|
||||
//@ 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);
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user