diff options
Diffstat (limited to 'src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs')
-rw-r--r-- | src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs | 179 |
1 files changed, 0 insertions, 179 deletions
diff --git a/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs b/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs deleted file mode 100644 index 9e53ff079..000000000 --- a/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs +++ /dev/null @@ -1,179 +0,0 @@ -#![feature(arbitrary_self_types, coerce_unsized, dispatch_from_dyn, unsize)] -#![feature(unsized_locals, unsized_fn_params)] -//~^ WARN the feature `unsized_locals` is incomplete - -// This tests a few edge-cases around `arbitrary_self_types`. Most specifically, -// it checks that the `ObjectCandidate` you get from method matching can't -// match a trait with the same DefId as a supertrait but a bad type parameter. - -use std::marker::PhantomData; - -mod internal { - use std::ops::{CoerceUnsized, Deref, DispatchFromDyn}; - use std::marker::{PhantomData, Unsize}; - - pub struct Smaht<T: ?Sized, MISC>(pub Box<T>, pub PhantomData<MISC>); - - impl<T: ?Sized, MISC> Deref for Smaht<T, MISC> { - type Target = T; - - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl<T: ?Sized + Unsize<U>, U: ?Sized, MISC> CoerceUnsized<Smaht<U, MISC>> - for Smaht<T, MISC> - {} - impl<T: ?Sized + Unsize<U>, U: ?Sized, MISC> DispatchFromDyn<Smaht<U, MISC>> - for Smaht<T, MISC> - {} - - pub trait Foo: X<u32> {} - pub trait X<T> { - fn foo(self: Smaht<Self, T>) -> T; - } - - impl X<u32> for () { - fn foo(self: Smaht<Self, u32>) -> u32 { - 0 - } - } - - pub trait Marker {} - impl Marker for dyn Foo {} - impl<T: Marker + ?Sized> X<u64> for T { - fn foo(self: Smaht<Self, u64>) -> u64 { - 1 - } - } - - impl Deref for dyn Foo { - type Target = (); - fn deref(&self) -> &() { &() } - } - - impl Foo for () {} -} - -pub trait FinalFoo { - fn foo(&self) -> u8; -} - -impl FinalFoo for () { - fn foo(&self) -> u8 { 0 } -} - -mod nuisance_foo { - pub trait NuisanceFoo { - fn foo(self); - } - - impl<T: ?Sized> NuisanceFoo for T { - fn foo(self) {} - } -} - - -fn objectcandidate_impl() { - let x: internal::Smaht<(), u32> = internal::Smaht(Box::new(()), PhantomData); - let x: internal::Smaht<dyn internal::Foo, u32> = x; - - // This picks `<dyn internal::Foo as X<u32>>::foo` via `ObjectCandidate`. - // - // The `TraitCandidate` is not relevant because `X` is not in scope. - let z = x.foo(); - - // Observe the type of `z` is `u32` - let _seetype: () = z; //~ ERROR mismatched types - //~| expected `()`, found `u32` -} - -fn traitcandidate_impl() { - use internal::X; - - let x: internal::Smaht<(), u64> = internal::Smaht(Box::new(()), PhantomData); - let x: internal::Smaht<dyn internal::Foo, u64> = x; - - // This picks `<dyn internal::Foo as X<u64>>::foo` via `TraitCandidate`. - // - // The `ObjectCandidate` does not apply, as it only applies to - // `X<u32>` (and not `X<u64>`). - let z = x.foo(); - - // Observe the type of `z` is `u64` - let _seetype: () = z; //~ ERROR mismatched types - //~| expected `()`, found `u64` -} - -fn traitcandidate_impl_with_nuisance() { - use internal::X; - use nuisance_foo::NuisanceFoo; - - let x: internal::Smaht<(), u64> = internal::Smaht(Box::new(()), PhantomData); - let x: internal::Smaht<dyn internal::Foo, u64> = x; - - // This picks `<dyn internal::Foo as X<u64>>::foo` via `TraitCandidate`. - // - // The `ObjectCandidate` does not apply, as it only applies to - // `X<u32>` (and not `X<u64>`). - // - // The NuisanceFoo impl has the same priority as the `X` impl, - // so we get a conflict. - let z = x.foo(); //~ ERROR multiple applicable items in scope -} - - -fn neither_impl() { - let x: internal::Smaht<(), u64> = internal::Smaht(Box::new(()), PhantomData); - let x: internal::Smaht<dyn internal::Foo, u64> = x; - - // This can't pick the `TraitCandidate` impl, because `Foo` is not - // imported. However, this also can't pick the `ObjectCandidate` - // impl, because it only applies to `X<u32>` (and not `X<u64>`). - // - // Therefore, neither of the candidates is applicable, and we pick - // the `FinalFoo` impl after another deref, which will return `u8`. - let z = x.foo(); - - // Observe the type of `z` is `u8` - let _seetype: () = z; //~ ERROR mismatched types - //~| expected `()`, found `u8` -} - -fn both_impls() { - use internal::X; - - let x: internal::Smaht<(), u32> = internal::Smaht(Box::new(()), PhantomData); - let x: internal::Smaht<dyn internal::Foo, u32> = x; - - // This can pick both the `TraitCandidate` and the `ObjectCandidate` impl. - // - // However, the `ObjectCandidate` is considered an "inherent candidate", - // and therefore has priority over both the `TraitCandidate` as well as - // any other "nuisance" candidate" (if present). - let z = x.foo(); - - // Observe the type of `z` is `u32` - let _seetype: () = z; //~ ERROR mismatched types - //~| expected `()`, found `u32` -} - - -fn both_impls_with_nuisance() { - // Similar to the `both_impls` example, except with a nuisance impl to - // make sure the `ObjectCandidate` indeed has a higher priority. - - use internal::X; - use nuisance_foo::NuisanceFoo; - - let x: internal::Smaht<(), u32> = internal::Smaht(Box::new(()), PhantomData); - let x: internal::Smaht<dyn internal::Foo, u32> = x; - let z = x.foo(); - - // Observe the type of `z` is `u32` - let _seetype: () = z; //~ ERROR mismatched types - //~| expected `()`, found `u32` -} - -fn main() { -} |