From eb0d5be441239ac5c401b5fe4f9cbb188b35595e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Sat, 2 Jan 2021 10:58:50 +0100 Subject: [PATCH 1/2] Add test for #80607 with undesired output --- src/test/ui/issues/issue-80607.rs | 10 ++++++++++ src/test/ui/issues/issue-80607.stderr | 14 ++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 src/test/ui/issues/issue-80607.rs create mode 100644 src/test/ui/issues/issue-80607.stderr diff --git a/src/test/ui/issues/issue-80607.rs b/src/test/ui/issues/issue-80607.rs new file mode 100644 index 0000000000000..8bfda9a5c54b2 --- /dev/null +++ b/src/test/ui/issues/issue-80607.rs @@ -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 field does not exist +} + +fn main() {} diff --git a/src/test/ui/issues/issue-80607.stderr b/src/test/ui/issues/issue-80607.stderr new file mode 100644 index 0000000000000..cd405815c70df --- /dev/null +++ b/src/test/ui/issues/issue-80607.stderr @@ -0,0 +1,14 @@ +error[E0559]: variant `Enum::V1` has no field named `x` + --> $DIR/issue-80607.rs:7:16 + | +LL | V1(i32), + | -- `Enum` defined here +... +LL | Enum::V1 { x } + | -------- ^ field does not exist + | | + | `Enum` is a tuple variant, use the appropriate syntax: `Enum(/* fields */)` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0559`. From e0300716efc88a0b11f7121f8a15f5f385265b5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Sat, 2 Jan 2021 11:06:30 +0100 Subject: [PATCH 2/2] Print actual enum variant --- compiler/rustc_typeck/src/check/expr.rs | 49 ++++++++++++++++++------- src/test/ui/issues/issue-80607.rs | 2 +- src/test/ui/issues/issue-80607.stderr | 4 +- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/compiler/rustc_typeck/src/check/expr.rs b/compiler/rustc_typeck/src/check/expr.rs index 8197d02ec594b..e84d813ffbcc0 100644 --- a/compiler/rustc_typeck/src/check/expr.rs +++ b/compiler/rustc_typeck/src/check/expr.rs @@ -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); diff --git a/src/test/ui/issues/issue-80607.rs b/src/test/ui/issues/issue-80607.rs index 8bfda9a5c54b2..63f4df359b831 100644 --- a/src/test/ui/issues/issue-80607.rs +++ b/src/test/ui/issues/issue-80607.rs @@ -4,7 +4,7 @@ pub enum Enum { } pub fn foo(x: i32) -> Enum { - Enum::V1 { x } //~ ERROR field does not exist + Enum::V1 { x } //~ ERROR `Enum::V1` has no field named `x` } fn main() {} diff --git a/src/test/ui/issues/issue-80607.stderr b/src/test/ui/issues/issue-80607.stderr index cd405815c70df..5375478942b18 100644 --- a/src/test/ui/issues/issue-80607.stderr +++ b/src/test/ui/issues/issue-80607.stderr @@ -2,12 +2,12 @@ error[E0559]: variant `Enum::V1` has no field named `x` --> $DIR/issue-80607.rs:7:16 | LL | V1(i32), - | -- `Enum` defined here + | -- `Enum::V1` defined here ... LL | Enum::V1 { x } | -------- ^ field does not exist | | - | `Enum` is a tuple variant, use the appropriate syntax: `Enum(/* fields */)` + | `Enum::V1` is a tuple variant, use the appropriate syntax: `Enum::V1(/* fields */)` error: aborting due to previous error