33 lines
1.0 KiB
Rust
33 lines
1.0 KiB
Rust
// Check that method bounds declared on traits/impls in a cross-crate
|
|
// scenario work. This is the library portion of the test.
|
|
|
|
pub enum MaybeOwned<'a> {
|
|
Owned(isize),
|
|
Borrowed(&'a isize)
|
|
}
|
|
|
|
pub struct Inv<'a> { // invariant w/r/t 'a
|
|
x: &'a mut &'a isize
|
|
}
|
|
|
|
// I encountered a bug at some point with encoding the IntoMaybeOwned
|
|
// trait, so I'll use that as the template for this test.
|
|
pub trait IntoMaybeOwned<'a> {
|
|
fn into_maybe_owned(self) -> MaybeOwned<'a>;
|
|
|
|
// Note: without this `into_inv` method, the trait is
|
|
// contravariant w/r/t `'a`, since if you look strictly at the
|
|
// interface, it only returns `'a`. This complicates the
|
|
// downstream test since it wants invariance to force an error.
|
|
// Hence we add this method.
|
|
fn into_inv(self) -> Inv<'a>;
|
|
|
|
fn bigger_region<'b:'a>(self, b: Inv<'b>);
|
|
}
|
|
|
|
impl<'a> IntoMaybeOwned<'a> for Inv<'a> {
|
|
fn into_maybe_owned(self) -> MaybeOwned<'a> { panic!() }
|
|
fn into_inv(self) -> Inv<'a> { panic!() }
|
|
fn bigger_region<'b:'a>(self, b: Inv<'b>) { panic!() }
|
|
}
|