| //@ revisions: next old | |
| //@[next] compile-flags: -Znext-solver | |
| //@ ignore-compare-mode-next-solver (explicit revisions) | |
| #![feature(try_as_dyn)] | |
| //@ check-pass | |
| use std::any::try_as_dyn; | |
| struct Thing<T>(T); | |
| trait Trait {} | |
| impl<T> Trait for Thing<T> {} | |
| const _: () = { | |
| let thing = Thing(1); | |
| assert!(try_as_dyn::<_, dyn Trait>(&thing).is_some()); | |
| }; | |
| struct Thing2<T>(T); | |
| impl<T: std::fmt::Debug> Trait for Thing2<T> {} | |
| struct NoDebug; | |
| const _: () = { | |
| let thing = Thing2(1); | |
| assert!(try_as_dyn::<_, dyn Trait>(&thing).is_some()); | |
| let thing = Thing2(NoDebug); | |
| assert!(try_as_dyn::<_, dyn Trait>(&thing).is_none()); | |
| }; | |
| trait Trait2 {} | |
| impl<'a, 'b> Trait2 for &'a &'b () {} | |
| struct Thing3<T>(T); | |
| impl<T: Trait2> Trait for Thing3<T> {} | |
| const _: () = { | |
| let thing = Thing3(&&()); | |
| assert!(try_as_dyn::<_, dyn Trait2>(&thing).is_none()); | |
| }; | |
| fn main() {} |