blob: b0703a4ee22b3b35fc792be2e98cd53a4a46c004 [file] [log] [blame]
// build-pass (FIXME(62277): could be check-pass?)
#![feature(associated_type_bounds)]
use std::iter::Once;
use std::ops::Range;
pub trait Three { type A; type B; type C; }
pub fn assert_three<T: ?Sized + Three>() {}
pub fn assert_iterator<T: Iterator>() {}
pub fn assert_copy<T: Copy>() {}
pub fn assert_static<T: 'static>() {}
pub fn assert_send<T: Send>() {}
pub fn assert_forall_into<T: for<'a> Into<&'a u8>>() {}
struct A; struct B;
impl<'a> Into<&'a u8> for A { fn into(self) -> &'a u8 { &0 } }
impl Three for B { type A = Range<u8>; type B = Range<u8>; type C = Range<u8>; }
trait Case1<A, B, C, D, E>
where
A: Iterator<Item: Copy>,
B: Iterator<Item: 'static>,
C: Iterator<Item: 'static + Copy + Send>,
D: Iterator<Item: for<'a> Into<&'a u8>>,
E: Three<A: Iterator<Item: Copy>, B: Iterator<Item: Copy>, C: Iterator<Item: Copy>>,
Self: Three<A: 'static, B: Copy, C: Send>,
{
fn _a() {
assert_iterator::<A>();
assert_copy::<A::Item>();
}
fn _b() {
assert_iterator::<B>();
assert_static::<B::Item>();
}
fn _c() {
assert_iterator::<C>();
assert_copy::<C::Item>();
assert_static::<C::Item>();
assert_send::<C::Item>();
}
fn _d() {
assert_iterator::<D>();
assert_forall_into::<D::Item>();
}
fn _e() {
assert_three::<E>();
assert_iterator::<E::A>();
assert_iterator::<E::B>();
assert_iterator::<E::C>();
assert_copy::<<E::A as Iterator>::Item>();
assert_copy::<<E::B as Iterator>::Item>();
assert_copy::<<E::C as Iterator>::Item>();
}
fn _self() {
assert_three::<Self>();
assert_copy::<Self::B>();
assert_static::<Self::A>();
assert_send::<Self::C>();
}
}
struct DataCase1;
impl Three for DataCase1 { type A = u8; type B = u8; type C = u8; }
impl Case1<Range<u8>, Range<u8>, Range<u8>, Once<A>, B> for DataCase1 {}
trait Case2<
A: Iterator<Item: Copy>,
B: Iterator<Item: 'static>,
C: Iterator<Item: 'static + Copy + Send>,
D: Iterator<Item: for<'a> Into<&'a u8>>,
E: Three<A: Iterator<Item: Copy>, B: Iterator<Item: Copy>, C: Iterator<Item: Copy>>,
>:
Three<A: 'static, B: Copy, C: Send>
{
fn _a() {
assert_iterator::<A>();
assert_copy::<A::Item>();
}
fn _b() {
assert_iterator::<B>();
assert_static::<B::Item>();
}
fn _c() {
assert_iterator::<C>();
assert_copy::<C::Item>();
assert_static::<C::Item>();
assert_send::<C::Item>();
}
fn _d() {
assert_iterator::<D>();
assert_forall_into::<D::Item>();
}
fn _e() {
assert_three::<E>();
assert_iterator::<E::A>();
assert_iterator::<E::B>();
assert_iterator::<E::C>();
assert_copy::<<E::A as Iterator>::Item>();
assert_copy::<<E::B as Iterator>::Item>();
assert_copy::<<E::C as Iterator>::Item>();
}
fn _self() {
assert_three::<Self>();
assert_copy::<Self::B>();
assert_static::<Self::A>();
assert_send::<Self::C>();
}
}
struct DataCase2;
impl Three for DataCase2 { type A = u8; type B = u8; type C = u8; }
impl Case2<Range<u8>, Range<u8>, Range<u8>, Once<A>, B> for DataCase2 {}
fn main() {}