82 lines
1.6 KiB
Rust
82 lines
1.6 KiB
Rust
//@ run-pass
|
|
#![allow(unused)]
|
|
|
|
// Test copy
|
|
|
|
struct A {
|
|
a: i32,
|
|
b: i32,
|
|
}
|
|
struct B {
|
|
a: i32,
|
|
b: C,
|
|
}
|
|
struct D {
|
|
a: i32,
|
|
d: C,
|
|
}
|
|
#[derive(Copy, Clone)]
|
|
struct C {
|
|
c: i32,
|
|
}
|
|
enum E {
|
|
E { a: i32, e: C },
|
|
NotE,
|
|
}
|
|
|
|
#[rustfmt::skip]
|
|
pub fn main() {
|
|
match (A {a: 10, b: 20}) {
|
|
x@A {a, b: 20} => { assert!(x.a == 10); assert!(a == 10); }
|
|
A {b: _b, ..} => { panic!(); }
|
|
}
|
|
|
|
let mut x@B {b, ..} = B {a: 10, b: C {c: 20}};
|
|
assert_eq!(x.a, 10);
|
|
x.b.c = 30;
|
|
assert_eq!(b.c, 20);
|
|
let mut y@D {d, ..} = D {a: 10, d: C {c: 20}};
|
|
assert_eq!(y.a, 10);
|
|
y.d.c = 30;
|
|
assert_eq!(d.c, 20);
|
|
|
|
match (E::E { a: 10, e: C { c: 20 } }) {
|
|
x @ E::E{ a, e: C { c } } => {
|
|
assert!(matches!(x, E::E { a: 10, e: C { c: 20 } }));
|
|
assert!(a == 10);
|
|
assert!(c == 20);
|
|
}
|
|
_ => panic!(),
|
|
}
|
|
match (E::E { a: 10, e: C { c: 20 } }) {
|
|
mut x @ E::E{ a, e: C { mut c } } => {
|
|
x = E::NotE;
|
|
c += 30;
|
|
assert_eq!(c, 50);
|
|
}
|
|
_ => panic!(),
|
|
}
|
|
|
|
let some_b = Some(B { a: 10, b: C { c: 20 } });
|
|
|
|
// in irrefutable pattern
|
|
if let Some(x @ B { b, .. }) = some_b {
|
|
assert_eq!(x.b.c, 20);
|
|
assert_eq!(b.c, 20);
|
|
} else {
|
|
unreachable!();
|
|
}
|
|
|
|
let some_b = Some(B { a: 10, b: C { c: 20 } });
|
|
|
|
if let Some(x @ B { b: mut b @ C { c }, .. }) = some_b {
|
|
assert_eq!(x.b.c, 20);
|
|
assert_eq!(b.c, 20);
|
|
b.c = 30;
|
|
assert_eq!(b.c, 30);
|
|
assert_eq!(c, 20);
|
|
} else {
|
|
unreachable!();
|
|
}
|
|
}
|