diff options
| author | bors <bors@rust-lang.org> | 2013-12-16 01:16:29 -0800 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-12-16 01:16:29 -0800 |
| commit | e7b0e0adbbb9f41f79592822ffe1e5834222a96b (patch) | |
| tree | c45f89350c6f25141be7d6b3bf595e65493c03ff | |
| parent | dc7a2e12223c297695d12ce6e428c44075ed080e (diff) | |
| parent | fb4a1d88f580a138cae7530313b6d5a05c5ff5bd (diff) | |
| download | rust-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.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/visit.rs | 4 | ||||
| -rw-r--r-- | src/test/compile-fail/lint-dead-code-1.rs | 8 |
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 } |
