--- /dev/null
+#![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() {}
--- /dev/null
+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`.