about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/test/ui/generic-associated-types/issue-91883.rs42
-rw-r--r--src/test/ui/generic-associated-types/issue-91883.stderr26
2 files changed, 68 insertions, 0 deletions
diff --git a/src/test/ui/generic-associated-types/issue-91883.rs b/src/test/ui/generic-associated-types/issue-91883.rs
new file mode 100644
index 00000000000..3d4585a44df
--- /dev/null
+++ b/src/test/ui/generic-associated-types/issue-91883.rs
@@ -0,0 +1,42 @@
+#![feature(generic_associated_types)]
+
+use std::fmt::Debug;
+use std::marker::PhantomData;
+
+#[derive(Debug)]
+pub struct TransactionImpl<'db> {
+    _marker: PhantomData<&'db ()>,
+}
+
+#[derive(Debug)]
+pub struct CursorImpl<'txn> {
+    _marker: PhantomData<&'txn ()>,
+}
+
+pub trait Cursor<'txn> {}
+
+pub trait Transaction<'db>: Send + Sync + Debug + Sized {
+    type Cursor<'tx>: Cursor<'tx>
+    where
+        'db: 'tx,
+        Self: 'tx;
+
+    fn cursor<'tx>(&'tx self) -> Result<Self::Cursor<'tx>, ()>
+    where
+        'db: 'tx;
+}
+
+impl<'tx> Cursor<'tx> for CursorImpl<'tx> {}
+
+impl<'db> Transaction<'db> for TransactionImpl<'db> {
+    type Cursor<'tx> = CursorImpl<'tx>; //~ ERROR lifetime bound not satisfied
+
+    fn cursor<'tx>(&'tx self) -> Result<Self::Cursor<'tx>, ()>
+    where
+        'db: 'tx,
+    {
+        loop {}
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/generic-associated-types/issue-91883.stderr b/src/test/ui/generic-associated-types/issue-91883.stderr
new file mode 100644
index 00000000000..ed700876e02
--- /dev/null
+++ b/src/test/ui/generic-associated-types/issue-91883.stderr
@@ -0,0 +1,26 @@
+error[E0478]: lifetime bound not satisfied
+  --> $DIR/issue-91883.rs:32:24
+   |
+LL | /     type Cursor<'tx>: Cursor<'tx>
+LL | |     where
+LL | |         'db: 'tx,
+LL | |         Self: 'tx;
+   | |__________________- definition of `Cursor` from trait
+...
+LL |       type Cursor<'tx> = CursorImpl<'tx>;
+   |                          ^^^^^^^^^^^^^^^- help: try copying these clauses from the trait: `where 'db: 'tx, Self: 'tx`
+   |
+note: lifetime parameter instantiated with the lifetime `'db` as defined here
+  --> $DIR/issue-91883.rs:31:6
+   |
+LL | impl<'db> Transaction<'db> for TransactionImpl<'db> {
+   |      ^^^
+note: but lifetime parameter must outlive the lifetime `'tx` as defined here
+  --> $DIR/issue-91883.rs:32:17
+   |
+LL |     type Cursor<'tx> = CursorImpl<'tx>;
+   |                 ^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0478`.