mirror of https://github.com/rust-lang/rust
31 lines
859 B
Rust
31 lines
859 B
Rust
//@ build-pass
|
|
|
|
// Ensures that we don't regress on "implementation is not general enough" when
|
|
// normalizating under binders. Unlike `normalization-generality.rs`, this also produces
|
|
// type outlives predicates that we must ignore.
|
|
|
|
pub unsafe trait Yokeable<'a> {
|
|
type Output: 'a;
|
|
}
|
|
pub struct Yoke<Y: for<'a> Yokeable<'a>> {
|
|
_marker: std::marker::PhantomData<Y>,
|
|
}
|
|
impl<Y: for<'a> Yokeable<'a>> Yoke<Y> {
|
|
pub fn project<P>(
|
|
&self,
|
|
_f: for<'a> fn(&<Y as Yokeable<'a>>::Output, &'a ()) -> <P as Yokeable<'a>>::Output,
|
|
) -> Yoke<P>
|
|
where
|
|
P: for<'a> Yokeable<'a>,
|
|
{
|
|
unimplemented!()
|
|
}
|
|
}
|
|
pub fn slice(y: Yoke<&'static str>) -> Yoke<&'static [u8]> {
|
|
y.project(move |yk, _| yk.as_bytes())
|
|
}
|
|
unsafe impl<'a, T: 'static + ?Sized> Yokeable<'a> for &'static T {
|
|
type Output = &'a T;
|
|
}
|
|
fn main() {}
|