diff options
Diffstat (limited to 'tests/ui/specialization/issue-44861.rs')
-rw-r--r-- | tests/ui/specialization/issue-44861.rs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/tests/ui/specialization/issue-44861.rs b/tests/ui/specialization/issue-44861.rs new file mode 100644 index 000000000..79d9b9490 --- /dev/null +++ b/tests/ui/specialization/issue-44861.rs @@ -0,0 +1,40 @@ +#![crate_type = "lib"] +#![feature(specialization)] +#![feature(unsize, coerce_unsized)] +#![allow(incomplete_features)] + +use std::ops::CoerceUnsized; + +pub struct SmartassPtr<A: Smartass+?Sized>(A::Data); + +pub trait Smartass { + type Data; + type Data2: CoerceUnsized<*const [u8]>; +} + +pub trait MaybeObjectSafe {} + +impl MaybeObjectSafe for () {} + +impl<T> Smartass for T { + type Data = <Self as Smartass>::Data2; + default type Data2 = (); + //~^ ERROR: the trait bound `(): CoerceUnsized<*const [u8]>` is not satisfied +} + +impl Smartass for () { + type Data2 = *const [u8; 1]; +} + +impl Smartass for dyn MaybeObjectSafe { + type Data = *const [u8]; + type Data2 = *const [u8; 0]; +} + +impl<U: Smartass+?Sized, T: Smartass+?Sized> CoerceUnsized<SmartassPtr<T>> for SmartassPtr<U> + where <U as Smartass>::Data: std::ops::CoerceUnsized<<T as Smartass>::Data> +{} + +pub fn conv(s: SmartassPtr<()>) -> SmartassPtr<dyn MaybeObjectSafe> { + s +} |