about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2019-08-05 19:23:46 -0700
committerEsteban Küber <esteban@kuber.com.ar>2019-08-21 16:12:55 -0700
commit053afa7aec67d0bc8dc23e8217d77846ca9fc3ec (patch)
tree533abd69f8c3b72b7a92974033ea0a0edcc61f7d /src
parent7b0085a613e69cb69fc9e4eb5d422fa4a39d5de1 (diff)
downloadrust-053afa7aec67d0bc8dc23e8217d77846ca9fc3ec.tar.gz
rust-053afa7aec67d0bc8dc23e8217d77846ca9fc3ec.zip
Do not complain about unused code when used in `impl` `Self` type
Diffstat (limited to 'src')
-rw-r--r--src/librustc/middle/dead.rs26
-rw-r--r--src/test/ui/derive-uninhabited-enum-38885.rs11
-rw-r--r--src/test/ui/derive-uninhabited-enum-38885.stderr14
-rw-r--r--src/test/ui/lint/lint-dead-code-const-and-self.rs35
4 files changed, 66 insertions, 20 deletions
diff --git a/src/librustc/middle/dead.rs b/src/librustc/middle/dead.rs
index 8ce8bb52566..d4805a7c783 100644
--- a/src/librustc/middle/dead.rs
+++ b/src/librustc/middle/dead.rs
@@ -30,10 +30,11 @@ fn should_explore(tcx: TyCtxt<'_>, hir_id: hir::HirId) -> bool {
         Some(Node::Item(..)) |
         Some(Node::ImplItem(..)) |
         Some(Node::ForeignItem(..)) |
-        Some(Node::TraitItem(..)) =>
-            true,
-        _ =>
-            false
+        Some(Node::TraitItem(..)) |
+        Some(Node::Variant(..)) |
+        Some(Node::AnonConst(..)) |
+        Some(Node::Pat(..)) => true,
+        _ => false
     }
 }
 
@@ -75,7 +76,7 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
                 self.check_def_id(res.def_id());
             }
             _ if self.in_pat => {},
-            Res::PrimTy(..) | Res::SelfTy(..) | Res::SelfCtor(..) |
+            Res::PrimTy(..) | Res::SelfCtor(..) |
             Res::Local(..) => {}
             Res::Def(DefKind::Ctor(CtorOf::Variant, ..), ctor_def_id) => {
                 let variant_id = self.tcx.parent(ctor_def_id).unwrap();
@@ -92,6 +93,14 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
                     self.check_def_id(variant_id);
                 }
             }
+            Res::SelfTy(t, i) => {
+                if let Some(t) = t {
+                    self.check_def_id(t);
+                }
+                if let Some(i) = i {
+                    self.check_def_id(i);
+                }
+            }
             Res::ToolMod | Res::NonMacroAttr(..) | Res::Err => {}
             _ => {
                 self.check_def_id(res.def_id());
@@ -271,7 +280,7 @@ impl<'a, 'tcx> Visitor<'tcx> for MarkSymbolVisitor<'a, 'tcx> {
                 let res = self.tables.qpath_res(path, pat.hir_id);
                 self.handle_field_pattern_match(pat, res, fields);
             }
-            PatKind::Path(ref qpath @ hir::QPath::TypeRelative(..)) => {
+            PatKind::Path(ref qpath) => {
                 let res = self.tables.qpath_res(qpath, pat.hir_id);
                 self.handle_res(res);
             }
@@ -298,6 +307,11 @@ impl<'a, 'tcx> Visitor<'tcx> for MarkSymbolVisitor<'a, 'tcx> {
         }
         intravisit::walk_ty(self, ty);
     }
+
+    fn visit_anon_const(&mut self, c: &'tcx hir::AnonConst) {
+        self.live_symbols.insert(c.hir_id);
+        intravisit::walk_anon_const(self, c);
+    }
 }
 
 fn has_allow_dead_code_or_lang_attr(
diff --git a/src/test/ui/derive-uninhabited-enum-38885.rs b/src/test/ui/derive-uninhabited-enum-38885.rs
index 2c4d64e4e60..010464adf5b 100644
--- a/src/test/ui/derive-uninhabited-enum-38885.rs
+++ b/src/test/ui/derive-uninhabited-enum-38885.rs
@@ -5,12 +5,15 @@
 // when deriving Debug on an empty enum
 
 #[derive(Debug)]
-enum Void {} //~ WARN never used
+enum Void {}
 
 #[derive(Debug)]
-enum Foo { //~ WARN never used
+enum Foo {
     Bar(u8),
-    Void(Void),
+    Void(Void), //~ WARN never used
 }
 
-fn main() {}
+fn main() {
+    let x = Foo::Bar(42);
+    println!("{:?}", x);
+}
diff --git a/src/test/ui/derive-uninhabited-enum-38885.stderr b/src/test/ui/derive-uninhabited-enum-38885.stderr
index 941c98b5506..a3ed6798a70 100644
--- a/src/test/ui/derive-uninhabited-enum-38885.stderr
+++ b/src/test/ui/derive-uninhabited-enum-38885.stderr
@@ -1,14 +1,8 @@
-warning: enum is never used: `Void`
-  --> $DIR/derive-uninhabited-enum-38885.rs:8:1
+warning: variant is never constructed: `Void`
+  --> $DIR/derive-uninhabited-enum-38885.rs:13:5
    |
-LL | enum Void {}
-   | ^^^^^^^^^
+LL |     Void(Void),
+   |     ^^^^^^^^^^
    |
    = note: `-W dead-code` implied by `-W unused`
 
-warning: enum is never used: `Foo`
-  --> $DIR/derive-uninhabited-enum-38885.rs:11:1
-   |
-LL | enum Foo {
-   | ^^^^^^^^
-
diff --git a/src/test/ui/lint/lint-dead-code-const-and-self.rs b/src/test/ui/lint/lint-dead-code-const-and-self.rs
new file mode 100644
index 00000000000..1a7b3f43cda
--- /dev/null
+++ b/src/test/ui/lint/lint-dead-code-const-and-self.rs
@@ -0,0 +1,35 @@
+// check-pass
+
+#![deny(dead_code)]
+
+const TLC: usize = 4;
+
+trait Tr { fn doit(&self); }
+
+impl Tr for [usize; TLC] {
+    fn doit(&self) {
+        println!("called 4");
+    }
+}
+
+struct X;
+struct Y;
+struct Z;
+
+trait Foo<T> {
+    type Ty;
+    fn foo() -> Self::Ty;
+}
+
+impl Foo<Y> for X {
+    type Ty = Z;
+    fn foo() -> Self::Ty {
+        unimplemented!()
+    }
+}
+
+fn main() {
+    let s = [0,1,2,3];
+    s.doit();
+    X::foo();
+}