diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2021-07-16 19:54:02 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-07-16 19:54:02 +0200 |
| commit | effea681c03389482b98c1b5901c842fc94befde (patch) | |
| tree | c39693e44e9fd680c28cecd89f93623b2e63ada7 | |
| parent | 8273567a710df78dac143c2500a69ecc37fe5468 (diff) | |
| parent | b69090102e409fd8139ab554fcd38e567fda470f (diff) | |
| download | rust-effea681c03389482b98c1b5901c842fc94befde.tar.gz rust-effea681c03389482b98c1b5901c842fc94befde.zip | |
Rollup merge of #87158 - In-line:suggest-full-enum-variant-for-local-module, r=estebank
Suggest full enum variant for local modules
3 files changed, 29 insertions, 1 deletions
diff --git a/compiler/rustc_typeck/src/check/demand.rs b/compiler/rustc_typeck/src/check/demand.rs index 33bc25accb3..3ea59906d3d 100644 --- a/compiler/rustc_typeck/src/check/demand.rs +++ b/compiler/rustc_typeck/src/check/demand.rs @@ -10,6 +10,7 @@ use rustc_hir::lang_items::LangItem; use rustc_hir::{is_range_literal, Node}; use rustc_middle::lint::in_external_macro; use rustc_middle::ty::adjustment::AllowTwoPhase; +use rustc_middle::ty::print::with_no_trimmed_paths; use rustc_middle::ty::{self, AssocItem, Ty, TypeAndMut}; use rustc_span::symbol::sym; use rustc_span::Span; @@ -201,7 +202,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let sole_field = &variant.fields[0]; let sole_field_ty = sole_field.ty(self.tcx, substs); if self.can_coerce(expr_ty, sole_field_ty) { - let variant_path = self.tcx.def_path_str(variant.def_id); + let variant_path = + with_no_trimmed_paths(|| self.tcx.def_path_str(variant.def_id)); // FIXME #56861: DRYer prelude filtering if let Some(path) = variant_path.strip_prefix("std::prelude::") { if let Some((_, path)) = path.split_once("::") { diff --git a/src/test/ui/suggestions/suggest-full-enum-variant-for-local-module.rs b/src/test/ui/suggestions/suggest-full-enum-variant-for-local-module.rs new file mode 100644 index 00000000000..1dfc0786668 --- /dev/null +++ b/src/test/ui/suggestions/suggest-full-enum-variant-for-local-module.rs @@ -0,0 +1,10 @@ +mod option { + pub enum O<T> { + Some(T), + None, + } +} + +fn main() { + let _: option::O<()> = (); //~ ERROR 9:28: 9:30: mismatched types [E0308] +} diff --git a/src/test/ui/suggestions/suggest-full-enum-variant-for-local-module.stderr b/src/test/ui/suggestions/suggest-full-enum-variant-for-local-module.stderr new file mode 100644 index 00000000000..22a0ce1e91d --- /dev/null +++ b/src/test/ui/suggestions/suggest-full-enum-variant-for-local-module.stderr @@ -0,0 +1,16 @@ +error[E0308]: mismatched types + --> $DIR/suggest-full-enum-variant-for-local-module.rs:9:28 + | +LL | let _: option::O<()> = (); + | ------------- ^^ + | | | + | | expected enum `O`, found `()` + | | help: try using a variant of the expected enum: `option::O::Some(())` + | expected due to this + | + = note: expected enum `O<()>` + found unit type `()` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. |
