//@ check-pass // Some trait with a function that returns a slice: pub trait AsSlice { type Element; fn as_slice(&self) -> &[Self::Element]; } // Some type pub struct A(Cont); // Here we say that if A wraps a slice, then it implements AsSlice impl<'a, Element> AsSlice for A<&'a [Element]> { type Element = Element; fn as_slice(&self) -> &[Self::Element] { self.0 } } impl A { // We want this function to work pub fn failing(&self) where Self: AsSlice, { self.as_ref_a().as_ref_a(); } pub fn as_ref_a(&self) -> A<&[::Element]> where Self: AsSlice, { A(self.as_slice()) } } fn main() {}