39 lines
726 B
Rust
39 lines
726 B
Rust
// run-pass
|
|
#![feature(trait_upcasting)]
|
|
|
|
trait Foo<T: Default + ToString>: Bar<i32> + Bar<T> {}
|
|
trait Bar<T: Default + ToString> {
|
|
fn bar(&self) -> String {
|
|
T::default().to_string()
|
|
}
|
|
}
|
|
|
|
struct S1;
|
|
|
|
impl Bar<i32> for S1 {}
|
|
impl Foo<i32> for S1 {}
|
|
|
|
struct S2;
|
|
impl Bar<i32> for S2 {}
|
|
impl Bar<bool> for S2 {}
|
|
impl Foo<bool> for S2 {}
|
|
|
|
fn test1(x: &dyn Foo<i32>) {
|
|
let s = x as &dyn Bar<i32>;
|
|
assert_eq!("0", &s.bar().to_string());
|
|
}
|
|
|
|
fn test2(x: &dyn Foo<bool>) {
|
|
let p = x as &dyn Bar<i32>;
|
|
assert_eq!("0", &p.bar().to_string());
|
|
let q = x as &dyn Bar<bool>;
|
|
assert_eq!("false", &q.bar().to_string());
|
|
}
|
|
|
|
fn main() {
|
|
let s1 = S1;
|
|
test1(&s1);
|
|
let s2 = S2;
|
|
test2(&s2);
|
|
}
|