From c18afcd83a810db6921841a30aa874f98fe18f12 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Fri, 18 Oct 2013 22:43:16 -0700 Subject: [PATCH] Check unnecessary visibility for struct variants --- src/librustc/middle/privacy.rs | 32 +++++++++++-------- .../compile-fail/struct-variant-privacy.rs | 20 ++++++++++++ 2 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 src/test/compile-fail/struct-variant-privacy.rs 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 @@ fn check_sane_privacy(&self, item: @ast::item) { } } }; + 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 @@ fn check_sane_privacy(&self, item: @ast::item) { } 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 or the MIT license +// , 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() {}