From 39f848efb010447621278f90a5241c8657fdccc8 Mon Sep 17 00:00:00 2001 From: Maxim Zholobak Date: Thu, 23 Nov 2017 15:10:23 +0200 Subject: [PATCH] Add module population and case of enum in place of expression --- src/librustc_resolve/lib.rs | 9 +++++--- .../issue-43871-enum-instead-of-variant.rs | 8 +++++++ ...issue-43871-enum-instead-of-variant.stderr | 23 ++++++++++++++----- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 502dcd1b7e85..fb9ba9a09bbe 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -2599,13 +2599,14 @@ impl<'a> Resolver<'a> { } _ => {} }, - (Def::Enum(..), PathSource::TupleStruct) => { + (Def::Enum(..), PathSource::TupleStruct) + | (Def::Enum(..), PathSource::Expr(..)) => { if let Some(variants) = this.collect_enum_variants(def) { err.note(&format!("did you mean to use one \ of the following variants?\n{}", variants.iter() - .map(|suggestion| format!("- `{}`", - path_names_to_string(suggestion))) + .map(|suggestion| path_names_to_string(suggestion)) + .map(|suggestion| format!("- `{}`", suggestion)) .collect::>() .join("\n"))); @@ -3559,6 +3560,8 @@ impl<'a> Resolver<'a> { } self.find_module(enum_def).map(|(enum_module, enum_import_suggestion)| { + self.populate_module_if_necessary(enum_module); + let mut variants = Vec::new(); enum_module.for_each_child_stable(|ident, _, name_binding| { if let Def::Variant(..) = name_binding.def() { 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 22c5e04419a5..923b0984d063 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 @@ -8,12 +8,20 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +enum Example { Ex(String), NotEx } + fn result_test() { let x = Option(1); if let Option(_) = x { println!("It is OK."); } + + let y = Example::Ex(String::from("test")); + + if let Example(_) = y { + println!("It is OK."); + } } 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 4882cb10df68..8371413c5a25 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,21 +1,32 @@ error[E0423]: expected function, found enum `Option` - --> $DIR/issue-43871-enum-instead-of-variant.rs:12:13 + --> $DIR/issue-43871-enum-instead-of-variant.rs:14:13 + | +14 | let x = Option(1); + | ^^^^^^ | -12 | let x = Option(1); - | ^^^^^^ not a function = note: did you mean to use one of the following variants? - `std::prelude::v1::Option::None` - `std::prelude::v1::Option::Some` error[E0532]: expected tuple struct/variant, found enum `Option` - --> $DIR/issue-43871-enum-instead-of-variant.rs:14:12 + --> $DIR/issue-43871-enum-instead-of-variant.rs:16:12 | -14 | if let Option(_) = x { +16 | if let Option(_) = x { | ^^^^^^ | = note: did you mean to use one of the following variants? - `std::prelude::v1::Option::None` - `std::prelude::v1::Option::Some` -error: aborting due to previous error +error[E0532]: expected tuple struct/variant, found enum `Example` + --> $DIR/issue-43871-enum-instead-of-variant.rs:22:12 + | +22 | if let Example(_) = y { + | ^^^^^^^ + | + = note: did you mean to use one of the following variants? + - `Example::Ex` + - `Example::NotEx` + +error: aborting due to 3 previous errors