diff --git a/src/librustc_resolve/error_reporting.rs b/src/librustc_resolve/error_reporting.rs index cd771d93e00f6..828ffc6d320e7 100644 --- a/src/librustc_resolve/error_reporting.rs +++ b/src/librustc_resolve/error_reporting.rs @@ -293,13 +293,20 @@ impl<'a> Resolver<'a> { (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::>() - .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 f5dbab1ef3586..7d3aba364897f 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 @@ fn result_test() { 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 8a0d0096acbbd..4210b4e057ac1 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 01730c4d69566..c252a6e220c64 100644 --- a/src/test/ui/glob-resolve1.stderr +++ b/src/test/ui/glob-resolve1.stderr @@ -22,10 +22,7 @@ error[E0423]: expected value, found enum `B` --> $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 01f0941282e35..75d9c97513d31 100644 --- a/src/test/ui/resolve/privacy-enum-ctor.stderr +++ b/src/test/ui/resolve/privacy-enum-ctor.stderr @@ -3,22 +3,32 @@ error[E0423]: expected value, found enum `n::Z` | LL | n::Z; | ^^^^ - | - = note: did you mean to use one of the following variants? - - `m::Z::Fn` - - `m::Z::Struct` - - `m::Z::Unit` +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 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 @@ error[E0423]: expected value, found enum `m::E` | 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 @@ error[E0423]: expected value, found enum `E` | 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 @@ error[E0423]: expected value, found enum `m::n::Z` | 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