38 lines
767 B
Rust
38 lines
767 B
Rust
|
//@ 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>(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<Cont> A<Cont> {
|
||
|
// We want this function to work
|
||
|
pub fn failing<Coef>(&self)
|
||
|
where
|
||
|
Self: AsSlice<Element = Coef>,
|
||
|
{
|
||
|
self.as_ref_a().as_ref_a();
|
||
|
}
|
||
|
|
||
|
pub fn as_ref_a<Coef>(&self) -> A<&[<Self as AsSlice>::Element]>
|
||
|
where
|
||
|
Self: AsSlice<Element = Coef>,
|
||
|
{
|
||
|
A(self.as_slice())
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn main() {}
|