Skip to content

Commit df48216

Browse files
committed
Permit pub items in blocks
1 parent f59fd46 commit df48216

File tree

3 files changed

+20
-121
lines changed

3 files changed

+20
-121
lines changed

src/librustc_privacy/lib.rs

+2-62
Original file line numberDiff line numberDiff line change
@@ -1129,35 +1129,12 @@ impl<'a, 'tcx, 'v> Visitor<'v> for PrivacyVisitor<'a, 'tcx> {
11291129

11301130
struct SanePrivacyVisitor<'a, 'tcx: 'a> {
11311131
tcx: &'a ty::ctxt<'tcx>,
1132-
in_block: bool,
11331132
}
11341133

11351134
impl<'a, 'tcx, 'v> Visitor<'v> for SanePrivacyVisitor<'a, 'tcx> {
1136-
/// We want to visit items in the context of their containing
1137-
/// module and so forth, so supply a crate for doing a deep walk.
1138-
fn visit_nested_item(&mut self, item: hir::ItemId) {
1139-
self.visit_item(self.tcx.map.expect_item(item.id))
1140-
}
1141-
11421135
fn visit_item(&mut self, item: &hir::Item) {
11431136
self.check_sane_privacy(item);
1144-
if self.in_block {
1145-
self.check_all_inherited(item);
1146-
}
1147-
1148-
let orig_in_block = self.in_block;
1149-
1150-
// Modules turn privacy back on, otherwise we inherit
1151-
self.in_block = if let hir::ItemMod(..) = item.node { false } else { orig_in_block };
1152-
11531137
intravisit::walk_item(self, item);
1154-
self.in_block = orig_in_block;
1155-
}
1156-
1157-
fn visit_block(&mut self, b: &'v hir::Block) {
1158-
let orig_in_block = replace(&mut self.in_block, true);
1159-
intravisit::walk_block(self, b);
1160-
self.in_block = orig_in_block;
11611138
}
11621139
}
11631140

@@ -1206,40 +1183,6 @@ impl<'a, 'tcx> SanePrivacyVisitor<'a, 'tcx> {
12061183
hir::ItemUse(..) | hir::ItemTy(..) => {}
12071184
}
12081185
}
1209-
1210-
/// When inside of something like a function or a method, visibility has no
1211-
/// control over anything so this forbids any mention of any visibility
1212-
fn check_all_inherited(&self, item: &hir::Item) {
1213-
let check_inherited = |sp, vis| {
1214-
if vis != hir::Inherited {
1215-
span_err!(self.tcx.sess, sp, E0447,
1216-
"visibility has no effect inside functions or block expressions");
1217-
}
1218-
};
1219-
1220-
check_inherited(item.span, item.vis);
1221-
match item.node {
1222-
hir::ItemImpl(_, _, _, _, _, ref impl_items) => {
1223-
for impl_item in impl_items {
1224-
check_inherited(impl_item.span, impl_item.vis);
1225-
}
1226-
}
1227-
hir::ItemForeignMod(ref fm) => {
1228-
for fi in &fm.items {
1229-
check_inherited(fi.span, fi.vis);
1230-
}
1231-
}
1232-
hir::ItemStruct(ref vdata, _) => {
1233-
for f in vdata.fields() {
1234-
check_inherited(f.span, f.node.kind.visibility());
1235-
}
1236-
}
1237-
hir::ItemDefaultImpl(..) | hir::ItemEnum(..) | hir::ItemTrait(..) |
1238-
hir::ItemConst(..) | hir::ItemStatic(..) | hir::ItemFn(..) |
1239-
hir::ItemMod(..) | hir::ItemExternCrate(..) |
1240-
hir::ItemUse(..) | hir::ItemTy(..) => {}
1241-
}
1242-
}
12431186
}
12441187

