Skip to content

Commit

Permalink
Rollup merge of rust-lang#80613 - bugadani:issue-80607, r=matthewjasper
Browse files Browse the repository at this point in the history
Diag: print enum variant instead of enum type

Closes rust-lang#80607
  • Loading branch information
m-ou-se authored Jan 2, 2021
2 parents 7a1b01e + e030071 commit 4172756
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 13 deletions.
49 changes: 36 additions & 13 deletions compiler/rustc_typeck/src/check/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1381,19 +1381,42 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
ty,
);
match variant.ctor_kind {
CtorKind::Fn => {
err.span_label(variant.ident.span, format!("`{adt}` defined here", adt = ty));
err.span_label(field.ident.span, "field does not exist");
err.span_label(
ty_span,
format!(
"`{adt}` is a tuple {kind_name}, \
use the appropriate syntax: `{adt}(/* fields */)`",
adt = ty,
kind_name = kind_name
),
);
}
CtorKind::Fn => match ty.kind() {
ty::Adt(adt, ..) if adt.is_enum() => {
err.span_label(
variant.ident.span,
format!(
"`{adt}::{variant}` defined here",
adt = ty,
variant = variant.ident,
),
);
err.span_label(field.ident.span, "field does not exist");
err.span_label(
ty_span,
format!(
"`{adt}::{variant}` is a tuple {kind_name}, \
use the appropriate syntax: `{adt}::{variant}(/* fields */)`",
adt = ty,
variant = variant.ident,
kind_name = kind_name
),
);
}
_ => {
err.span_label(variant.ident.span, format!("`{adt}` defined here", adt = ty));
err.span_label(field.ident.span, "field does not exist");
err.span_label(
ty_span,
format!(
"`{adt}` is a tuple {kind_name}, \
use the appropriate syntax: `{adt}(/* fields */)`",
adt = ty,
kind_name = kind_name
),
);
}
},
_ => {
// prevent all specified fields from being suggested
let skip_fields = skip_fields.iter().map(|ref x| x.ident.name);
Expand Down
10 changes: 10 additions & 0 deletions src/test/ui/issues/issue-80607.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// This tests makes sure the diagnostics print the offending enum variant, not just the type.
pub enum Enum {
V1(i32),
}

pub fn foo(x: i32) -> Enum {
Enum::V1 { x } //~ ERROR `Enum::V1` has no field named `x`
}

fn main() {}
14 changes: 14 additions & 0 deletions src/test/ui/issues/issue-80607.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
error[E0559]: variant `Enum::V1` has no field named `x`
--> $DIR/issue-80607.rs:7:16
|
LL | V1(i32),
| -- `Enum::V1` defined here
...
LL | Enum::V1 { x }
| -------- ^ field does not exist
| |
| `Enum::V1` is a tuple variant, use the appropriate syntax: `Enum::V1(/* fields */)`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0559`.

0 comments on commit 4172756

Please sign in to comment.