| // Check that or-patterns with consistent bindings across arms are allowed. | 
 |  | 
 | //@ edition:2018 | 
 |  | 
 | //@ check-pass | 
 |  | 
 | fn main() { | 
 |     // One level: | 
 |     let (Ok(a) | Err(a)) = Ok(0); | 
 |     let (Ok(ref a) | Err(ref a)) = Ok(0); | 
 |     let (Ok(ref mut a) | Err(ref mut a)) = Ok(0); | 
 |  | 
 |     // Two levels: | 
 |     enum Tri<S, T, U> { | 
 |         V1(S), | 
 |         V2(T), | 
 |         V3(U), | 
 |     } | 
 |     use Tri::*; | 
 |  | 
 |     let (Ok((V1(a) | V2(a) | V3(a), b)) | Err(Ok((a, b)) | Err((a, b)))): Result<_, Result<_, _>> = | 
 |         Ok((V1(1), 1)); | 
 |  | 
 |     let (Ok((V1(a) | V2(a) | V3(a), ref b)) | Err(Ok((a, ref b)) | Err((a, ref b)))): Result< | 
 |         _, | 
 |         Result<_, _>, | 
 |     > = Ok((V1(1), 1)); | 
 |  | 
 |     // Three levels: | 
 |     let ( | 
 |         a, | 
 |         Err((ref mut b, ref c, d)) | 
 |         | Ok(( | 
 |             Ok(V1((ref c, d)) | V2((d, ref c)) | V3((ref c, Ok((_, d)) | Err((d, _))))) | 
 |             | Err((ref c, d)), | 
 |             ref mut b, | 
 |         )), | 
 |     ): (_, Result<_, _>) = (1, Ok((Ok(V3((1, Ok::<_, (i32, i32)>((1, 1))))), 1))); | 
 | } |