]> git.lizzy.rs Git - rust.git/blob - src/test/ui/pattern/bindings-after-at/borrowck-pat-by-copy-bindings-in-at.rs
enhance borrowck-pat-by-copy-bindings-in-at
[rust.git] / src / test / ui / pattern / bindings-after-at / borrowck-pat-by-copy-bindings-in-at.rs
1 // check-pass
2
3 // Test `Copy` bindings in the rhs of `@` patterns.
4
5 #![feature(slice_patterns)]
6 #![feature(bindings_after_at)]
7 //~^ WARN the feature `bindings_after_at` is incomplete and may cause the compiler to crash
8
9 #[derive(Copy, Clone)]
10 struct C;
11
12 fn mk_c() -> C { C }
13
14 #[derive(Copy, Clone)]
15 struct P<A, B>(A, B);
16
17 enum E<A, B> { L(A), R(B) }
18
19 fn main() {
20     let a @ b @ c @ d = C;
21     let a @ (b, c) = (C, mk_c());
22     let a @ P(b, P(c, d)) = P(mk_c(), P(C, C));
23     let a @ [b, c] = [C, C];
24     let a @ [b, .., c] = [C, mk_c(), C];
25     let a @ [b, mid @ .., c] = [C, mk_c(), C];
26     let a @ &(b, c) = &(C, C);
27     let a @ &(b, &P(c, d)) = &(mk_c(), &P(C, C));
28
29     fn foo(a @ [b, mid @ .., c]: [C; 3]) {}
30
31     use self::E::*;
32     match L(C) {
33         L(a) | R(a) => {
34             let a: C = a;
35             drop(a);
36             drop(a);
37         }
38     }
39     match R(&L(&mk_c())) {
40         L(L(&a)) | L(R(&a)) | R(L(&a)) | R(R(&a)) => {
41             let a: C = a;
42             drop(a);
43             drop(a);
44         }
45     }
46
47     match Ok(mk_c()) {
48         Ok(ref a @ b) | Err(b @ ref a) => {
49             let _: &C = a;
50             let _: C = b;
51         }
52     }
53 }