summaryrefslogtreecommitdiffstats
path: root/src/test/ui/or-patterns/consistent-bindings.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/or-patterns/consistent-bindings.rs')
-rw-r--r--src/test/ui/or-patterns/consistent-bindings.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/test/ui/or-patterns/consistent-bindings.rs b/src/test/ui/or-patterns/consistent-bindings.rs
new file mode 100644
index 000000000..ecae1d8a2
--- /dev/null
+++ b/src/test/ui/or-patterns/consistent-bindings.rs
@@ -0,0 +1,39 @@
+// 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)));
+}