--- /dev/null
+//check-pass
+#![feature(capture_disjoint_fields)]
+//~^ WARNING: the feature `capture_disjoint_fields` is incomplete
+#![warn(unused)]
+#![feature(rustc_attrs)]
+
+#[derive(Debug, Clone, Copy)]
+enum PointType {
+ TwoD { x: u32, y: u32 },
+
+ ThreeD{ x: u32, y: u32, z: u32 }
+}
+
+// Testing struct patterns
+struct Points {
+ points: Vec<PointType>,
+}
+
+impl Points {
+ pub fn test1(&mut self) -> Vec<usize> {
+ (0..self.points.len())
+ .filter_map(|i| {
+ let idx = i as usize;
+ match self.test2(idx) {
+ PointType::TwoD { .. } => Some(i),
+ PointType::ThreeD { .. } => None,
+ }
+ })
+ .collect()
+ }
+
+ pub fn test2(&mut self, i: usize) -> PointType {
+ self.points[i]
+ }
+}
+
+fn main() {
+ let mut points = Points {
+ points: Vec::<PointType>::new()
+ };
+
+ points.points.push(PointType::ThreeD { x:0, y:0, z:0 });
+ points.points.push(PointType::TwoD{ x:0, y:0 });
+ points.points.push(PointType::ThreeD{ x:0, y:0, z:0 });
+ points.points.push(PointType::TwoD{ x:0, y:0 });
+
+ println!("{:?}", points.test1());
+ println!("{:?}", points.points);
+}