|  | use std::borrow::Cow; | 
|  |  | 
|  | use rustc_abi::TargetDataLayoutErrors; | 
|  | use rustc_error_messages::{DiagArgValue, IntoDiagArg}; | 
|  | use rustc_macros::Subdiagnostic; | 
|  | use rustc_span::{Span, Symbol}; | 
|  |  | 
|  | use crate::diagnostic::DiagLocation; | 
|  | use crate::{ | 
|  | Diag, DiagCtxtHandle, Diagnostic, EmissionGuarantee, Level, Subdiagnostic, | 
|  | fluent_generated as fluent, | 
|  | }; | 
|  |  | 
|  | impl IntoDiagArg for DiagLocation { | 
|  | fn into_diag_arg(self, _: &mut Option<std::path::PathBuf>) -> DiagArgValue { | 
|  | DiagArgValue::Str(Cow::from(self.to_string())) | 
|  | } | 
|  | } | 
|  |  | 
|  | #[derive(Clone)] | 
|  | pub struct DiagSymbolList<S = Symbol>(Vec<S>); | 
|  |  | 
|  | impl<S> From<Vec<S>> for DiagSymbolList<S> { | 
|  | fn from(v: Vec<S>) -> Self { | 
|  | DiagSymbolList(v) | 
|  | } | 
|  | } | 
|  |  | 
|  | impl<S> FromIterator<S> for DiagSymbolList<S> { | 
|  | fn from_iter<T: IntoIterator<Item = S>>(iter: T) -> Self { | 
|  | iter.into_iter().collect::<Vec<_>>().into() | 
|  | } | 
|  | } | 
|  |  | 
|  | impl<S: std::fmt::Display> IntoDiagArg for DiagSymbolList<S> { | 
|  | fn into_diag_arg(self, _: &mut Option<std::path::PathBuf>) -> DiagArgValue { | 
|  | DiagArgValue::StrListSepByAnd( | 
|  | self.0.into_iter().map(|sym| Cow::Owned(format!("`{sym}`"))).collect(), | 
|  | ) | 
|  | } | 
|  | } | 
|  |  | 
|  | impl<G: EmissionGuarantee> Diagnostic<'_, G> for TargetDataLayoutErrors<'_> { | 
|  | fn into_diag(self, dcx: DiagCtxtHandle<'_>, level: Level) -> Diag<'_, G> { | 
|  | match self { | 
|  | TargetDataLayoutErrors::InvalidAddressSpace { addr_space, err, cause } => { | 
|  | Diag::new(dcx, level, fluent::errors_target_invalid_address_space) | 
|  | .with_arg("addr_space", addr_space) | 
|  | .with_arg("cause", cause) | 
|  | .with_arg("err", err) | 
|  | } | 
|  | TargetDataLayoutErrors::InvalidBits { kind, bit, cause, err } => { | 
|  | Diag::new(dcx, level, fluent::errors_target_invalid_bits) | 
|  | .with_arg("kind", kind) | 
|  | .with_arg("bit", bit) | 
|  | .with_arg("cause", cause) | 
|  | .with_arg("err", err) | 
|  | } | 
|  | TargetDataLayoutErrors::MissingAlignment { cause } => { | 
|  | Diag::new(dcx, level, fluent::errors_target_missing_alignment) | 
|  | .with_arg("cause", cause) | 
|  | } | 
|  | TargetDataLayoutErrors::InvalidAlignment { cause, err } => { | 
|  | Diag::new(dcx, level, fluent::errors_target_invalid_alignment) | 
|  | .with_arg("cause", cause) | 
|  | .with_arg("err_kind", err.diag_ident()) | 
|  | .with_arg("align", err.align()) | 
|  | } | 
|  | TargetDataLayoutErrors::InconsistentTargetArchitecture { dl, target } => { | 
|  | Diag::new(dcx, level, fluent::errors_target_inconsistent_architecture) | 
|  | .with_arg("dl", dl) | 
|  | .with_arg("target", target) | 
|  | } | 
|  | TargetDataLayoutErrors::InconsistentTargetPointerWidth { pointer_size, target } => { | 
|  | Diag::new(dcx, level, fluent::errors_target_inconsistent_pointer_width) | 
|  | .with_arg("pointer_size", pointer_size) | 
|  | .with_arg("target", target) | 
|  | } | 
|  | TargetDataLayoutErrors::InvalidBitsSize { err } => { | 
|  | Diag::new(dcx, level, fluent::errors_target_invalid_bits_size).with_arg("err", err) | 
|  | } | 
|  | TargetDataLayoutErrors::UnknownPointerSpecification { err } => { | 
|  | Diag::new(dcx, level, fluent::errors_target_invalid_datalayout_pointer_spec) | 
|  | .with_arg("err", err) | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | /// Utility struct used to apply a single label while highlighting multiple spans | 
|  | pub struct SingleLabelManySpans { | 
|  | pub spans: Vec<Span>, | 
|  | pub label: &'static str, | 
|  | } | 
|  | impl Subdiagnostic for SingleLabelManySpans { | 
|  | fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) { | 
|  | diag.span_labels(self.spans, self.label); | 
|  | } | 
|  | } | 
|  |  | 
|  | #[derive(Subdiagnostic)] | 
|  | #[label(errors_expected_lifetime_parameter)] | 
|  | pub struct ExpectedLifetimeParameter { | 
|  | #[primary_span] | 
|  | pub span: Span, | 
|  | pub count: usize, | 
|  | } | 
|  |  | 
|  | #[derive(Subdiagnostic)] | 
|  | #[suggestion(errors_indicate_anonymous_lifetime, code = "{suggestion}", style = "verbose")] | 
|  | pub struct IndicateAnonymousLifetime { | 
|  | #[primary_span] | 
|  | pub span: Span, | 
|  | pub count: usize, | 
|  | pub suggestion: String, | 
|  | } | 
|  |  | 
|  | #[derive(Subdiagnostic)] | 
|  | pub struct ElidedLifetimeInPathSubdiag { | 
|  | #[subdiagnostic] | 
|  | pub expected: ExpectedLifetimeParameter, | 
|  | #[subdiagnostic] | 
|  | pub indicate: Option<IndicateAnonymousLifetime>, | 
|  | } |