mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-11-03 22:49:17 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
// run-pass
 | 
						|
// Regression test for #31849: the problem here was actually a performance
 | 
						|
// cliff, but I'm adding the test for reference.
 | 
						|
 | 
						|
pub trait Upcast<T> {
 | 
						|
    fn upcast(self) -> T;
 | 
						|
}
 | 
						|
 | 
						|
impl<S1, S2, T1, T2> Upcast<(T1, T2)> for (S1,S2)
 | 
						|
    where S1: Upcast<T1>,
 | 
						|
          S2: Upcast<T2>,
 | 
						|
{
 | 
						|
    fn upcast(self) -> (T1, T2) { (self.0.upcast(), self.1.upcast()) }
 | 
						|
}
 | 
						|
 | 
						|
impl Upcast<()> for ()
 | 
						|
{
 | 
						|
    fn upcast(self) -> () { () }
 | 
						|
}
 | 
						|
 | 
						|
pub trait ToStatic {
 | 
						|
    type Static: 'static;
 | 
						|
    fn to_static(self) -> Self::Static where Self: Sized;
 | 
						|
}
 | 
						|
 | 
						|
impl<T, U> ToStatic for (T, U)
 | 
						|
    where T: ToStatic,
 | 
						|
          U: ToStatic
 | 
						|
{
 | 
						|
    type Static = (T::Static, U::Static);
 | 
						|
    fn to_static(self) -> Self::Static { (self.0.to_static(), self.1.to_static()) }
 | 
						|
}
 | 
						|
 | 
						|
impl ToStatic for ()
 | 
						|
{
 | 
						|
    type Static = ();
 | 
						|
    fn to_static(self) -> () { () }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
trait Factory {
 | 
						|
    type Output;
 | 
						|
    fn build(&self) -> Self::Output;
 | 
						|
}
 | 
						|
 | 
						|
impl<S,T> Factory for (S, T)
 | 
						|
    where S: Factory,
 | 
						|
          T: Factory,
 | 
						|
          S::Output: ToStatic,
 | 
						|
          <S::Output as ToStatic>::Static: Upcast<S::Output>,
 | 
						|
{
 | 
						|
    type Output = (S::Output, T::Output);
 | 
						|
    fn build(&self) -> Self::Output { (self.0.build().to_static().upcast(), self.1.build()) }
 | 
						|
}
 | 
						|
 | 
						|
impl Factory for () {
 | 
						|
    type Output = ();
 | 
						|
    fn build(&self) -> Self::Output { () }
 | 
						|
}
 | 
						|
 | 
						|
fn main() {
 | 
						|
    // More parens, more time.
 | 
						|
    let it = ((((((((((),()),()),()),()),()),()),()),()),());
 | 
						|
    it.build();
 | 
						|
}
 |