39 lines
857 B
Rust
39 lines
857 B
Rust
//@ known-bug: rust-lang/rust#126944
|
|
// Step 1: Create two names for a single type: `Thing` and `AlsoThing`
|
|
|
|
struct Thing;
|
|
struct Dummy;
|
|
pub trait DummyTrait {
|
|
type DummyType;
|
|
}
|
|
impl DummyTrait for Dummy {
|
|
type DummyType = Thing;
|
|
}
|
|
type AlsoThing = <Dummy as DummyTrait>::DummyType;
|
|
|
|
// Step 2: Create names for a single trait object type: `TraitObject` and `AlsoTraitObject`
|
|
|
|
pub trait SomeTrait {
|
|
type Item;
|
|
}
|
|
type TraitObject = dyn SomeTrait<Item = AlsoThing>;
|
|
type AlsoTraitObject = dyn SomeTrait<Item = Thing>;
|
|
|
|
// Step 3: Force the compiler to check whether the two names are the same type
|
|
|
|
pub trait Supertrait {
|
|
type Foo;
|
|
}
|
|
pub trait Subtrait: Supertrait<Foo = TraitObject> {}
|
|
|
|
pub trait HasOutput<A: ?Sized> {
|
|
type Output;
|
|
}
|
|
|
|
fn foo<F>() -> F::Output
|
|
where
|
|
F: HasOutput<dyn Subtrait<Foo = AlsoTraitObject>>,
|
|
{
|
|
todo!()
|
|
}
|