resolve: Use field spans for reporting the private constructor error

This commit is contained in:
Vadim Petrochenkov 2019-10-09 17:37:48 +03:00 committed by Dan Aloni
parent 5d8af38329
commit 48f8beddd8
5 changed files with 204 additions and 107 deletions

View file

@ -30,7 +30,7 @@ use rustc::hir::def::{self, DefKind, PartialRes, CtorKind, CtorOf, NonMacroAttrK
use rustc::hir::def::Namespace::*;
use rustc::hir::def_id::{CRATE_DEF_INDEX, LOCAL_CRATE, DefId};
use rustc::hir::{TraitMap, GlobMap};
use rustc::ty;
use rustc::ty::{self, DefIdTree};
use rustc::util::nodemap::{NodeMap, NodeSet, FxHashMap, FxHashSet, DefIdMap};
use rustc::span_bug;
@ -1006,7 +1006,7 @@ impl<'a> AsMut<Resolver<'a>> for Resolver<'a> {
fn as_mut(&mut self) -> &mut Resolver<'a> { self }
}
impl<'a, 'b> ty::DefIdTree for &'a Resolver<'b> {
impl<'a, 'b> DefIdTree for &'a Resolver<'b> {
fn parent(self, id: DefId) -> Option<DefId> {
match id.krate {
LOCAL_CRATE => self.definitions.def_key(id.index).parent,
@ -2391,23 +2391,17 @@ impl<'a> Resolver<'a> {
binding.res().descr(),
ident.name,
);
// FIXME: use the ctor's `def_id` to check wether any of the fields is not visible
match binding.kind {
NameBindingKind::Res(Res::Def(DefKind::Ctor(
CtorOf::Struct,
CtorKind::Fn,
), _def_id), _) => {
err.note("a tuple struct constructor is private if any of its fields \
is private");
if let NameBindingKind::Res(
Res::Def(DefKind::Ctor(CtorOf::Struct, CtorKind::Fn), ctor_def_id), _
) = binding.kind {
let def_id = (&*self).parent(ctor_def_id).expect("no parent for a constructor");
if let Some(fields) = self.field_names.get(&def_id) {
let first_field = fields.first().expect("empty field list in the map");
err.span_label(
fields.iter().fold(first_field.span, |acc, field| acc.to(field.span)),
"a tuple struct constructor is private if any of its fields is private",
);
}
NameBindingKind::Res(Res::Def(DefKind::Ctor(
CtorOf::Variant,
CtorKind::Fn,
), _def_id), _) => {
err.note("a tuple variant constructor is private if any of its fields \
is private");
}
_ => {}
}
err.emit();
}

View file

@ -1,386 +1,482 @@
error[E0603]: tuple struct `A` is private
--> $DIR/privacy5.rs:51:16
|
LL | pub struct A(());
| -- a tuple struct constructor is private if any of its fields is private
...
LL | let a = a::A(());
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:52:16
|
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
...
LL | let b = a::B(2);
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:53:16
|
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
...
LL | let c = a::C(2, 3);
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `A` is private
--> $DIR/privacy5.rs:56:12
|
LL | pub struct A(());
| -- a tuple struct constructor is private if any of its fields is private
...
LL | let a::A(()) = a;
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `A` is private
--> $DIR/privacy5.rs:57:12
|
LL | pub struct A(());
| -- a tuple struct constructor is private if any of its fields is private
...
LL | let a::A(_) = a;
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `A` is private
--> $DIR/privacy5.rs:58:18
|
LL | pub struct A(());
| -- a tuple struct constructor is private if any of its fields is private
...
LL | match a { a::A(()) => {} }
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `A` is private
--> $DIR/privacy5.rs:59:18
|
LL | pub struct A(());
| -- a tuple struct constructor is private if any of its fields is private
...
LL | match a { a::A(_) => {} }
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:61:12
|
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
...
LL | let a::B(_) = b;
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:62:12
|
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
...
LL | let a::B(_b) = b;
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:63:18
|
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
...
LL | match b { a::B(_) => {} }
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:64:18
|
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
...
LL | match b { a::B(_b) => {} }
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:65:18
|
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
...
LL | match b { a::B(1) => {} a::B(_) => {} }
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:65:32
|
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
...
LL | match b { a::B(1) => {} a::B(_) => {} }
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:68:12
|
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
...
LL | let a::C(_, _) = c;
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:69:12
|
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
...
LL | let a::C(_a, _) = c;
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:70:12
|
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
...
LL | let a::C(_, _b) = c;
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:71:12
|
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
...
LL | let a::C(_a, _b) = c;
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:72:18
|
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
...
LL | match c { a::C(_, _) => {} }
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:73:18
|
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
...
LL | match c { a::C(_a, _) => {} }
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:74:18
|
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
...
LL | match c { a::C(_, _b) => {} }
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:75:18
|
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
...
LL | match c { a::C(_a, _b) => {} }
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `A` is private
--> $DIR/privacy5.rs:83:17
|
LL | pub struct A(());
| -- a tuple struct constructor is private if any of its fields is private
...
LL | let a2 = a::A;
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:84:17
|
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
...
LL | let b2 = a::B;
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:85:17
|
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
...
LL | let c2 = a::C;
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `A` is private
--> $DIR/privacy5.rs:90:20
|
LL | let a = other::A(());
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:1:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct A(());
| -- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:91:20
|
LL | let b = other::B(2);
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:92:20
|
LL | let c = other::C(2, 3);
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `A` is private
--> $DIR/privacy5.rs:95:16
|
LL | let other::A(()) = a;
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:1:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct A(());
| -- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `A` is private
--> $DIR/privacy5.rs:96:16
|
LL | let other::A(_) = a;
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:1:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct A(());
| -- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `A` is private
--> $DIR/privacy5.rs:97:22
|
LL | match a { other::A(()) => {} }
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:1:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct A(());
| -- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `A` is private
--> $DIR/privacy5.rs:98:22
|
LL | match a { other::A(_) => {} }
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:1:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct A(());
| -- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:100:16
|
LL | let other::B(_) = b;
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:101:16
|
LL | let other::B(_b) = b;
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:102:22
|
LL | match b { other::B(_) => {} }
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:103:22
|
LL | match b { other::B(_b) => {} }
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:104:22
|
LL | match b { other::B(1) => {} other::B(_) => {} }
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:104:40
|
LL | match b { other::B(1) => {} other::B(_) => {} }
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:107:16
|
LL | let other::C(_, _) = c;
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:108:16
|
LL | let other::C(_a, _) = c;
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:109:16
|
LL | let other::C(_, _b) = c;
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:110:16
|
LL | let other::C(_a, _b) = c;
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:111:22
|
LL | match c { other::C(_, _) => {} }
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:112:22
|
LL | match c { other::C(_a, _) => {} }
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:113:22
|
LL | match c { other::C(_, _b) => {} }
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:114:22
|
LL | match c { other::C(_a, _b) => {} }
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `A` is private
--> $DIR/privacy5.rs:122:21
|
LL | let a2 = other::A;
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:1:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct A(());
| -- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `B` is private
--> $DIR/privacy5.rs:123:21
|
LL | let b2 = other::B;
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct B(isize);
| ----- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `C` is private
--> $DIR/privacy5.rs:124:21
|
LL | let c2 = other::C;
| ^
|
::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct C(pub isize, isize);
| ---------------- a tuple struct constructor is private if any of its fields is private
error: aborting due to 48 previous errors

View file

@ -37,50 +37,60 @@ LL | use m::S;
error[E0603]: tuple struct `Z` is private
--> $DIR/privacy-struct-ctor.rs:18:12
|
LL | pub(in m) struct Z(pub(in m::n) u8);
| --------------- a tuple struct constructor is private if any of its fields is private
...
LL | n::Z;
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `S` is private
--> $DIR/privacy-struct-ctor.rs:29:8
|
LL | pub struct S(u8);
| -- a tuple struct constructor is private if any of its fields is private
...
LL | m::S;
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `S` is private
--> $DIR/privacy-struct-ctor.rs:31:19
|
LL | pub struct S(u8);
| -- a tuple struct constructor is private if any of its fields is private
...
LL | let _: S = m::S(2);
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `Z` is private
--> $DIR/privacy-struct-ctor.rs:35:11
|
LL | pub(in m) struct Z(pub(in m::n) u8);
| --------------- a tuple struct constructor is private if any of its fields is private
...
LL | m::n::Z;
| ^
|
= note: a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `S` is private
--> $DIR/privacy-struct-ctor.rs:41:16
|
LL | xcrate::m::S;
| ^
|
::: $DIR/auxiliary/privacy-struct-ctor.rs:2:18
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct S(u8);
| -- a tuple struct constructor is private if any of its fields is private
error[E0603]: tuple struct `Z` is private
--> $DIR/privacy-struct-ctor.rs:45:19
|
LL | xcrate::m::n::Z;
| ^
|
::: $DIR/auxiliary/privacy-struct-ctor.rs:5:28
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub(in m) struct Z(pub(in m::n) u8);
| --------------- a tuple struct constructor is private if any of its fields is private
error: aborting due to 10 previous errors

View file

@ -15,8 +15,11 @@ error[E0603]: tuple struct `TupleStruct` is private
|
LL | let ts_explicit = structs::TupleStruct(640, 480);
| ^^^^^^^^^^^
|
::: $DIR/auxiliary/structs.rs:13:24
|
= note: a tuple struct constructor is private if any of its fields is private
LL | pub struct TupleStruct(pub u16, pub u16);
| ---------------- a tuple struct constructor is private if any of its fields is private
error[E0603]: unit struct `UnitStruct` is private
--> $DIR/struct.rs:32:32

View file

@ -3,8 +3,6 @@ error[E0603]: tuple variant `Tuple` is private
|
LL | let variant_tuple = NonExhaustiveVariants::Tuple(640);
| ^^^^^
|
= note: a tuple variant constructor is private if any of its fields is private
error[E0603]: unit variant `Unit` is private
--> $DIR/variant.rs:14:47
@ -23,16 +21,12 @@ error[E0603]: tuple variant `Tuple` is private
|
LL | NonExhaustiveVariants::Tuple(fe_tpl) => "",
| ^^^^^
|
= note: a tuple variant constructor is private if any of its fields is private
error[E0603]: tuple variant `Tuple` is private
--> $DIR/variant.rs:26:35
|
LL | if let NonExhaustiveVariants::Tuple(fe_tpl) = variant_struct {
| ^^^^^
|
= note: a tuple variant constructor is private if any of its fields is private
error[E0639]: cannot create non-exhaustive variant using struct expression
--> $DIR/variant.rs:8:26