aef0f4024a
And suggest adding the `#[coroutine]` to the closure
39 lines
1.4 KiB
Rust
39 lines
1.4 KiB
Rust
// Regression test for #53548. The `Box<dyn Trait>` type below is
|
|
// expanded to `Box<dyn Trait + 'static>`, but the coroutine "witness"
|
|
// that results is `for<'r> { Box<dyn Trait + 'r> }`. The WF code was
|
|
// encountering an ICE (when debug-assertions were enabled) and an
|
|
// unexpected compilation error (without debug-asserions) when trying
|
|
// to process this `'r` region bound. In particular, to be WF, the
|
|
// region bound must meet the requirements of the trait, and hence we
|
|
// got `for<'r> { 'r: 'static }`. This would ICE because the `Binder`
|
|
// constructor we were using was assering that no higher-ranked
|
|
// regions were involved (because the WF code is supposed to skip
|
|
// those). The error (if debug-asserions were disabled) came because
|
|
// we obviously cannot prove that `'r: 'static` for any region `'r`.
|
|
// Pursuant with our "lazy WF" strategy for higher-ranked regions, the
|
|
// fix is not to require that `for<'r> { 'r: 'static }` holds (this is
|
|
// also analogous to what we would do for higher-ranked regions
|
|
// appearing within the trait in other positions).
|
|
//
|
|
//@ check-pass
|
|
|
|
#![feature(coroutines, stmt_expr_attributes)]
|
|
|
|
use std::cell::RefCell;
|
|
use std::rc::Rc;
|
|
|
|
trait Trait: 'static {}
|
|
|
|
struct Store<C> {
|
|
inner: Rc<RefCell<Option<C>>>,
|
|
}
|
|
|
|
fn main() {
|
|
Box::new(#[coroutine] static move || {
|
|
let store = Store::<Box<dyn Trait>> {
|
|
inner: Default::default(),
|
|
};
|
|
yield ();
|
|
});
|
|
}
|