);
let is_object = self_ty.map_or(false, |ty| {
- ty.sty == self.tcx().types.trait_object_dummy_self.sty
+ ty == self.tcx().types.trait_object_dummy_self
});
let default_needs_object_self = |param: &ty::GenericParamDef| {
if let GenericParamDefKind::Type { has_default, .. } = param.kind {
/// removing the dummy `Self` type (`trait_object_dummy_self`).
fn trait_ref_to_existential(&self, trait_ref: ty::TraitRef<'tcx>)
-> ty::ExistentialTraitRef<'tcx> {
- if trait_ref.self_ty().sty != self.tcx().types.trait_object_dummy_self.sty {
+ if trait_ref.self_ty() != self.tcx().types.trait_object_dummy_self {
bug!("trait_ref_to_existential called on {:?} with non-dummy Self", trait_ref);
}
ty::ExistentialTraitRef::erase_self_ty(self.tcx(), trait_ref)
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),
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.