about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSeo Sanghyeon <sanxiyn@gmail.com>2015-06-22 21:36:14 +0900
committerSeo Sanghyeon <sanxiyn@gmail.com>2015-06-22 21:36:14 +0900
commit6f7b4ce65a286aa2a99d6028ce4b08889907a0c5 (patch)
tree43b1e6269ff848adaa1a1be8df84ea0b670c5aa6
parent2287b4b628cb6f4d66578e1298cd9f34e9ef77db (diff)
downloadrust-6f7b4ce65a286aa2a99d6028ce4b08889907a0c5.tar.gz
rust-6f7b4ce65a286aa2a99d6028ce4b08889907a0c5.zip
Do not consider fields matched by wildcard patterns to be used
-rw-r--r--src/librustc/middle/dead.rs3
-rw-r--r--src/test/compile-fail/lint-dead-code-4.rs10
2 files changed, 9 insertions, 4 deletions
diff --git a/src/librustc/middle/dead.rs b/src/librustc/middle/dead.rs
index e618aa5a5b7..fd810429c86 100644
--- a/src/librustc/middle/dead.rs
+++ b/src/librustc/middle/dead.rs
@@ -172,6 +172,9 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
         };
         let fields = ty::lookup_struct_fields(self.tcx, id);
         for pat in pats {
+            if let ast::PatWild(ast::PatWildSingle) = pat.node.pat.node {
+                continue;
+            }
             let field_id = fields.iter()
                 .find(|field| field.name == pat.node.ident.name).unwrap().id;
             self.live_symbols.insert(field_id.node);
diff --git a/src/test/compile-fail/lint-dead-code-4.rs b/src/test/compile-fail/lint-dead-code-4.rs
index 529113ace4e..8e37dd805d5 100644
--- a/src/test/compile-fail/lint-dead-code-4.rs
+++ b/src/test/compile-fail/lint-dead-code-4.rs
@@ -25,14 +25,15 @@ enum XYZ {
     X, //~ ERROR variant is never used
     Y { //~ ERROR variant is never used
         a: String,
-        b: isize //~ ERROR: struct field is never used
+        b: i32, //~ ERROR: struct field is never used
+        c: i32, //~ ERROR: struct field is never used
     },
     Z
 }
 
 fn field_match_in_patterns(b: XYZ) -> String {
     match b {
-        XYZ::Y { a, .. } => a,
+        XYZ::Y { a, b: _, .. } => a,
         _ => "".to_string()
     }
 }
@@ -40,6 +41,7 @@ fn field_match_in_patterns(b: XYZ) -> String {
 struct Bar {
     x: usize, //~ ERROR: struct field is never used
     b: bool,
+    c: bool, //~ ERROR: struct field is never used
     _guard: ()
 }
 
@@ -49,13 +51,13 @@ struct Baz {
 }
 
 fn field_match_in_let(f: Bar) -> bool {
-    let Bar { b, .. } = f;
+    let Bar { b, c: _, .. } = f;
     b
 }
 
 fn main() {
     field_read(Foo { x: 1, b: false });
     field_match_in_patterns(XYZ::Z);
-    field_match_in_let(Bar { x: 42, b: true, _guard: () });
+    field_match_in_let(Bar { x: 42, b: true, c: false, _guard: () });
     let _ = Baz { x: 0 };
 }