about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-12-16 01:16:29 -0800
committerbors <bors@rust-lang.org>2013-12-16 01:16:29 -0800
commite7b0e0adbbb9f41f79592822ffe1e5834222a96b (patch)
treec45f89350c6f25141be7d6b3bf595e65493c03ff
parentdc7a2e12223c297695d12ce6e428c44075ed080e (diff)
parentfb4a1d88f580a138cae7530313b6d5a05c5ff5bd (diff)
downloadrust-e7b0e0adbbb9f41f79592822ffe1e5834222a96b.tar.gz
rust-e7b0e0adbbb9f41f79592822ffe1e5834222a96b.zip
auto merge of #10994 : ktt3ja/rust/issue-10956, r=alexcrichton
Types used inside live struct or enum are now marked live.

Fix #10956 and #10993.

-rw-r--r--src/librustc/middle/dead.rs2
-rw-r--r--src/libsyntax/visit.rs4
-rw-r--r--src/test/compile-fail/lint-dead-code-1.rs8
3 files changed, 14 insertions, 0 deletions
diff --git a/src/librustc/middle/dead.rs b/src/librustc/middle/dead.rs
index 9007e4bd90a..1b127057714 100644
--- a/src/librustc/middle/dead.rs
+++ b/src/librustc/middle/dead.rs
@@ -107,6 +107,8 @@ impl MarkSymbolVisitor {
                 match item.node {
                     ast::item_fn(..)
                     | ast::item_ty(..)
+                    | ast::item_enum(..)
+                    | ast::item_struct(..)
                     | ast::item_static(..) => {
                         visit::walk_item(self, item, ());
                     }
diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs
index 5d36109e454..5e5c12391d6 100644
--- a/src/libsyntax/visit.rs
+++ b/src/libsyntax/visit.rs
@@ -290,6 +290,10 @@ pub fn walk_variant<E:Clone, V:Visitor<E>>(visitor:&mut V,
                                      env.clone())
         }
     }
+    match variant.node.disr_expr {
+        Some(expr) => visitor.visit_expr(expr, env),
+        None => ()
+    }
 }
 
 pub fn skip_ty<E, V:Visitor<E>>(_: &mut V, _: &Ty, _: E) {
diff --git a/src/test/compile-fail/lint-dead-code-1.rs b/src/test/compile-fail/lint-dead-code-1.rs
index 6086484772a..cedc25eb150 100644
--- a/src/test/compile-fail/lint-dead-code-1.rs
+++ b/src/test/compile-fail/lint-dead-code-1.rs
@@ -27,6 +27,7 @@ static priv_static: int = 0; //~ ERROR: code is never used
 static used_static: int = 0;
 pub static used_static2: int = used_static;
 static USED_STATIC: int = 0;
+static STATIC_USED_IN_ENUM_DISCRIMINANT: uint = 10;
 
 pub type typ = ~UsedStruct4;
 pub struct PubStruct();
@@ -41,8 +42,15 @@ struct SemiUsedStruct;
 impl SemiUsedStruct {
     fn la_la_la() {}
 }
+struct StructUsedAsField;
+struct StructUsedInEnum;
+pub struct PubStruct2 {
+    struct_used_as_field: *StructUsedAsField
+}
 
 pub enum pub_enum { foo1, bar1 }
+pub enum pub_enum2 { a(~StructUsedInEnum) }
+pub enum pub_enum3 { Foo = STATIC_USED_IN_ENUM_DISCRIMINANT }
 enum priv_enum { foo2, bar2 } //~ ERROR: code is never used
 enum used_enum { foo3, bar3 }