about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSteven Fackler <sfackler@gmail.com>2013-10-18 22:43:16 -0700
committerSteven Fackler <sfackler@gmail.com>2013-10-18 22:44:11 -0700
commitc18afcd83a810db6921841a30aa874f98fe18f12 (patch)
treeab216684286e625efd254bfdd3a812c611249b96
parent3a7337ff17fda6480f55a0613c68b75c14b475ca (diff)
downloadrust-c18afcd83a810db6921841a30aa874f98fe18f12.tar.gz
rust-c18afcd83a810db6921841a30aa874f98fe18f12.zip
Check unnecessary visibility for struct variants
-rw-r--r--src/librustc/middle/privacy.rs32
-rw-r--r--src/test/compile-fail/struct-variant-privacy.rs20
2 files changed, 39 insertions, 13 deletions
diff --git a/src/librustc/middle/privacy.rs b/src/librustc/middle/privacy.rs
index b8c432c3f26..c502dac7db0 100644
--- a/src/librustc/middle/privacy.rs
+++ b/src/librustc/middle/privacy.rs
@@ -563,6 +563,20 @@ impl<'self> PrivacyVisitor<'self> {
                 }
             }
         };
+        let check_struct = |def: &@ast::struct_def| {
+            for f in def.fields.iter() {
+               match f.node.kind {
+                    ast::named_field(_, ast::public) => {
+                        tcx.sess.span_err(f.span, "unnecessary `pub` \
+                                                   visibility");
+                    }
+                    ast::named_field(_, ast::private) => {
+                        // Fields should really be private by default...
+                    }
+                    ast::named_field(*) | ast::unnamed_field => {}
+                }
+            }
+        };
         match item.node {
             // implementations of traits don't need visibility qualifiers because
             // that's controlled by having the trait in scope.
@@ -610,24 +624,16 @@ impl<'self> PrivacyVisitor<'self> {
                         }
                         ast::inherited => {}
                     }
-                }
-            }
 
-            ast::item_struct(ref def, _) => {
-                for f in def.fields.iter() {
-                   match f.node.kind {
-                        ast::named_field(_, ast::public) => {
-                            tcx.sess.span_err(f.span, "unnecessary `pub` \
-                                                       visibility");
-                        }
-                        ast::named_field(_, ast::private) => {
-                            // Fields should really be private by default...
-                        }
-                        ast::named_field(*) | ast::unnamed_field => {}
+                    match v.node.kind {
+                        ast::struct_variant_kind(ref s) => check_struct(s),
+                        ast::tuple_variant_kind(*) => {}
                     }
                 }
             }
 
+            ast::item_struct(ref def, _) => check_struct(def),
+
             ast::item_trait(_, _, ref methods) => {
                 for m in methods.iter() {
                     match *m {
diff --git a/src/test/compile-fail/struct-variant-privacy.rs b/src/test/compile-fail/struct-variant-privacy.rs
new file mode 100644
index 00000000000..f37e02be12c
--- /dev/null
+++ b/src/test/compile-fail/struct-variant-privacy.rs
@@ -0,0 +1,20 @@
+// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+#[feature(struct_variant)];
+
+pub enum Foo {
+    Bar {
+        pub x: int, //~ ERROR unnecessary `pub` visibility
+        y: int,
+        priv z: int
+    }
+}
+
+fn main() {}