| //@ revisions: next old | |
| //@[next] compile-flags: -Znext-solver | |
| //@ ignore-compare-mode-next-solver (explicit revisions) | |
| //@check-pass | |
| #![feature(try_as_dyn)] | |
| trait Trait {} | |
| const _: () = { | |
| assert!(std::any::try_as_dyn::<_, dyn Trait>(&&42_i32).is_none()); | |
| }; | |
| impl<'a> Trait for &'a [(); 1] {} | |
| const _: () = { | |
| let x = (); | |
| assert!(std::any::try_as_dyn::<_, dyn Trait>(&&[x]).is_some()); | |
| }; | |
| type Foo = &'static [(); 2]; | |
| // Ensure type aliases don't skip these checks | |
| impl Trait for Foo {} | |
| const _: () = { | |
| assert!(std::any::try_as_dyn::<_, dyn Trait>(&&[(), ()]).is_none()); | |
| }; | |
| impl Trait for &() {} | |
| const _: () = { | |
| let x = (); | |
| assert!(std::any::try_as_dyn::<_, dyn Trait>(&&x).is_some()); | |
| }; | |
| impl Trait for () {} | |
| const _: () = { | |
| assert!(std::any::try_as_dyn::<_, dyn Trait>(&()).is_some()); | |
| }; | |
| // Not fully generic impl -> returns None even tho | |
| // implemented for *some* lifetimes | |
| impl<'a> Trait for (&'a (), &'a ()) {} | |
| const _: () = { | |
| assert!(std::any::try_as_dyn::<_, dyn Trait>(&(&(), &())).is_none()); | |
| }; | |
| // Not fully generic impl -> returns None even tho | |
| // implemented for *some* lifetimes | |
| impl<'a, 'b: 'a> Trait for (&'a (), &'b (), ()) {} | |
| const _: () = { | |
| assert!(std::any::try_as_dyn::<_, dyn Trait>(&(&(), &(), ())).is_none()); | |
| }; | |
| // Only valid for 'static lifetimes -> returns None | |
| // even though we are actually using a `'static` lifetime. | |
| // We can't know what lifetimes are there during codegen, so | |
| // we pessimistically assume it could be a shorter one | |
| impl Trait for &'static u32 {} | |
| const _: () = { | |
| assert!(std::any::try_as_dyn::<_, dyn Trait>(&&42_u32).is_none()); | |
| }; | |
| trait Trait2 {} | |
| struct Struct<T>(T); | |
| // While this is the impl for `Trait`, in `Reflection` solver mode | |
| // we reject the impl for `Trait2` below, and thus this impl also | |
| // doesn't match. | |
| impl<T: Trait2> Trait for Struct<T> {} | |
| impl Trait2 for &'static u32 {} | |
| const _: () = { | |
| assert!(std::any::try_as_dyn::<_, dyn Trait>(&Struct(&42_u32)).is_none()); | |
| }; | |
| const _: () = { | |
| trait Homo {} | |
| impl<T> Homo for (T, T) {} | |
| // Let's pick `T = &'_ i32`. | |
| assert!(std::any::try_as_dyn::<_, dyn Homo>(&(&42_i32, &27_i32)).is_none()); | |
| }; | |
| trait Trait3<'a> {} | |
| impl Trait3<'static> for () {} | |
| const _: () = { | |
| assert!(std::any::try_as_dyn::<_, dyn Trait3<'_>>(&()).is_none()); | |
| }; | |
| fn main() {} |