Skip to content

Commit bb868f1

Browse files
committed
Auto merge of #32071 - jseyfried:parse_pub, r=nikomatsakis
Make errors for unnecessary visibility qualifiers consistent This PR refactors away `syntax::parse::parser::ParsePub` so that unnecessary visibility qualifiers on variant fields are reported not by the parser but by `privacy::SanePrivacyVisitor` (thanks to @petrochenkov's drive-by improvements in #31919). r? @nikomatsakis
2 parents e1704f7 + 498059b commit bb868f1

File tree

3 files changed

+17
-53
lines changed

3 files changed

+17
-53
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 10 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,6 @@ pub enum BoundParsingMode {
9999
Modified,
100100
}
101101

102-
/// `pub` should be parsed in struct fields and not parsed in variant fields
103-
#[derive(Clone, Copy, PartialEq)]
104-
pub enum ParsePub {
105-
Yes,
106-
No,
107-
}
108-
109102
#[derive(Clone, Copy, PartialEq)]
110103
pub enum SemiColonMode {
111104
Break,
@@ -5111,20 +5104,17 @@ impl<'a> Parser<'a> {
51115104
VariantData::Unit(ast::DUMMY_NODE_ID)
51125105
} else {
51135106
// If we see: `struct Foo<T> where T: Copy { ... }`
5114-
VariantData::Struct(try!(self.parse_record_struct_body(ParsePub::Yes)),
5115-
ast::DUMMY_NODE_ID)
5107+
VariantData::Struct(try!(self.parse_record_struct_body()), ast::DUMMY_NODE_ID)
51165108
}
51175109
// No `where` so: `struct Foo<T>;`
51185110
} else if self.eat(&token::Semi) {
51195111
VariantData::Unit(ast::DUMMY_NODE_ID)
51205112
// Record-style struct definition
51215113
} else if self.token == token::OpenDelim(token::Brace) {
5122-
VariantData::Struct(try!(self.parse_record_struct_body(ParsePub::Yes)),
5123-
ast::DUMMY_NODE_ID)
5114+
VariantData::Struct(try!(self.parse_record_struct_body()), ast::DUMMY_NODE_ID)
51245115
// Tuple-style struct definition with optional where-clause.
51255116
} else if self.token == token::OpenDelim(token::Paren) {
5126-
let body = VariantData::Tuple(try!(self.parse_tuple_struct_body(ParsePub::Yes)),
5127-
ast::DUMMY_NODE_ID);
5117+
let body = VariantData::Tuple(try!(self.parse_tuple_struct_body()), ast::DUMMY_NODE_ID);
51285118
generics.where_clause = try!(self.parse_where_clause());
51295119
try!(self.expect(&token::Semi));
51305120
body
@@ -5137,13 +5127,11 @@ impl<'a> Parser<'a> {
51375127
Ok((class_name, ItemKind::Struct(vdata, generics), None))
51385128
}
51395129

5140-
pub fn parse_record_struct_body(&mut self,
5141-
parse_pub: ParsePub)
5142-
-> PResult<'a, Vec<StructField>> {
5130+
pub fn parse_record_struct_body(&mut self) -> PResult<'a, Vec<StructField>> {
51435131
let mut fields = Vec::new();
51445132
if self.eat(&token::OpenDelim(token::Brace)) {
51455133
while self.token != token::CloseDelim(token::Brace) {
5146-
fields.push(try!(self.parse_struct_decl_field(parse_pub)));
5134+
fields.push(try!(self.parse_struct_decl_field()));
51475135
}
51485136

51495137
self.bump();
@@ -5157,9 +5145,7 @@ impl<'a> Parser<'a> {
51575145
Ok(fields)
51585146
}
51595147

5160-
pub fn parse_tuple_struct_body(&mut self,
5161-
parse_pub: ParsePub)
5162-
-> PResult<'a, Vec<StructField>> {
5148+
pub fn parse_tuple_struct_body(&mut self) -> PResult<'a, Vec<StructField>> {
51635149
// This is the case where we find `struct Foo<T>(T) where T: Copy;`
51645150
// Unit like structs are handled in parse_item_struct function
51655151
let fields = try!(self.parse_unspanned_seq(
@@ -5170,13 +5156,7 @@ impl<'a> Parser<'a> {
51705156
let attrs = try!(p.parse_outer_attributes());
51715157
let lo = p.span.lo;
51725158
let struct_field_ = ast::StructField_ {
5173-
kind: UnnamedField (
5174-
if parse_pub == ParsePub::Yes {
5175-
try!(p.parse_visibility())
5176-
} else {
5177-
Visibility::Inherited
5178-
}
5179-
),
5159+
kind: UnnamedField(try!(p.parse_visibility())),
51805160
id: ast::DUMMY_NODE_ID,
51815161
ty: try!(p.parse_ty_sum()),
51825162
attrs: attrs,
@@ -5211,15 +5191,11 @@ impl<'a> Parser<'a> {
52115191
}
52125192

52135193
/// Parse an element of a struct definition
5214-
fn parse_struct_decl_field(&mut self, parse_pub: ParsePub) -> PResult<'a, StructField> {
5194+
fn parse_struct_decl_field(&mut self) -> PResult<'a, StructField> {
52155195

52165196
let attrs = try!(self.parse_outer_attributes());
52175197

52185198
if self.eat_keyword(keywords::Pub) {
5219-
if parse_pub == ParsePub::No {
5220-
let span = self.last_span;
5221-
self.span_err(span, "`pub` is not allowed here");
5222-
}
52235199
return self.parse_single_struct_field(Visibility::Public, attrs);
52245200
}
52255201

@@ -5585,11 +5561,11 @@ impl<'a> Parser<'a> {
55855561
if self.check(&token::OpenDelim(token::Brace)) {
55865562
// Parse a struct variant.
55875563
all_nullary = false;
5588-
struct_def = VariantData::Struct(try!(self.parse_record_struct_body(ParsePub::No)),
5564+
struct_def = VariantData::Struct(try!(self.parse_record_struct_body()),
55895565
ast::DUMMY_NODE_ID);
55905566
} else if self.check(&token::OpenDelim(token::Paren)) {
55915567
all_nullary = false;
5592-
struct_def = VariantData::Tuple(try!(self.parse_tuple_struct_body(ParsePub::No)),
5568+
struct_def = VariantData::Tuple(try!(self.parse_tuple_struct_body()),
55935569
ast::DUMMY_NODE_ID);
55945570
} else if self.eat(&token::Eq) {
55955571
disr_expr = Some(try!(self.parse_expr()));

src/test/compile-fail/useless-pub.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,11 @@ impl E for A {
1818
pub fn foo(&self) {} //~ ERROR: unnecessary visibility
1919
}
2020

21+
enum Foo {
22+
V1 { pub f: i32 }, //~ ERROR unnecessary visibility qualifier
23+
//| NOTE visibility qualifiers have no effect on variant fields
24+
V2(pub i32), //~ ERROR unnecessary visibility qualifier
25+
//| NOTE visibility qualifiers have no effect on variant fields
26+
}
27+
2128
fn main() {}

src/test/parse-fail/struct-variant-no-pub.rs

Lines changed: 0 additions & 19 deletions
This file was deleted.

0 commit comments

Comments
 (0)