diff options
Diffstat (limited to 'tests/ui/self/dyn-dispatch-requires-supertrait-norm.rs')
| -rw-r--r-- | tests/ui/self/dyn-dispatch-requires-supertrait-norm.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/ui/self/dyn-dispatch-requires-supertrait-norm.rs b/tests/ui/self/dyn-dispatch-requires-supertrait-norm.rs new file mode 100644 index 00000000000..55c070eb036 --- /dev/null +++ b/tests/ui/self/dyn-dispatch-requires-supertrait-norm.rs @@ -0,0 +1,38 @@ +//@ check-pass + +#![feature(derive_coerce_pointee)] +#![feature(arbitrary_self_types)] + +use std::ops::Deref; +use std::marker::CoercePointee; +use std::sync::Arc; + +trait MyTrait<T> {} + +#[derive(CoercePointee)] +#[repr(transparent)] +struct MyArc<T: ?Sized + MyTrait<u8>>(Arc<T>); + +impl<T: ?Sized + MyTrait<u8>> Deref for MyArc<T> { + type Target = T; + fn deref(&self) -> &T { + &self.0 + } +} + +trait Mirror { + type Assoc; +} +impl<T> Mirror for T { + type Assoc = T; +} + +// This is variant on "tests/ui/self/dyn-dispatch-requires-supertrait.rs" but with +// a supertrait that requires normalization to match the pred in the old solver. +trait MyOtherTrait: MyTrait<<u8 as Mirror>::Assoc> { + fn foo(self: MyArc<Self>); +} + +fn test(_: MyArc<dyn MyOtherTrait>) {} + +fn main() {} |
