Rollup merge of #137206 - estebank:e0599-structured, r=jieyouxu

Make E0599 a structured error
This commit is contained in:
Matthias Krüger 2025-02-18 18:40:54 +01:00 committed by GitHub
commit a66ef2f40e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 25 additions and 18 deletions

View file

@ -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

View file

@ -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)]

View file

@ -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(

View file

@ -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;

View file

@ -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 {