about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-04-12 12:17:56 +0200
committerGitHub <noreply@github.com>2019-04-12 12:17:56 +0200
commit24ee611eac403b61bc4d76b8dac7bde16337fb55 (patch)
treef8f79a8645c241193e25289bbd8088d1e13105fb
parent484e703a0be761ef525c84463abbf8904620d377 (diff)
parent757ef3843192b27100ec1746721386d245a8644d (diff)
downloadrust-24ee611eac403b61bc4d76b8dac7bde16337fb55.tar.gz
rust-24ee611eac403b61bc4d76b8dac7bde16337fb55.zip
Rollup merge of #59821 - euclio:unknown-enum-variants, r=davidtwco
improve unknown enum variant errors

Fixes #56517.
-rw-r--r--src/librustc_typeck/astconv.rs21
-rw-r--r--src/librustc_typeck/check/method/suggest.rs51
-rw-r--r--src/test/ui/associated-item/associated-item-enum.rs20
-rw-r--r--src/test/ui/associated-item/associated-item-enum.stderr36
-rw-r--r--src/test/ui/auto-ref-slice-plus-ref.stderr2
-rw-r--r--src/test/ui/block-result/issue-3563.stderr2
-rw-r--r--src/test/ui/bogus-tag.stderr6
-rw-r--r--src/test/ui/empty/empty-struct-braces-expr.rs6
-rw-r--r--src/test/ui/empty/empty-struct-braces-expr.stderr20
-rw-r--r--src/test/ui/issues/issue-22933-2.rs2
-rw-r--r--src/test/ui/issues/issue-22933-2.stderr6
-rw-r--r--src/test/ui/issues/issue-23173.rs12
-rw-r--r--src/test/ui/issues/issue-23173.stderr12
-rw-r--r--src/test/ui/issues/issue-23217.rs3
-rw-r--r--src/test/ui/issues/issue-23217.stderr8
-rw-r--r--src/test/ui/issues/issue-28344.stderr4
-rw-r--r--src/test/ui/issues/issue-28971.rs4
-rw-r--r--src/test/ui/issues/issue-28971.stderr10
-rw-r--r--src/test/ui/issues/issue-34209.rs3
-rw-r--r--src/test/ui/issues/issue-34209.stderr11
-rw-r--r--src/test/ui/issues/issue-50264-inner-deref-trait/result-deref-err.stderr2
-rw-r--r--src/test/ui/suggestions/suggest-methods.stderr6
-rw-r--r--src/test/ui/suggestions/suggest-variants.rs3
-rw-r--r--src/test/ui/suggestions/suggest-variants.stderr65
24 files changed, 216 insertions, 99 deletions
diff --git a/src/librustc_typeck/astconv.rs b/src/librustc_typeck/astconv.rs
index 8805dade40e..0c206b27f80 100644
--- a/src/librustc_typeck/astconv.rs
+++ b/src/librustc_typeck/astconv.rs
@@ -1362,12 +1362,11 @@ impl<'o, 'gcx: 'tcx, 'tcx> dyn AstConv<'gcx, 'tcx> + 'o {
                     let msg = format!("expected type, found variant `{}`", assoc_ident);
                     tcx.sess.span_err(span, &msg);
                 } else if qself_ty.is_enum() {
-                    // Report as incorrect enum variant rather than ambiguous type.
                     let mut err = tcx.sess.struct_span_err(
-                        span,
-                        &format!("no variant `{}` on enum `{}`", &assoc_ident.as_str(), qself_ty),
+                        assoc_ident.span,
+                        &format!("no variant `{}` in enum `{}`", assoc_ident, qself_ty),
                     );
-                    // Check if it was a typo.
+
                     let adt_def = qself_ty.ty_adt_def().expect("enum is not an ADT");
                     if let Some(suggested_name) = find_best_match_for_name(
                         adt_def.variants.iter().map(|variant| &variant.ident.name),
@@ -1375,14 +1374,20 @@ impl<'o, 'gcx: 'tcx, 'tcx> dyn AstConv<'gcx, 'tcx> + 'o {
                         None,
                     ) {
                         err.span_suggestion(
-                            span,
-                            "did you mean",
-                            format!("{}::{}", qself_ty, suggested_name),
+                            assoc_ident.span,
+                            "there is a variant with a similar name",
+                            suggested_name.to_string(),
                             Applicability::MaybeIncorrect,
                         );
                     } else {
-                        err.span_label(span, "unknown variant");
+                        err.span_label(span, format!("variant not found in `{}`", qself_ty));
                     }
+
+                    if let Some(sp) = tcx.hir().span_if_local(adt_def.did) {
+                        let sp = tcx.sess.source_map().def_span(sp);
+                        err.span_label(sp, format!("variant `{}` not found here", assoc_ident));
+                    }
+
                     err.emit();
                 } else if !qself_ty.references_error() {
                     // Don't print `TyErr` to the user.
diff --git a/src/librustc_typeck/check/method/suggest.rs b/src/librustc_typeck/check/method/suggest.rs
index 5f5c7cfec95..31b7724d638 100644
--- a/src/librustc_typeck/check/method/suggest.rs
+++ b/src/librustc_typeck/check/method/suggest.rs
@@ -14,11 +14,11 @@ use rustc::hir::map as hir_map;
 use rustc::hir::print;
 use rustc::infer::type_variable::TypeVariableOrigin;
 use rustc::traits::Obligation;
-use rustc::ty::{self, Adt, Ty, TyCtxt, ToPolyTraitRef, ToPredicate, TypeFoldable};
+use rustc::ty::{self, Ty, TyCtxt, ToPolyTraitRef, ToPredicate, TypeFoldable};
 use rustc::ty::print::with_crate_prefix;
 use syntax_pos::{Span, FileName};
 use syntax::ast;
-use syntax::util::lev_distance::find_best_match_for_name;
+use syntax::util::lev_distance;
 
 use std::cmp::Ordering;
 
@@ -188,17 +188,10 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
                 let actual = self.resolve_type_vars_if_possible(&rcvr_ty);
                 let ty_str = self.ty_to_string(actual);
                 let is_method = mode == Mode::MethodCall;
-                let mut suggestion = None;
                 let item_kind = if is_method {
                     "method"
                 } else if actual.is_enum() {
-                    if let Adt(ref adt_def, _) = actual.sty {
-                        let names = adt_def.variants.iter().map(|s| &s.ident.name);
-                        suggestion = find_best_match_for_name(names,
-                                                              &item_name.as_str(),
-                                                              None);
-                    }
-                    "variant"
+                    "variant or associated item"
                 } else {
                     match (item_name.as_str().chars().next(), actual.is_fresh_ty()) {
                         (Some(name), false) if name.is_lowercase() => {
@@ -299,7 +292,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
                         return;
                     } else {
                         span = item_name.span;
-                        let mut err = struct_span_err!(
+                        struct_span_err!(
                             tcx.sess,
                             span,
                             E0599,
@@ -307,17 +300,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
                             item_kind,
                             item_name,
                             ty_str
-                        );
-                        if let Some(suggestion) = suggestion {
-                            // enum variant
-                            err.span_suggestion(
-                                span,
-                                "did you mean",
-                                suggestion.to_string(),
-                                Applicability::MaybeIncorrect,
-                            );
-                        }
-                        err
+                        )
                     }
                 } else {
                     tcx.sess.diagnostic().struct_dummy()
@@ -469,14 +452,36 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
                                                   out_of_scope_traits);
                 }
 
+                if actual.is_enum() {
+                    let adt_def = actual.ty_adt_def().expect("enum is not an ADT");
+                    if let Some(suggestion) = lev_distance::find_best_match_for_name(
+                        adt_def.variants.iter().map(|s| &s.ident.name),
+                        &item_name.as_str(),
+                        None,
+                    ) {
+                        err.span_suggestion(
+                            span,
+                            "there is a variant with a similar name",
+                            suggestion.to_string(),
+                            Applicability::MaybeIncorrect,
+                        );
+                    }
+                }
+
                 if let Some(lev_candidate) = lev_candidate {
+                    let def = lev_candidate.def();
                     err.span_suggestion(
                         span,
-                        "did you mean",
+                        &format!(
+                            "there is {} {} with a similar name",
+                            def.article(),
+                            def.kind_name(),
+                        ),
                         lev_candidate.ident.to_string(),
                         Applicability::MaybeIncorrect,
                     );
                 }
+
                 err.emit();
             }
 
diff --git a/src/test/ui/associated-item/associated-item-enum.rs b/src/test/ui/associated-item/associated-item-enum.rs
new file mode 100644
index 00000000000..30ba258155b
--- /dev/null
+++ b/src/test/ui/associated-item/associated-item-enum.rs
@@ -0,0 +1,20 @@
+enum Enum { Variant }
+
+impl Enum {
+    const MISSPELLABLE: i32 = 0;
+    fn misspellable() {}
+}
+
+trait Trait {
+    fn misspellable_trait() {}
+}
+
+impl Trait for Enum {
+    fn misspellable_trait() {}
+}
+
+fn main() {
+    Enum::mispellable(); //~ ERROR no variant or associated item
+    Enum::mispellable_trait(); //~ ERROR no variant or associated item
+    Enum::MISPELLABLE; //~ ERROR no variant or associated item
+}
diff --git a/src/test/ui/associated-item/associated-item-enum.stderr b/src/test/ui/associated-item/associated-item-enum.stderr
new file mode 100644
index 00000000000..5a62b9736de
--- /dev/null
+++ b/src/test/ui/associated-item/associated-item-enum.stderr
@@ -0,0 +1,36 @@
+error[E0599]: no variant or associated item named `mispellable` found for type `Enum` in the current scope
+  --> $DIR/associated-item-enum.rs:17:11
+   |
+LL | enum Enum { Variant }
+   | --------- variant or associated item `mispellable` not found here
+...
+LL |     Enum::mispellable();
+   |           ^^^^^^^^^^^
+   |           |
+   |           variant or associated item not found in `Enum`
+   |           help: there is a method with a similar name: `misspellable`
+
+error[E0599]: no variant or associated item named `mispellable_trait` found for type `Enum` in the current scope
+  --> $DIR/associated-item-enum.rs:18:11
+   |
+LL | enum Enum { Variant }
+   | --------- variant or associated item `mispellable_trait` not found here
+...
+LL |     Enum::mispellable_trait();
+   |           ^^^^^^^^^^^^^^^^^ variant or associated item not found in `Enum`
+
+error[E0599]: no variant or associated item named `MISPELLABLE` found for type `Enum` in the current scope
+  --> $DIR/associated-item-enum.rs:19:11
+   |
+LL | enum Enum { Variant }
+   | --------- variant or associated item `MISPELLABLE` not found here
+...
+LL |     Enum::MISPELLABLE;
+   |           ^^^^^^^^^^^
+   |           |
+   |           variant or associated item not found in `Enum`
+   |           help: there is an associated constant with a similar name: `MISSPELLABLE`
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0599`.
diff --git a/src/test/ui/auto-ref-slice-plus-ref.stderr b/src/test/ui/auto-ref-slice-plus-ref.stderr
index 97b9cd961a0..f2e0d379d1b 100644
--- a/src/test/ui/auto-ref-slice-plus-ref.stderr
+++ b/src/test/ui/auto-ref-slice-plus-ref.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `test_mut` found for type `std::vec::Vec<{integer}
   --> $DIR/auto-ref-slice-plus-ref.rs:7:7
    |
 LL |     a.test_mut();
-   |       ^^^^^^^^ help: did you mean: `get_mut`
+   |       ^^^^^^^^ help: there is a method with a similar name: `get_mut`
    |
    = help: items from traits can only be used if the trait is implemented and in scope
    = note: the following trait defines an item `test_mut`, perhaps you need to implement it:
diff --git a/src/test/ui/block-result/issue-3563.stderr b/src/test/ui/block-result/issue-3563.stderr
index a6346a5233f..237b8c54ce3 100644
--- a/src/test/ui/block-result/issue-3563.stderr
+++ b/src/test/ui/block-result/issue-3563.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `b` found for type `&Self` in the current scope
   --> $DIR/issue-3563.rs:3:17
    |
 LL |         || self.b()
-   |                 ^ help: did you mean: `a`
+   |                 ^ help: there is a method with a similar name: `a`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/bogus-tag.stderr b/src/test/ui/bogus-tag.stderr
index 0bf0d4b14ee..890f6800c22 100644
--- a/src/test/ui/bogus-tag.stderr
+++ b/src/test/ui/bogus-tag.stderr
@@ -1,11 +1,11 @@
-error[E0599]: no variant named `Hsl` found for type `Color` in the current scope
+error[E0599]: no variant or associated item named `Hsl` found for type `Color` in the current scope
   --> $DIR/bogus-tag.rs:7:16
    |
 LL | enum Color { Rgb(isize, isize, isize), Rgba(isize, isize, isize, isize), }
-   | ---------- variant `Hsl` not found here
+   | ---------- variant or associated item `Hsl` not found here
 ...
 LL |         Color::Hsl(h, s, l) => { println!("hsl"); }
-   |                ^^^ variant not found in `Color`
+   |                ^^^ variant or associated item not found in `Color`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/empty/empty-struct-braces-expr.rs b/src/test/ui/empty/empty-struct-braces-expr.rs
index 2f2f41ae8c1..e33fcb70db7 100644
--- a/src/test/ui/empty/empty-struct-braces-expr.rs
+++ b/src/test/ui/empty/empty-struct-braces-expr.rs
@@ -19,6 +19,8 @@ fn main() {
 
     let xe1 = XEmpty1; //~ ERROR expected value, found struct `XEmpty1`
     let xe1 = XEmpty1(); //~ ERROR expected function, found struct `XEmpty1`
-    let xe3 = XE::Empty3; //~ ERROR no variant named `Empty3` found for type
-    let xe3 = XE::Empty3(); //~ ERROR no variant named `Empty3` found for type
+    let xe3 = XE::Empty3; //~ ERROR no variant or associated item named `Empty3` found for type
+    let xe3 = XE::Empty3(); //~ ERROR no variant or associated item named `Empty3` found for type
+
+    XE::Empty1 {}; //~ ERROR no variant `Empty1` in enum `empty_struct::XE`
 }
diff --git a/src/test/ui/empty/empty-struct-braces-expr.stderr b/src/test/ui/empty/empty-struct-braces-expr.stderr
index 57c8c1c85dd..f5609c8e1bf 100644
--- a/src/test/ui/empty/empty-struct-braces-expr.stderr
+++ b/src/test/ui/empty/empty-struct-braces-expr.stderr
@@ -46,25 +46,31 @@ LL |     let xe1 = XEmpty1();
    |               did you mean `XEmpty1 { /* fields */ }`?
    |               help: a unit struct with a similar name exists: `XEmpty2`
 
-error[E0599]: no variant named `Empty3` found for type `empty_struct::XE` in the current scope
+error[E0599]: no variant or associated item named `Empty3` found for type `empty_struct::XE` in the current scope
   --> $DIR/empty-struct-braces-expr.rs:22:19
    |
 LL |     let xe3 = XE::Empty3;
    |                   ^^^^^^
    |                   |
-   |                   variant not found in `empty_struct::XE`
-   |                   help: did you mean: `XEmpty3`
+   |                   variant or associated item not found in `empty_struct::XE`
+   |                   help: there is a variant with a similar name: `XEmpty3`
 
-error[E0599]: no variant named `Empty3` found for type `empty_struct::XE` in the current scope
+error[E0599]: no variant or associated item named `Empty3` found for type `empty_struct::XE` in the current scope
   --> $DIR/empty-struct-braces-expr.rs:23:19
    |
 LL |     let xe3 = XE::Empty3();
    |                   ^^^^^^
    |                   |
-   |                   variant not found in `empty_struct::XE`
-   |                   help: did you mean: `XEmpty3`
+   |                   variant or associated item not found in `empty_struct::XE`
+   |                   help: there is a variant with a similar name: `XEmpty3`
 
-error: aborting due to 8 previous errors
+error: no variant `Empty1` in enum `empty_struct::XE`
+  --> $DIR/empty-struct-braces-expr.rs:25:9
+   |
+LL |     XE::Empty1 {};
+   |         ^^^^^^ help: there is a variant with a similar name: `XEmpty3`
+
+error: aborting due to 9 previous errors
 
 Some errors occurred: E0423, E0599.
 For more information about an error, try `rustc --explain E0423`.
diff --git a/src/test/ui/issues/issue-22933-2.rs b/src/test/ui/issues/issue-22933-2.rs
index 68d9ef2cfa8..98a354b1bd0 100644
--- a/src/test/ui/issues/issue-22933-2.rs
+++ b/src/test/ui/issues/issue-22933-2.rs
@@ -2,7 +2,7 @@ enum Delicious {
     Pie      = 0x1,
     Apple    = 0x2,
     ApplePie = Delicious::Apple as isize | Delicious::PIE as isize,
-    //~^ ERROR no variant named `PIE` found for type `Delicious`
+    //~^ ERROR no variant or associated item named `PIE` found for type `Delicious`
 }
 
 fn main() {}
diff --git a/src/test/ui/issues/issue-22933-2.stderr b/src/test/ui/issues/issue-22933-2.stderr
index 23b1474bde7..72038ea20a3 100644
--- a/src/test/ui/issues/issue-22933-2.stderr
+++ b/src/test/ui/issues/issue-22933-2.stderr
@@ -1,11 +1,11 @@
-error[E0599]: no variant named `PIE` found for type `Delicious` in the current scope
+error[E0599]: no variant or associated item named `PIE` found for type `Delicious` in the current scope
   --> $DIR/issue-22933-2.rs:4:55
    |
 LL | enum Delicious {
-   | -------------- variant `PIE` not found here
+   | -------------- variant or associated item `PIE` not found here
 ...
 LL |     ApplePie = Delicious::Apple as isize | Delicious::PIE as isize,
-   |                                                       ^^^ variant not found in `Delicious`
+   |                                                       ^^^ variant or associated item not found in `Delicious`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issues/issue-23173.rs b/src/test/ui/issues/issue-23173.rs
index 2922ebddf4c..7c15598448d 100644
--- a/src/test/ui/issues/issue-23173.rs
+++ b/src/test/ui/issues/issue-23173.rs
@@ -6,12 +6,8 @@ struct Struct {
 fn use_token(token: &Token) { unimplemented!() }
 
 fn main() {
-    use_token(&Token::Homura);
-    //~^ ERROR no variant named `Homura`
-    Struct::method();
-    //~^ ERROR no function or associated item named `method` found for type
-    Struct::method;
-    //~^ ERROR no function or associated item named `method` found for type
-    Struct::Assoc;
-    //~^ ERROR no associated item named `Assoc` found for type `Struct` in
+    use_token(&Token::Homura); //~ ERROR no variant or associated item named `Homura`
+    Struct::method(); //~ ERROR no function or associated item named `method` found for type
+    Struct::method; //~ ERROR no function or associated item named `method` found for type
+    Struct::Assoc; //~ ERROR no associated item named `Assoc` found for type `Struct` in
 }
diff --git a/src/test/ui/issues/issue-23173.stderr b/src/test/ui/issues/issue-23173.stderr
index 75dba883608..699e41156fa 100644
--- a/src/test/ui/issues/issue-23173.stderr
+++ b/src/test/ui/issues/issue-23173.stderr
@@ -1,14 +1,14 @@
-error[E0599]: no variant named `Homura` found for type `Token` in the current scope
+error[E0599]: no variant or associated item named `Homura` found for type `Token` in the current scope
   --> $DIR/issue-23173.rs:9:23
    |
 LL | enum Token { LeftParen, RightParen, Plus, Minus, /* etc */ }
-   | ---------- variant `Homura` not found here
+   | ---------- variant or associated item `Homura` not found here
 ...
 LL |     use_token(&Token::Homura);
-   |                       ^^^^^^ variant not found in `Token`
+   |                       ^^^^^^ variant or associated item not found in `Token`
 
 error[E0599]: no function or associated item named `method` found for type `Struct` in the current scope
-  --> $DIR/issue-23173.rs:11:13
+  --> $DIR/issue-23173.rs:10:13
    |
 LL | struct Struct {
    | ------------- function or associated item `method` not found for this
@@ -17,7 +17,7 @@ LL |     Struct::method();
    |             ^^^^^^ function or associated item not found in `Struct`
 
 error[E0599]: no function or associated item named `method` found for type `Struct` in the current scope
-  --> $DIR/issue-23173.rs:13:13
+  --> $DIR/issue-23173.rs:11:13
    |
 LL | struct Struct {
    | ------------- function or associated item `method` not found for this
@@ -26,7 +26,7 @@ LL |     Struct::method;
    |             ^^^^^^ function or associated item not found in `Struct`
 
 error[E0599]: no associated item named `Assoc` found for type `Struct` in the current scope
-  --> $DIR/issue-23173.rs:15:13
+  --> $DIR/issue-23173.rs:12:13
    |
 LL | struct Struct {
    | ------------- associated item `Assoc` not found for this
diff --git a/src/test/ui/issues/issue-23217.rs b/src/test/ui/issues/issue-23217.rs
index 11426df6177..157f20d22d8 100644
--- a/src/test/ui/issues/issue-23217.rs
+++ b/src/test/ui/issues/issue-23217.rs
@@ -1,6 +1,5 @@
 pub enum SomeEnum {
-    B = SomeEnum::A,
-    //~^ ERROR no variant named `A` found for type `SomeEnum`
+    B = SomeEnum::A, //~ ERROR no variant or associated item named `A` found for type `SomeEnum`
 }
 
 fn main() {}
diff --git a/src/test/ui/issues/issue-23217.stderr b/src/test/ui/issues/issue-23217.stderr
index 2a982422cab..97100ed3753 100644
--- a/src/test/ui/issues/issue-23217.stderr
+++ b/src/test/ui/issues/issue-23217.stderr
@@ -1,13 +1,13 @@
-error[E0599]: no variant named `A` found for type `SomeEnum` in the current scope
+error[E0599]: no variant or associated item named `A` found for type `SomeEnum` in the current scope
   --> $DIR/issue-23217.rs:2:19
    |
 LL | pub enum SomeEnum {
-   | ----------------- variant `A` not found here
+   | ----------------- variant or associated item `A` not found here
 LL |     B = SomeEnum::A,
    |                   ^
    |                   |
-   |                   variant not found in `SomeEnum`
-   |                   help: did you mean: `B`
+   |                   variant or associated item not found in `SomeEnum`
+   |                   help: there is a variant with a similar name: `B`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issues/issue-28344.stderr b/src/test/ui/issues/issue-28344.stderr
index fcd98b111cf..f3a8019e232 100644
--- a/src/test/ui/issues/issue-28344.stderr
+++ b/src/test/ui/issues/issue-28344.stderr
@@ -11,7 +11,7 @@ LL |     let x: u8 = BitXor::bitor(0 as u8, 0 as u8);
    |                         ^^^^^
    |                         |
    |                         function or associated item not found in `dyn std::ops::BitXor<_>`
-   |                         help: did you mean: `bitxor`
+   |                         help: there is a method with a similar name: `bitxor`
 
 error[E0191]: the value of the associated type `Output` (from the trait `std::ops::BitXor`) must be specified
   --> $DIR/issue-28344.rs:8:13
@@ -26,7 +26,7 @@ LL |     let g = BitXor::bitor;
    |                     ^^^^^
    |                     |
    |                     function or associated item not found in `dyn std::ops::BitXor<_>`
-   |                     help: did you mean: `bitxor`
+   |                     help: there is a method with a similar name: `bitxor`
 
 error: aborting due to 4 previous errors
 
diff --git a/src/test/ui/issues/issue-28971.rs b/src/test/ui/issues/issue-28971.rs
index 3f0d2fafb04..6493565d216 100644
--- a/src/test/ui/issues/issue-28971.rs
+++ b/src/test/ui/issues/issue-28971.rs
@@ -1,5 +1,3 @@
-// This should not cause an ICE
-
 enum Foo {
     Bar(u8)
 }
@@ -7,7 +5,7 @@ fn main(){
     foo(|| {
         match Foo::Bar(1) {
             Foo::Baz(..) => (),
-            //~^ ERROR no variant named `Baz` found for type `Foo`
+            //~^ ERROR no variant or associated item named `Baz` found for type `Foo`
             _ => (),
         }
     });
diff --git a/src/test/ui/issues/issue-28971.stderr b/src/test/ui/issues/issue-28971.stderr
index 4781f7abe81..7411896443d 100644
--- a/src/test/ui/issues/issue-28971.stderr
+++ b/src/test/ui/issues/issue-28971.stderr
@@ -1,14 +1,14 @@
-error[E0599]: no variant named `Baz` found for type `Foo` in the current scope
-  --> $DIR/issue-28971.rs:9:18
+error[E0599]: no variant or associated item named `Baz` found for type `Foo` in the current scope
+  --> $DIR/issue-28971.rs:7:18
    |
 LL | enum Foo {
-   | -------- variant `Baz` not found here
+   | -------- variant or associated item `Baz` not found here
 ...
 LL |             Foo::Baz(..) => (),
    |                  ^^^
    |                  |
-   |                  variant not found in `Foo`
-   |                  help: did you mean: `Bar`
+   |                  variant or associated item not found in `Foo`
+   |                  help: there is a variant with a similar name: `Bar`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issues/issue-34209.rs b/src/test/ui/issues/issue-34209.rs
index 50095be7740..fc2c3679e13 100644
--- a/src/test/ui/issues/issue-34209.rs
+++ b/src/test/ui/issues/issue-34209.rs
@@ -4,8 +4,7 @@ enum S {
 
 fn bug(l: S) {
     match l {
-        S::B { } => { },
-        //~^ ERROR no variant `B` on enum `S`
+        S::B {} => {}, //~ ERROR no variant `B` in enum `S`
     }
 }
 
diff --git a/src/test/ui/issues/issue-34209.stderr b/src/test/ui/issues/issue-34209.stderr
index 79aba89c148..194bb2bfab8 100644
--- a/src/test/ui/issues/issue-34209.stderr
+++ b/src/test/ui/issues/issue-34209.stderr
@@ -1,8 +1,11 @@
-error: no variant `B` on enum `S`
-  --> $DIR/issue-34209.rs:7:9
+error: no variant `B` in enum `S`
+  --> $DIR/issue-34209.rs:7:12
    |
-LL |         S::B { } => { },
-   |         ^^^^ help: did you mean: `S::A`
+LL | enum S {
+   | ------ variant `B` not found here
+...
+LL |         S::B {} => {},
+   |            ^ help: there is a variant with a similar name: `A`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result-deref-err.stderr b/src/test/ui/issues/issue-50264-inner-deref-trait/result-deref-err.stderr
index 96d6814b0fe..333036127ea 100644
--- a/src/test/ui/issues/issue-50264-inner-deref-trait/result-deref-err.stderr
+++ b/src/test/ui/issues/issue-50264-inner-deref-trait/result-deref-err.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `deref_err` found for type `std::result::Result<_,
   --> $DIR/result-deref-err.rs:4:28
    |
 LL |     let _result = &Err(41).deref_err();
-   |                            ^^^^^^^^^ help: did you mean: `deref_ok`
+   |                            ^^^^^^^^^ help: there is a method with a similar name: `deref_ok`
    |
    = note: the method `deref_err` exists but the following trait bounds were not satisfied:
            `{integer} : std::ops::Deref`
diff --git a/src/test/ui/suggestions/suggest-methods.stderr b/src/test/ui/suggestions/suggest-methods.stderr
index 09d58575d97..ad4a4deb5a8 100644
--- a/src/test/ui/suggestions/suggest-methods.stderr
+++ b/src/test/ui/suggestions/suggest-methods.stderr
@@ -5,19 +5,19 @@ LL | struct Foo;
    | ----------- method `bat` not found for this
 ...
 LL |     f.bat(1.0);
-   |       ^^^ help: did you mean: `bar`
+   |       ^^^ help: there is a method with a similar name: `bar`
 
 error[E0599]: no method named `is_emtpy` found for type `std::string::String` in the current scope
   --> $DIR/suggest-methods.rs:21:15
    |
 LL |     let _ = s.is_emtpy();
-   |               ^^^^^^^^ help: did you mean: `is_empty`
+   |               ^^^^^^^^ help: there is a method with a similar name: `is_empty`
 
 error[E0599]: no method named `count_eos` found for type `u32` in the current scope
   --> $DIR/suggest-methods.rs:25:19
    |
 LL |     let _ = 63u32.count_eos();
-   |                   ^^^^^^^^^ help: did you mean: `count_zeros`
+   |                   ^^^^^^^^^ help: there is a method with a similar name: `count_zeros`
 
 error[E0599]: no method named `count_o` found for type `u32` in the current scope
   --> $DIR/suggest-methods.rs:28:19
diff --git a/src/test/ui/suggestions/suggest-variants.rs b/src/test/ui/suggestions/suggest-variants.rs
index 6d6e280d965..d418834432e 100644
--- a/src/test/ui/suggestions/suggest-variants.rs
+++ b/src/test/ui/suggestions/suggest-variants.rs
@@ -12,4 +12,7 @@ fn main() {
     println!("My shape is {:?}", Shape::Squareee { size: 5});  //~ ERROR no variant `Squareee`
     println!("My shape is {:?}", Shape::Circl { size: 5}); //~ ERROR no variant `Circl`
     println!("My shape is {:?}", Shape::Rombus{ size: 5}); //~ ERROR no variant `Rombus`
+    Shape::Squareee; //~ ERROR no variant
+    Shape::Circl; //~ ERROR no variant
+    Shape::Rombus; //~ ERROR no variant
 }
diff --git a/src/test/ui/suggestions/suggest-variants.stderr b/src/test/ui/suggestions/suggest-variants.stderr
index 08ae68ea713..ef0ba70c340 100644
--- a/src/test/ui/suggestions/suggest-variants.stderr
+++ b/src/test/ui/suggestions/suggest-variants.stderr
@@ -1,20 +1,65 @@
-error: no variant `Squareee` on enum `Shape`
-  --> $DIR/suggest-variants.rs:12:34
+error: no variant `Squareee` in enum `Shape`
+  --> $DIR/suggest-variants.rs:12:41
    |
+LL | enum Shape {
+   | ---------- variant `Squareee` not found here
+...
 LL |     println!("My shape is {:?}", Shape::Squareee { size: 5});
-   |                                  ^^^^^^^^^^^^^^^ help: did you mean: `Shape::Square`
+   |                                         ^^^^^^^^ help: there is a variant with a similar name: `Square`
 
-error: no variant `Circl` on enum `Shape`
-  --> $DIR/suggest-variants.rs:13:34
+error: no variant `Circl` in enum `Shape`
+  --> $DIR/suggest-variants.rs:13:41
    |
+LL | enum Shape {
+   | ---------- variant `Circl` not found here
+...
 LL |     println!("My shape is {:?}", Shape::Circl { size: 5});
-   |                                  ^^^^^^^^^^^^ help: did you mean: `Shape::Circle`
+   |                                         ^^^^^ help: there is a variant with a similar name: `Circle`
 
-error: no variant `Rombus` on enum `Shape`
-  --> $DIR/suggest-variants.rs:14:34
+error: no variant `Rombus` in enum `Shape`
+  --> $DIR/suggest-variants.rs:14:41
    |
+LL | enum Shape {
+   | ---------- variant `Rombus` not found here
+...
 LL |     println!("My shape is {:?}", Shape::Rombus{ size: 5});
-   |                                  ^^^^^^^^^^^^^ unknown variant
+   |                                  -------^^^^^^
+   |                                  |
+   |                                  variant not found in `Shape`
 
-error: aborting due to 3 previous errors
+error[E0599]: no variant or associated item named `Squareee` found for type `Shape` in the current scope
+  --> $DIR/suggest-variants.rs:15:12
+   |
+LL | enum Shape {
+   | ---------- variant or associated item `Squareee` not found here
+...
+LL |     Shape::Squareee;
+   |            ^^^^^^^^
+   |            |
+   |            variant or associated item not found in `Shape`
+   |            help: there is a variant with a similar name: `Square`
+
+error[E0599]: no variant or associated item named `Circl` found for type `Shape` in the current scope
+  --> $DIR/suggest-variants.rs:16:12
+   |
+LL | enum Shape {
+   | ---------- variant or associated item `Circl` not found here
+...
+LL |     Shape::Circl;
+   |            ^^^^^
+   |            |
+   |            variant or associated item not found in `Shape`
+   |            help: there is a variant with a similar name: `Circle`
+
+error[E0599]: no variant or associated item named `Rombus` found for type `Shape` in the current scope
+  --> $DIR/suggest-variants.rs:17:12
+   |
+LL | enum Shape {
+   | ---------- variant or associated item `Rombus` not found here
+...
+LL |     Shape::Rombus;
+   |            ^^^^^^ variant or associated item not found in `Shape`
+
+error: aborting due to 6 previous errors
 
+For more information about this error, try `rustc --explain E0599`.