12451188
///////////////////////////////////////////////////////////////////////////////
@@ -1823,11 +1766,8 @@ pub fn check_crate(tcx: &ty::ctxt,
18231766

18241767
// Sanity check to make sure that all privacy usage and controls are
18251768
// reasonable.
1826-
let mut visitor = SanePrivacyVisitor {
1827-
tcx: tcx,
1828-
in_block: false,
1829-
};
1830-
intravisit::walk_crate(&mut visitor, krate);
1769+
let mut visitor = SanePrivacyVisitor { tcx: tcx };
1770+
krate.visit_all_items(&mut visitor);
18311771

18321772
// Figure out who everyone's parent is
18331773
let mut visitor = ParentVisitor {

src/test/compile-fail/privacy-sanity.rs

+18-32
Original file line numberDiff line numberDiff line change
@@ -40,74 +40,60 @@ pub extern "C" { //~ ERROR unnecessary visibility qualifier
4040

4141
const MAIN: u8 = {
4242
trait MarkerTr {}
43-
pub trait Tr { //~ ERROR visibility has no effect inside functions or block
43+
pub trait Tr {
4444
fn f();
4545
const C: u8;
4646
type T;
4747
}
48-
pub struct S { //~ ERROR visibility has no effect inside functions or block
49-
pub a: u8 //~ ERROR visibility has no effect inside functions or block
48+
pub struct S {
49+
pub a: u8
5050
}
51-
struct Ts(pub u8); //~ ERROR visibility has no effect inside functions or block
51+
struct Ts(pub u8);
5252

5353
pub impl MarkerTr for .. {} //~ ERROR unnecessary visibility qualifier
54-
//~^ ERROR visibility has no effect inside functions or block
5554
pub impl Tr for S { //~ ERROR unnecessary visibility qualifier
56-
//~^ ERROR visibility has no effect inside functions or block
5755
pub fn f() {} //~ ERROR unnecessary visibility qualifier
58-
//~^ ERROR visibility has no effect inside functions or block
5956
pub const C: u8 = 0; //~ ERROR unnecessary visibility qualifier
60-
//~^ ERROR visibility has no effect inside functions or block
6157
pub type T = u8; //~ ERROR unnecessary visibility qualifier
62-
//~^ ERROR visibility has no effect inside functions or block
6358
}
6459
pub impl S { //~ ERROR unnecessary visibility qualifier
65-
//~^ ERROR visibility has no effect inside functions or block
66-
pub fn f() {} //~ ERROR visibility has no effect inside functions or block
67-
pub const C: u8 = 0; //~ ERROR visibility has no effect inside functions or block
68-
// pub type T = u8; // ERROR visibility has no effect inside functions or block
60+
pub fn f() {}
61+
pub const C: u8 = 0;
62+
// pub type T = u8;
6963
}
7064
pub extern "C" { //~ ERROR unnecessary visibility qualifier
71-
//~^ ERROR visibility has no effect inside functions or block
72-
pub fn f(); //~ ERROR visibility has no effect inside functions or block
73-
pub static St: u8; //~ ERROR visibility has no effect inside functions or block
65+
pub fn f();
66+
pub static St: u8;
7467
}
7568

7669
0
7770
};
7871

7972
fn main() {
8073
trait MarkerTr {}
81-
pub trait Tr { //~ ERROR visibility has no effect inside functions or block
74+
pub trait Tr {
8275
fn f();
8376
const C: u8;
8477
type T;
8578
}
86-
pub struct S { //~ ERROR visibility has no effect inside functions or block
87-
pub a: u8 //~ ERROR visibility has no effect inside functions or block
79+
pub struct S {
80+
pub a: u8
8881
}
89-
struct Ts(pub u8); //~ ERROR visibility has no effect inside functions or block
82+
struct Ts(pub u8);
9083

9184
pub impl MarkerTr for .. {} //~ ERROR unnecessary visibility qualifier
92-
//~^ ERROR visibility has no effect inside functions or block
9385
pub impl Tr for S { //~ ERROR unnecessary visibility qualifier
94-
//~^ ERROR visibility has no effect inside functions or block
9586
pub fn f() {} //~ ERROR unnecessary visibility qualifier
96-
//~^ ERROR visibility has no effect inside functions or block
9787
pub const C: u8 = 0; //~ ERROR unnecessary visibility qualifier
98-
//~^ ERROR visibility has no effect inside functions or block
9988
pub type T = u8; //~ ERROR unnecessary visibility qualifier
100-
//~^ ERROR visibility has no effect inside functions or block
10189
}
10290
pub impl S { //~ ERROR unnecessary visibility qualifier
103-
//~^ ERROR visibility has no effect inside functions or block
104-
pub fn f() {} //~ ERROR visibility has no effect inside functions or block
105-
pub const C: u8 = 0; //~ ERROR visibility has no effect inside functions or block
106-
// pub type T = u8; // ERROR visibility has no effect inside functions or block
91+
pub fn f() {}
92+
pub const C: u8 = 0;
93+
// pub type T = u8;
10794
}
10895
pub extern "C" { //~ ERROR unnecessary visibility qualifier
109-
//~^ ERROR visibility has no effect inside functions or block
110-
pub fn f(); //~ ERROR visibility has no effect inside functions or block
111-
pub static St: u8; //~ ERROR visibility has no effect inside functions or block
96+
pub fn f();
97+
pub static St: u8;
11298
}
11399
}

src/test/compile-fail/unnecessary-private.rs

-27
This file was deleted.

0 commit comments

Comments
 (0)