Rollup merge of #137206 - estebank:e0599-structured, r=jieyouxu
Make E0599 a structured error
This commit is contained in:
commit
a66ef2f40e
5 changed files with 25 additions and 18 deletions
|
@ -387,6 +387,8 @@ hir_analysis_must_implement_not_function_span_note = required by this annotation
|
||||||
|
|
||||||
hir_analysis_must_implement_one_of_attribute = the `#[rustc_must_implement_one_of]` attribute must be used with at least 2 args
|
hir_analysis_must_implement_one_of_attribute = the `#[rustc_must_implement_one_of]` attribute must be used with at least 2 args
|
||||||
|
|
||||||
|
hir_analysis_no_variant_named = no variant named `{$ident}` found for enum `{$ty}`
|
||||||
|
|
||||||
hir_analysis_not_supported_delegation = {$descr}
|
hir_analysis_not_supported_delegation = {$descr}
|
||||||
.label = callee defined here
|
.label = callee defined here
|
||||||
|
|
||||||
|
|
|
@ -1417,6 +1417,15 @@ pub(crate) struct CrossCrateTraitsDefined {
|
||||||
pub traits: String,
|
pub traits: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(hir_analysis_no_variant_named, code = E0599)]
|
||||||
|
pub struct NoVariantNamed<'tcx> {
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
pub ident: Ident,
|
||||||
|
pub ty: Ty<'tcx>,
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME(fmease): Deduplicate:
|
// FIXME(fmease): Deduplicate:
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
|
|
|
@ -53,7 +53,9 @@ use rustc_type_ir::Upcast;
|
||||||
use tracing::{debug, instrument};
|
use tracing::{debug, instrument};
|
||||||
|
|
||||||
use crate::check::check_abi_fn_ptr;
|
use crate::check::check_abi_fn_ptr;
|
||||||
use crate::errors::{AmbiguousLifetimeBound, BadReturnTypeNotation, InvalidBaseType};
|
use crate::errors::{
|
||||||
|
AmbiguousLifetimeBound, BadReturnTypeNotation, InvalidBaseType, NoVariantNamed,
|
||||||
|
};
|
||||||
use crate::hir_ty_lowering::errors::{GenericsArgsErrExtend, prohibit_assoc_item_constraint};
|
use crate::hir_ty_lowering::errors::{GenericsArgsErrExtend, prohibit_assoc_item_constraint};
|
||||||
use crate::hir_ty_lowering::generics::{check_generic_arg_count, lower_generic_args};
|
use crate::hir_ty_lowering::generics::{check_generic_arg_count, lower_generic_args};
|
||||||
use crate::middle::resolve_bound_vars as rbv;
|
use crate::middle::resolve_bound_vars as rbv;
|
||||||
|
@ -1205,14 +1207,11 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||||
let msg = format!("expected type, found variant `{assoc_ident}`");
|
let msg = format!("expected type, found variant `{assoc_ident}`");
|
||||||
self.dcx().span_err(span, msg)
|
self.dcx().span_err(span, msg)
|
||||||
} else if qself_ty.is_enum() {
|
} else if qself_ty.is_enum() {
|
||||||
let mut err = struct_span_code_err!(
|
let mut err = self.dcx().create_err(NoVariantNamed {
|
||||||
self.dcx(),
|
span: assoc_ident.span,
|
||||||
assoc_ident.span,
|
ident: assoc_ident,
|
||||||
E0599,
|
ty: qself_ty,
|
||||||
"no variant named `{}` found for enum `{}`",
|
});
|
||||||
assoc_ident,
|
|
||||||
qself_ty,
|
|
||||||
);
|
|
||||||
|
|
||||||
let adt_def = qself_ty.ty_adt_def().expect("enum is not an ADT");
|
let adt_def = qself_ty.ty_adt_def().expect("enum is not an ADT");
|
||||||
if let Some(variant_name) = find_best_match_for_name(
|
if let Some(variant_name) = find_best_match_for_name(
|
||||||
|
|
|
@ -92,6 +92,7 @@ mod impl_wf_check;
|
||||||
mod outlives;
|
mod outlives;
|
||||||
mod variance;
|
mod variance;
|
||||||
|
|
||||||
|
pub use errors::NoVariantNamed;
|
||||||
use rustc_abi::ExternAbi;
|
use rustc_abi::ExternAbi;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::DefKind;
|
use rustc_hir::def::DefKind;
|
||||||
|
|
|
@ -19,6 +19,7 @@ use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::intravisit::Visitor;
|
use rustc_hir::intravisit::Visitor;
|
||||||
use rustc_hir::lang_items::LangItem;
|
use rustc_hir::lang_items::LangItem;
|
||||||
use rustc_hir::{ExprKind, HirId, QPath};
|
use rustc_hir::{ExprKind, HirId, QPath};
|
||||||
|
use rustc_hir_analysis::NoVariantNamed;
|
||||||
use rustc_hir_analysis::hir_ty_lowering::{FeedConstTy, HirTyLowerer as _};
|
use rustc_hir_analysis::hir_ty_lowering::{FeedConstTy, HirTyLowerer as _};
|
||||||
use rustc_infer::infer;
|
use rustc_infer::infer;
|
||||||
use rustc_infer::infer::{DefineOpaqueTypes, InferOk};
|
use rustc_infer::infer::{DefineOpaqueTypes, InferOk};
|
||||||
|
@ -3837,15 +3838,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
.iter_enumerated()
|
.iter_enumerated()
|
||||||
.find(|(_, v)| v.ident(self.tcx).normalize_to_macros_2_0() == ident)
|
.find(|(_, v)| v.ident(self.tcx).normalize_to_macros_2_0() == ident)
|
||||||
else {
|
else {
|
||||||
type_error_struct!(
|
self.dcx()
|
||||||
self.dcx(),
|
.create_err(NoVariantNamed { span: ident.span, ident, ty: container })
|
||||||
ident.span,
|
.with_span_label(field.span, "variant not found")
|
||||||
container,
|
.emit_unless(container.references_error());
|
||||||
E0599,
|
|
||||||
"no variant named `{ident}` found for enum `{container}`",
|
|
||||||
)
|
|
||||||
.with_span_label(field.span, "variant not found")
|
|
||||||
.emit();
|
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
let Some(&subfield) = fields.next() else {
|
let Some(&subfield) = fields.next() else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue