mirror of
				https://git.proxmox.com/git/rustc
				synced 2025-11-04 00:38:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			50 lines
		
	
	
		
			941 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			941 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
//check-pass
 | 
						|
 | 
						|
use higher_kinded_types::*;
 | 
						|
mod higher_kinded_types {
 | 
						|
    pub(crate) trait HKT {
 | 
						|
        type Of<'lt>;
 | 
						|
    }
 | 
						|
 | 
						|
    pub(crate) trait WithLifetime<'lt> {
 | 
						|
        type T;
 | 
						|
    }
 | 
						|
 | 
						|
    impl<T: ?Sized + for<'any> WithLifetime<'any>> HKT for T {
 | 
						|
        type Of<'lt> = <T as WithLifetime<'lt>>::T;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
trait Trait {
 | 
						|
    type Gat<'lt>;
 | 
						|
}
 | 
						|
 | 
						|
impl Trait for () {
 | 
						|
    type Gat<'lt> = ();
 | 
						|
}
 | 
						|
 | 
						|
/// Same as `Trait`, but using HKTs rather than GATs
 | 
						|
trait HTrait {
 | 
						|
    type Hat: ?Sized + HKT;
 | 
						|
}
 | 
						|
 | 
						|
impl<T: Trait> HTrait for T {
 | 
						|
    type Hat = dyn for<'lt> WithLifetime<'lt, T = T::Gat<'lt>>;
 | 
						|
}
 | 
						|
 | 
						|
impl<Hat: ?Sized + HKT> Trait for Box<dyn '_ + HTrait<Hat = Hat>> {
 | 
						|
    type Gat<'lt> = Hat::Of<'lt>;
 | 
						|
}
 | 
						|
 | 
						|
fn existential() -> impl for<'a> Trait<Gat<'a> = ()> {}
 | 
						|
 | 
						|
fn dyn_hoops<T: Trait>(
 | 
						|
    _: T,
 | 
						|
) -> Box<dyn HTrait<Hat = dyn for<'a> WithLifetime<'a, T = T::Gat<'a>>>> {
 | 
						|
    loop {}
 | 
						|
}
 | 
						|
 | 
						|
fn main() {
 | 
						|
    let _ = || -> _ { dyn_hoops(existential()) };
 | 
						|
}
 |