From 6f7b4ce65a286aa2a99d6028ce4b08889907a0c5 Mon Sep 17 00:00:00 2001 From: Seo Sanghyeon Date: Mon, 22 Jun 2015 21:36:14 +0900 Subject: [PATCH] Do not consider fields matched by wildcard patterns to be used --- src/librustc/middle/dead.rs | 3 +++ src/test/compile-fail/lint-dead-code-4.rs | 10 ++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/librustc/middle/dead.rs b/src/librustc/middle/dead.rs index e618aa5a5b75d..fd810429c86e0 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 529113ace4ef9..8e37dd805d56d 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 }; }