summaryrefslogtreecommitdiffstats
path: root/src/test/ui/generator/issue-53548.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/generator/issue-53548.rs')
-rw-r--r--src/test/ui/generator/issue-53548.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/test/ui/generator/issue-53548.rs b/src/test/ui/generator/issue-53548.rs
new file mode 100644
index 000000000..3ebabb914
--- /dev/null
+++ b/src/test/ui/generator/issue-53548.rs
@@ -0,0 +1,38 @@
+// Regression test for #53548. The `Box<dyn Trait>` type below is
+// expanded to `Box<dyn Trait + 'static>`, but the generator "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(generators)]
+
+use std::cell::RefCell;
+use std::rc::Rc;
+
+trait Trait: 'static {}
+
+struct Store<C> {
+ inner: Rc<RefCell<Option<C>>>,
+}
+
+fn main() {
+ Box::new(static move || {
+ let store = Store::<Box<dyn Trait>> {
+ inner: Default::default(),
+ };
+ yield ();
+ });
+}