Make span a bit better
This commit is contained in:
parent
00d54c879b
commit
8ed2dc0bce
3 changed files with 32 additions and 41 deletions
|
@ -1608,11 +1608,15 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
||||||
struct_span_err!(self.tcx.sess, ident.span, E0603, "{} `{}` is private", descr, ident);
|
struct_span_err!(self.tcx.sess, ident.span, E0603, "{} `{}` is private", descr, ident);
|
||||||
err.span_label(ident.span, &format!("private {}", descr));
|
err.span_label(ident.span, &format!("private {}", descr));
|
||||||
|
|
||||||
|
let mut non_exhaustive = None;
|
||||||
|
// If an ADT is foreign and marked as `non_exhaustive`, then that's
|
||||||
|
// probably why we have the privacy error.
|
||||||
|
// Otherwise, point out if the struct has any private fields.
|
||||||
if let Some(def_id) = res.opt_def_id()
|
if let Some(def_id) = res.opt_def_id()
|
||||||
&& !def_id.is_local()
|
&& !def_id.is_local()
|
||||||
&& let Some(attr) = self.tcx.get_attr(def_id, sym::non_exhaustive)
|
&& let Some(attr) = self.tcx.get_attr(def_id, sym::non_exhaustive)
|
||||||
{
|
{
|
||||||
err.span_label(attr.span, format!("the {nonimport_descr} is `#[non_exhaustive]`"));
|
non_exhaustive = Some(attr.span);
|
||||||
} else if let Some(span) = ctor_fields_span {
|
} else if let Some(span) = ctor_fields_span {
|
||||||
err.span_label(span, "a constructor is private if any of the fields is private");
|
err.span_label(span, "a constructor is private if any of the fields is private");
|
||||||
if let Res::Def(_, d) = res && let Some(fields) = self.field_visibility_spans.get(&d) {
|
if let Res::Def(_, d) = res && let Some(fields) = self.field_visibility_spans.get(&d) {
|
||||||
|
@ -1662,6 +1666,14 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
||||||
if !first && binding.vis.is_public() {
|
if !first && binding.vis.is_public() {
|
||||||
note_span.push_span_label(def_span, "consider importing it directly");
|
note_span.push_span_label(def_span, "consider importing it directly");
|
||||||
}
|
}
|
||||||
|
// Final step in the import chain, point out if the ADT is `non_exhaustive`
|
||||||
|
// which is probably why this privacy violation occurred.
|
||||||
|
if next_binding.is_none() && let Some(span) = non_exhaustive {
|
||||||
|
note_span.push_span_label(
|
||||||
|
span,
|
||||||
|
format!("cannot be constructed because it is `#[non_exhaustive]`"),
|
||||||
|
);
|
||||||
|
}
|
||||||
err.span_note(note_span, &msg);
|
err.span_note(note_span, &msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,14 +10,11 @@ error[E0603]: tuple struct constructor `TupleStruct` is private
|
||||||
LL | let ts_explicit = structs::TupleStruct(640, 480);
|
LL | let ts_explicit = structs::TupleStruct(640, 480);
|
||||||
| ^^^^^^^^^^^ private tuple struct constructor
|
| ^^^^^^^^^^^ private tuple struct constructor
|
||||||
|
|
|
|
||||||
::: $DIR/auxiliary/structs.rs:11:1
|
|
||||||
|
|
|
||||||
LL | #[non_exhaustive]
|
|
||||||
| ----------------- the tuple struct constructor is `#[non_exhaustive]`
|
|
||||||
|
|
|
||||||
note: the tuple struct constructor `TupleStruct` is defined here
|
note: the tuple struct constructor `TupleStruct` is defined here
|
||||||
--> $DIR/auxiliary/structs.rs:12:1
|
--> $DIR/auxiliary/structs.rs:12:1
|
||||||
|
|
|
|
||||||
|
LL | #[non_exhaustive]
|
||||||
|
| ----------------- cannot be constructed because it is `#[non_exhaustive]`
|
||||||
LL | pub struct TupleStruct(pub u16, pub u16);
|
LL | pub struct TupleStruct(pub u16, pub u16);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
@ -27,14 +24,11 @@ error[E0603]: unit struct `UnitStruct` is private
|
||||||
LL | let us_explicit = structs::UnitStruct;
|
LL | let us_explicit = structs::UnitStruct;
|
||||||
| ^^^^^^^^^^ private unit struct
|
| ^^^^^^^^^^ private unit struct
|
||||||
|
|
|
|
||||||
::: $DIR/auxiliary/structs.rs:8:1
|
|
||||||
|
|
|
||||||
LL | #[non_exhaustive]
|
|
||||||
| ----------------- the unit struct is `#[non_exhaustive]`
|
|
||||||
|
|
|
||||||
note: the unit struct `UnitStruct` is defined here
|
note: the unit struct `UnitStruct` is defined here
|
||||||
--> $DIR/auxiliary/structs.rs:9:1
|
--> $DIR/auxiliary/structs.rs:9:1
|
||||||
|
|
|
|
||||||
|
LL | #[non_exhaustive]
|
||||||
|
| ----------------- cannot be constructed because it is `#[non_exhaustive]`
|
||||||
LL | pub struct UnitStruct;
|
LL | pub struct UnitStruct;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
|
|
@ -4,16 +4,13 @@ error[E0603]: tuple variant `Tuple` is private
|
||||||
LL | let variant_tuple = NonExhaustiveVariants::Tuple(640);
|
LL | let variant_tuple = NonExhaustiveVariants::Tuple(640);
|
||||||
| ^^^^^ private tuple variant
|
| ^^^^^ private tuple variant
|
||||||
|
|
|
|
||||||
::: $DIR/auxiliary/variants.rs:5:5
|
|
||||||
|
|
|
||||||
LL | #[non_exhaustive] Tuple(u32),
|
|
||||||
| ----------------- the tuple variant is `#[non_exhaustive]`
|
|
||||||
|
|
|
||||||
note: the tuple variant `Tuple` is defined here
|
note: the tuple variant `Tuple` is defined here
|
||||||
--> $DIR/auxiliary/variants.rs:5:23
|
--> $DIR/auxiliary/variants.rs:5:23
|
||||||
|
|
|
|
||||||
LL | #[non_exhaustive] Tuple(u32),
|
LL | #[non_exhaustive] Tuple(u32),
|
||||||
| ^^^^^
|
| ----------------- ^^^^^
|
||||||
|
| |
|
||||||
|
| cannot be constructed because it is `#[non_exhaustive]`
|
||||||
|
|
||||||
error[E0603]: unit variant `Unit` is private
|
error[E0603]: unit variant `Unit` is private
|
||||||
--> $DIR/variant.rs:14:47
|
--> $DIR/variant.rs:14:47
|
||||||
|
@ -21,16 +18,13 @@ error[E0603]: unit variant `Unit` is private
|
||||||
LL | let variant_unit = NonExhaustiveVariants::Unit;
|
LL | let variant_unit = NonExhaustiveVariants::Unit;
|
||||||
| ^^^^ private unit variant
|
| ^^^^ private unit variant
|
||||||
|
|
|
|
||||||
::: $DIR/auxiliary/variants.rs:4:5
|
|
||||||
|
|
|
||||||
LL | #[non_exhaustive] Unit,
|
|
||||||
| ----------------- the unit variant is `#[non_exhaustive]`
|
|
||||||
|
|
|
||||||
note: the unit variant `Unit` is defined here
|
note: the unit variant `Unit` is defined here
|
||||||
--> $DIR/auxiliary/variants.rs:4:23
|
--> $DIR/auxiliary/variants.rs:4:23
|
||||||
|
|
|
|
||||||
LL | #[non_exhaustive] Unit,
|
LL | #[non_exhaustive] Unit,
|
||||||
| ^^^^
|
| ----------------- ^^^^
|
||||||
|
| |
|
||||||
|
| cannot be constructed because it is `#[non_exhaustive]`
|
||||||
|
|
||||||
error[E0603]: unit variant `Unit` is private
|
error[E0603]: unit variant `Unit` is private
|
||||||
--> $DIR/variant.rs:18:32
|
--> $DIR/variant.rs:18:32
|
||||||
|
@ -38,16 +32,13 @@ error[E0603]: unit variant `Unit` is private
|
||||||
LL | NonExhaustiveVariants::Unit => "",
|
LL | NonExhaustiveVariants::Unit => "",
|
||||||
| ^^^^ private unit variant
|
| ^^^^ private unit variant
|
||||||
|
|
|
|
||||||
::: $DIR/auxiliary/variants.rs:4:5
|
|
||||||
|
|
|
||||||
LL | #[non_exhaustive] Unit,
|
|
||||||
| ----------------- the unit variant is `#[non_exhaustive]`
|
|
||||||
|
|
|
||||||
note: the unit variant `Unit` is defined here
|
note: the unit variant `Unit` is defined here
|
||||||
--> $DIR/auxiliary/variants.rs:4:23
|
--> $DIR/auxiliary/variants.rs:4:23
|
||||||
|
|
|
|
||||||
LL | #[non_exhaustive] Unit,
|
LL | #[non_exhaustive] Unit,
|
||||||
| ^^^^
|
| ----------------- ^^^^
|
||||||
|
| |
|
||||||
|
| cannot be constructed because it is `#[non_exhaustive]`
|
||||||
|
|
||||||
error[E0603]: tuple variant `Tuple` is private
|
error[E0603]: tuple variant `Tuple` is private
|
||||||
--> $DIR/variant.rs:20:32
|
--> $DIR/variant.rs:20:32
|
||||||
|
@ -55,16 +46,13 @@ error[E0603]: tuple variant `Tuple` is private
|
||||||
LL | NonExhaustiveVariants::Tuple(fe_tpl) => "",
|
LL | NonExhaustiveVariants::Tuple(fe_tpl) => "",
|
||||||
| ^^^^^ private tuple variant
|
| ^^^^^ private tuple variant
|
||||||
|
|
|
|
||||||
::: $DIR/auxiliary/variants.rs:5:5
|
|
||||||
|
|
|
||||||
LL | #[non_exhaustive] Tuple(u32),
|
|
||||||
| ----------------- the tuple variant is `#[non_exhaustive]`
|
|
||||||
|
|
|
||||||
note: the tuple variant `Tuple` is defined here
|
note: the tuple variant `Tuple` is defined here
|
||||||
--> $DIR/auxiliary/variants.rs:5:23
|
--> $DIR/auxiliary/variants.rs:5:23
|
||||||
|
|
|
|
||||||
LL | #[non_exhaustive] Tuple(u32),
|
LL | #[non_exhaustive] Tuple(u32),
|
||||||
| ^^^^^
|
| ----------------- ^^^^^
|
||||||
|
| |
|
||||||
|
| cannot be constructed because it is `#[non_exhaustive]`
|
||||||
|
|
||||||
error[E0603]: tuple variant `Tuple` is private
|
error[E0603]: tuple variant `Tuple` is private
|
||||||
--> $DIR/variant.rs:26:35
|
--> $DIR/variant.rs:26:35
|
||||||
|
@ -72,16 +60,13 @@ error[E0603]: tuple variant `Tuple` is private
|
||||||
LL | if let NonExhaustiveVariants::Tuple(fe_tpl) = variant_struct {
|
LL | if let NonExhaustiveVariants::Tuple(fe_tpl) = variant_struct {
|
||||||
| ^^^^^ private tuple variant
|
| ^^^^^ private tuple variant
|
||||||
|
|
|
|
||||||
::: $DIR/auxiliary/variants.rs:5:5
|
|
||||||
|
|
|
||||||
LL | #[non_exhaustive] Tuple(u32),
|
|
||||||
| ----------------- the tuple variant is `#[non_exhaustive]`
|
|
||||||
|
|
|
||||||
note: the tuple variant `Tuple` is defined here
|
note: the tuple variant `Tuple` is defined here
|
||||||
--> $DIR/auxiliary/variants.rs:5:23
|
--> $DIR/auxiliary/variants.rs:5:23
|
||||||
|
|
|
|
||||||
LL | #[non_exhaustive] Tuple(u32),
|
LL | #[non_exhaustive] Tuple(u32),
|
||||||
| ^^^^^
|
| ----------------- ^^^^^
|
||||||
|
| |
|
||||||
|
| cannot be constructed because it is `#[non_exhaustive]`
|
||||||
|
|
||||||
error[E0639]: cannot create non-exhaustive variant using struct expression
|
error[E0639]: cannot create non-exhaustive variant using struct expression
|
||||||
--> $DIR/variant.rs:8:26
|
--> $DIR/variant.rs:8:26
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue