use suggestions for "enum instead of variant" error
diff --git a/src/librustc_resolve/error_reporting.rs b/src/librustc_resolve/error_reporting.rs
index cd771d9..828ffc6 100644
--- a/src/librustc_resolve/error_reporting.rs
+++ b/src/librustc_resolve/error_reporting.rs
@@ -293,13 +293,20 @@
(Def::Enum(..), PathSource::TupleStruct)
| (Def::Enum(..), PathSource::Expr(..)) => {
if let Some(variants) = self.collect_enum_variants(def) {
- err.note(&format!("did you mean to use one \
- of the following variants?\n{}",
- variants.iter()
- .map(|suggestion| path_names_to_string(suggestion))
- .map(|suggestion| format!("- `{}`", suggestion))
- .collect::<Vec<_>>()
- .join("\n")));
+ if !variants.is_empty() {
+ let msg = if variants.len() == 1 {
+ "try using the enum's variant"
+ } else {
+ "try using one of the enum's variants"
+ };
+
+ err.span_suggestions(
+ span,
+ msg,
+ variants.iter().map(path_names_to_string),
+ Applicability::MaybeIncorrect,
+ );
+ }
} else {
err.note("did you mean to use one of the enum's variants?");
}
diff --git a/src/test/ui/did_you_mean/issue-43871-enum-instead-of-variant.rs b/src/test/ui/did_you_mean/issue-43871-enum-instead-of-variant.rs
index f5dbab1..7d3aba36 100644
--- a/src/test/ui/did_you_mean/issue-43871-enum-instead-of-variant.rs
+++ b/src/test/ui/did_you_mean/issue-43871-enum-instead-of-variant.rs
@@ -1,5 +1,20 @@
enum Example { Ex(String), NotEx }
+enum Void {}
+
+enum ManyVariants {
+ One,
+ Two,
+ Three,
+ Four,
+ Five,
+ Six,
+ Seven,
+ Eight,
+ Nine,
+ Ten,
+}
+
fn result_test() {
let x = Option(1); //~ ERROR expected function, found enum
@@ -12,6 +27,10 @@
if let Example(_) = y { //~ ERROR expected tuple struct/variant, found enum
println!("It is OK.");
}
+
+ let y = Void(); //~ ERROR expected function, found enum
+
+ let z = ManyVariants(); //~ ERROR expected function, found enum
}
fn main() {}
diff --git a/src/test/ui/did_you_mean/issue-43871-enum-instead-of-variant.stderr b/src/test/ui/did_you_mean/issue-43871-enum-instead-of-variant.stderr
index 8a0d009..4210b4e 100644
--- a/src/test/ui/did_you_mean/issue-43871-enum-instead-of-variant.stderr
+++ b/src/test/ui/did_you_mean/issue-43871-enum-instead-of-variant.stderr
@@ -1,34 +1,63 @@
error[E0423]: expected function, found enum `Option`
- --> $DIR/issue-43871-enum-instead-of-variant.rs:4:13
+ --> $DIR/issue-43871-enum-instead-of-variant.rs:19:13
|
LL | let x = Option(1);
| ^^^^^^
+help: try using one of the enum's variants
|
- = note: did you mean to use one of the following variants?
- - `std::prelude::v1::Option::None`
- - `std::prelude::v1::Option::Some`
+LL | let x = std::prelude::v1::Option::None(1);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | let x = std::prelude::v1::Option::Some(1);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0532]: expected tuple struct/variant, found enum `Option`
- --> $DIR/issue-43871-enum-instead-of-variant.rs:6:12
+ --> $DIR/issue-43871-enum-instead-of-variant.rs:21:12
|
LL | if let Option(_) = x {
| ^^^^^^
+help: try using one of the enum's variants
|
- = note: did you mean to use one of the following variants?
- - `std::prelude::v1::Option::None`
- - `std::prelude::v1::Option::Some`
+LL | if let std::prelude::v1::Option::None(_) = x {
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | if let std::prelude::v1::Option::Some(_) = x {
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0532]: expected tuple struct/variant, found enum `Example`
- --> $DIR/issue-43871-enum-instead-of-variant.rs:12:12
+ --> $DIR/issue-43871-enum-instead-of-variant.rs:27:12
|
LL | if let Example(_) = y {
| ^^^^^^^
+help: try using one of the enum's variants
|
- = note: did you mean to use one of the following variants?
- - `Example::Ex`
- - `Example::NotEx`
+LL | if let Example::Ex(_) = y {
+ | ^^^^^^^^^^^
+LL | if let Example::NotEx(_) = y {
+ | ^^^^^^^^^^^^^^
-error: aborting due to 3 previous errors
+error[E0423]: expected function, found enum `Void`
+ --> $DIR/issue-43871-enum-instead-of-variant.rs:31:13
+ |
+LL | let y = Void();
+ | ^^^^
+
+error[E0423]: expected function, found enum `ManyVariants`
+ --> $DIR/issue-43871-enum-instead-of-variant.rs:33:13
+ |
+LL | let z = ManyVariants();
+ | ^^^^^^^^^^^^
+help: try using one of the enum's variants
+ |
+LL | let z = ManyVariants::Eight();
+ | ^^^^^^^^^^^^^^^^^^^
+LL | let z = ManyVariants::Five();
+ | ^^^^^^^^^^^^^^^^^^
+LL | let z = ManyVariants::Four();
+ | ^^^^^^^^^^^^^^^^^^
+LL | let z = ManyVariants::Nine();
+ | ^^^^^^^^^^^^^^^^^^
+and 6 other candidates
+
+error: aborting due to 5 previous errors
Some errors occurred: E0423, E0532.
For more information about an error, try `rustc --explain E0423`.
diff --git a/src/test/ui/glob-resolve1.stderr b/src/test/ui/glob-resolve1.stderr
index 01730c4..c252a6e 100644
--- a/src/test/ui/glob-resolve1.stderr
+++ b/src/test/ui/glob-resolve1.stderr
@@ -22,10 +22,7 @@
--> $DIR/glob-resolve1.rs:24:5
|
LL | B;
- | ^
- |
- = note: did you mean to use one of the following variants?
- - `B::B1`
+ | ^ help: try using the enum's variant: `B::B1`
error[E0425]: cannot find value `C` in this scope
--> $DIR/glob-resolve1.rs:25:5
diff --git a/src/test/ui/resolve/privacy-enum-ctor.stderr b/src/test/ui/resolve/privacy-enum-ctor.stderr
index 01f0941..75d9c97 100644
--- a/src/test/ui/resolve/privacy-enum-ctor.stderr
+++ b/src/test/ui/resolve/privacy-enum-ctor.stderr
@@ -3,22 +3,32 @@
|
LL | n::Z;
| ^^^^
+help: try using one of the enum's variants
|
- = note: did you mean to use one of the following variants?
- - `m::Z::Fn`
- - `m::Z::Struct`
- - `m::Z::Unit`
+LL | m::Z::Fn;
+ | ^^^^^^^^
+LL | m::Z::Struct;
+ | ^^^^^^^^^^^^
+LL | m::Z::Unit;
+ | ^^^^^^^^^^
error[E0423]: expected value, found enum `Z`
--> $DIR/privacy-enum-ctor.rs:25:9
|
LL | Z;
- | ^ help: a function with a similar name exists: `f`
+ | ^
+help: a function with a similar name exists
|
- = note: did you mean to use one of the following variants?
- - `m::Z::Fn`
- - `m::Z::Struct`
- - `m::Z::Unit`
+LL | f;
+ | ^
+help: try using one of the enum's variants
+ |
+LL | m::Z::Fn;
+ | ^^^^^^^^
+LL | m::Z::Struct;
+ | ^^^^^^^^^^^^
+LL | m::Z::Unit;
+ | ^^^^^^^^^^
error[E0423]: expected value, found struct variant `Z::Struct`
--> $DIR/privacy-enum-ctor.rs:29:20
@@ -31,15 +41,18 @@
|
LL | let _: E = m::E;
| ^^^^
- |
- = note: did you mean to use one of the following variants?
- - `E::Fn`
- - `E::Struct`
- - `E::Unit`
help: a function with a similar name exists
|
LL | let _: E = m::f;
| ^
+help: try using one of the enum's variants
+ |
+LL | let _: E = E::Fn;
+ | ^^^^^
+LL | let _: E = E::Struct;
+ | ^^^^^^^^^
+LL | let _: E = E::Unit;
+ | ^^^^^^^
help: possible better candidates are found in other modules, you can import them into scope
|
LL | use std::f32::consts::E;
@@ -58,11 +71,14 @@
|
LL | let _: E = E;
| ^
+help: try using one of the enum's variants
|
- = note: did you mean to use one of the following variants?
- - `E::Fn`
- - `E::Struct`
- - `E::Unit`
+LL | let _: E = E::Fn;
+ | ^^^^^
+LL | let _: E = E::Struct;
+ | ^^^^^^^^^
+LL | let _: E = E::Unit;
+ | ^^^^^^^
help: possible better candidates are found in other modules, you can import them into scope
|
LL | use std::f32::consts::E;
@@ -95,11 +111,14 @@
|
LL | let _: Z = m::n::Z;
| ^^^^^^^
+help: try using one of the enum's variants
|
- = note: did you mean to use one of the following variants?
- - `m::Z::Fn`
- - `m::Z::Struct`
- - `m::Z::Unit`
+LL | let _: Z = m::Z::Fn;
+ | ^^^^^^^^
+LL | let _: Z = m::Z::Struct;
+ | ^^^^^^^^^^^^
+LL | let _: Z = m::Z::Unit;
+ | ^^^^^^^^^^
error[E0412]: cannot find type `Z` in this scope
--> $DIR/privacy-enum-ctor.rs:61:12