Skip to content

Commit 9c758f3

Browse files
Rollup merge of rust-lang#36054 - mikhail-m1:master2, r=jonathandturner
update error E0451 to new format Fixes rust-lang#35928 as part of rust-lang#35233. r? @jonathandturner
2 parents 2535f69 + 46fc80c commit 9c758f3

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

src/librustc_privacy/lib.rs

+13-6
Original file line numberDiff line numberDiff line change
@@ -384,8 +384,10 @@ impl<'a, 'tcx> PrivacyVisitor<'a, 'tcx> {
384384
fn check_field(&mut self, span: Span, def: ty::AdtDef<'tcx>, field: ty::FieldDef<'tcx>) {
385385
if def.adt_kind() == ty::AdtKind::Struct &&
386386
!field.vis.is_accessible_from(self.curitem, &self.tcx.map) {
387-
span_err!(self.tcx.sess, span, E0451, "field `{}` of struct `{}` is private",
388-
field.name, self.tcx.item_path_str(def.did));
387+
struct_span_err!(self.tcx.sess, span, E0451, "field `{}` of struct `{}` is private",
388+
field.name, self.tcx.item_path_str(def.did))
389+
.span_label(span, &format!("field `{}` is private", field.name))
390+
.emit();
389391
}
390392
}
391393

@@ -425,14 +427,19 @@ impl<'a, 'tcx, 'v> Visitor<'v> for PrivacyVisitor<'a, 'tcx> {
425427
let method = self.tcx.tables.borrow().method_map[&method_call];
426428
self.check_method(expr.span, method.def_id);
427429
}
428-
hir::ExprStruct(..) => {
430+
hir::ExprStruct(_, ref fields, _) => {
429431
let adt = self.tcx.expr_ty(expr).ty_adt_def().unwrap();
430432
let variant = adt.variant_of_def(self.tcx.expect_def(expr.id));
431433
// RFC 736: ensure all unmentioned fields are visible.
432434
// Rather than computing the set of unmentioned fields
433435
// (i.e. `all_fields - fields`), just check them all.
434-
for field in &variant.fields {
435-
self.check_field(expr.span, adt, field);
436+
for field in variant.fields.iter() {
437+
let span = if let Some(f) = fields.iter().find(|f| f.name.node == field.name) {
438+
f.span
439+
} else {
440+
expr.span
441+
};
442+
self.check_field(span, adt, field);
436443
}
437444
}
438445
hir::ExprPath(..) => {
@@ -491,7 +498,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for PrivacyVisitor<'a, 'tcx> {
491498
let adt = self.tcx.pat_ty(pattern).ty_adt_def().unwrap();
492499
let variant = adt.variant_of_def(self.tcx.expect_def(pattern.id));
493500
for field in fields {
494-
self.check_field(pattern.span, adt, variant.field_named(field.node.name));
501+
self.check_field(field.span, adt, variant.field_named(field.node.name));
495502
}
496503
}
497504
PatKind::TupleStruct(_, ref fields, ddpos) => {

src/test/compile-fail/E0451.rs

+16
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,24 @@ mod Bar {
1313
pub a: isize,
1414
b: isize,
1515
}
16+
17+
pub struct FooTuple (
18+
pub isize,
19+
isize,
20+
);
21+
}
22+
23+
fn pat_match(foo: Bar::Foo) {
24+
let Bar::Foo{a:a, b:b} = foo; //~ ERROR E0451
25+
//~^ NOTE field `b` is private
26+
}
27+
28+
fn pat_match_tuple(foo: Bar::FooTuple) {
29+
let Bar::FooTuple(a,b) = foo; //~ ERROR E0451
30+
//~^ NOTE field `1` is private
1631
}
1732

1833
fn main() {
1934
let f = Bar::Foo{ a: 0, b: 0 }; //~ ERROR E0451
35+
//~^ NOTE field `b` is private
2036
}

0 commit comments

Comments
 (0)