summaryrefslogtreecommitdiffstats
path: root/src/test/ui/specialization/issue-44861.rs
blob: 79d9b9490d09d80d4cfccb3b4c1b37f3c9bb98b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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
}