51 lines
921 B
Rust
51 lines
921 B
Rust
|
// Taken directly from that issue.
|
||
|
//
|
||
|
// This test detected that we didn't correctly resolve
|
||
|
// inference variables when computing implied bounds.
|
||
|
//
|
||
|
// check-pass
|
||
|
pub trait BuilderFn<'a> {
|
||
|
type Output;
|
||
|
}
|
||
|
|
||
|
impl<'a, F, Out> BuilderFn<'a> for F
|
||
|
where
|
||
|
F: FnOnce(&'a mut ()) -> Out,
|
||
|
{
|
||
|
type Output = Out;
|
||
|
}
|
||
|
|
||
|
pub trait ConstructionFirm {
|
||
|
type Builder: for<'a> BuilderFn<'a>;
|
||
|
}
|
||
|
|
||
|
pub trait Campus<T>
|
||
|
where
|
||
|
T: ConstructionFirm,
|
||
|
{
|
||
|
fn add_building(
|
||
|
&mut self,
|
||
|
building: &mut <<T as ConstructionFirm>::Builder as BuilderFn<'_>>::Output,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
struct ArchitectsInc {}
|
||
|
|
||
|
impl ConstructionFirm for ArchitectsInc {
|
||
|
type Builder = fn(&mut ()) -> PrettyCondo<'_>;
|
||
|
}
|
||
|
|
||
|
struct PrettyCondo<'a> {
|
||
|
_marker: &'a mut (),
|
||
|
}
|
||
|
|
||
|
struct CondoEstate {}
|
||
|
|
||
|
impl Campus<ArchitectsInc> for CondoEstate {
|
||
|
fn add_building(&mut self, _building: &mut PrettyCondo<'_>) {
|
||
|
todo!()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn main() {}
|