use std::io::Error; use std::path::{Path, PathBuf}; use rustc_ast::Label; use rustc_errors::codes::*; use rustc_errors::{ Applicability, Diag, DiagCtxtHandle, DiagSymbolList, Diagnostic, EmissionGuarantee, Level, MultiSpan, SubdiagMessageOp, Subdiagnostic, }; use rustc_hir::{self as hir, ExprKind, Target}; use rustc_macros::{Diagnostic, LintDiagnostic, Subdiagnostic}; use rustc_middle::ty::{MainDefinition, Ty}; use rustc_span::{Span, Symbol, DUMMY_SP}; use crate::check_attr::ProcMacroKind; use crate::fluent_generated as fluent; use crate::lang_items::Duplicate; #[derive(LintDiagnostic)] #[diag(passes_incorrect_do_not_recommend_location)] pub(crate) struct IncorrectDoNotRecommendLocation; #[derive(LintDiagnostic)] #[diag(passes_outer_crate_level_attr)] pub(crate) struct OuterCrateLevelAttr; #[derive(LintDiagnostic)] #[diag(passes_inner_crate_level_attr)] pub(crate) struct InnerCrateLevelAttr; #[derive(LintDiagnostic)] #[diag(passes_ignored_attr_with_macro)] pub(crate) struct IgnoredAttrWithMacro<'a> { pub sym: &'a str, } #[derive(LintDiagnostic)] #[diag(passes_ignored_attr)] pub(crate) struct IgnoredAttr<'a> { pub sym: &'a str, } #[derive(LintDiagnostic)] #[diag(passes_inline_ignored_function_prototype)] pub(crate) struct IgnoredInlineAttrFnProto; #[derive(LintDiagnostic)] #[diag(passes_inline_ignored_constants)] #[warning] #[note] pub(crate) struct IgnoredInlineAttrConstants; #[derive(Diagnostic)] #[diag(passes_inline_not_fn_or_closure, code = E0518)] pub(crate) struct InlineNotFnOrClosure { #[primary_span] pub attr_span: Span, #[label] pub defn_span: Span, } #[derive(Diagnostic)] #[diag(passes_coverage_not_fn_or_closure, code = E0788)] pub(crate) struct CoverageNotFnOrClosure { #[primary_span] pub attr_span: Span, #[label] pub defn_span: Span, } #[derive(LintDiagnostic)] #[diag(passes_optimize_not_fn_or_closure)] pub(crate) struct OptimizeNotFnOrClosure; #[derive(Diagnostic)] #[diag(passes_should_be_applied_to_fn)] pub(crate) struct AttrShouldBeAppliedToFn { #[primary_span] pub attr_span: Span, #[label] pub defn_span: Span, pub on_crate: bool, } #[derive(Diagnostic)] #[diag(passes_should_be_applied_to_fn, code = E0739)] pub(crate) struct TrackedCallerWrongLocation { #[primary_span] pub attr_span: Span, #[label] pub defn_span: Span, pub on_crate: bool, } #[derive(Diagnostic)] #[diag(passes_should_be_applied_to_struct_enum, code = E0701)] pub(crate) struct NonExhaustiveWrongLocation { #[primary_span] pub attr_span: Span, #[label] pub defn_span: Span, } #[derive(Diagnostic)] #[diag(passes_should_be_applied_to_trait)] pub(crate) struct AttrShouldBeAppliedToTrait { #[primary_span] pub attr_span: Span, #[label] pub defn_span: Span, } #[derive(LintDiagnostic)] #[diag(passes_target_feature_on_statement)] pub(crate) struct TargetFeatureOnStatement; #[derive(Diagnostic)] #[diag(passes_should_be_applied_to_static)] pub(crate) struct AttrShouldBeAppliedToStatic { #[primary_span] pub attr_span: Span, #[label] pub defn_span: Span, } #[derive(Diagnostic)] #[diag(passes_doc_expect_str)] pub(crate) struct DocExpectStr<'a> { #[primary_span] pub attr_span: Span, pub attr_name: &'a str, } #[derive(Diagnostic)] #[diag(passes_doc_alias_empty)] pub(crate) struct DocAliasEmpty<'a> { #[primary_span] pub span: Span, pub attr_str: &'a str, } #[derive(Diagnostic)] #[diag(passes_doc_alias_bad_char)] pub(crate) struct DocAliasBadChar<'a> { #[primary_span] pub span: Span, pub attr_str: &'a str, pub char_: char, } #[derive(Diagnostic)] #[diag(passes_doc_alias_start_end)] pub(crate) struct DocAliasStartEnd<'a> { #[primary_span] pub span: Span, pub attr_str: &'a str, } #[derive(Diagnostic)] #[diag(passes_doc_alias_bad_location)] pub(crate) struct DocAliasBadLocation<'a> { #[primary_span] pub span: Span, pub attr_str: &'a str, pub location: &'a str, } #[derive(Diagnostic)] #[diag(passes_doc_alias_not_an_alias)] pub(crate) struct DocAliasNotAnAlias<'a> { #[primary_span] pub span: Span, pub attr_str: &'a str, } #[derive(LintDiagnostic)] #[diag(passes_doc_alias_duplicated)] pub(crate) struct DocAliasDuplicated { #[label] pub first_defn: Span, } #[derive(Diagnostic)] #[diag(passes_doc_alias_not_string_literal)] pub(crate) struct DocAliasNotStringLiteral { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_doc_alias_malformed)] pub(crate) struct DocAliasMalformed { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_doc_keyword_empty_mod)] pub(crate) struct DocKeywordEmptyMod { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_doc_keyword_not_mod)] pub(crate) struct DocKeywordNotMod { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_doc_keyword_invalid_ident)] pub(crate) struct DocKeywordInvalidIdent { #[primary_span] pub span: Span, pub doc_keyword: Symbol, } #[derive(Diagnostic)] #[diag(passes_doc_fake_variadic_not_valid)] pub(crate) struct DocFakeVariadicNotValid { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_doc_keyword_only_impl)] pub(crate) struct DocKeywordOnlyImpl { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_doc_inline_conflict)] #[help] pub(crate) struct DocKeywordConflict { #[primary_span] pub spans: MultiSpan, } #[derive(LintDiagnostic)] #[diag(passes_doc_inline_only_use)] #[note] pub(crate) struct DocInlineOnlyUse { #[label] pub attr_span: Span, #[label(passes_not_a_use_item_label)] pub item_span: Option, } #[derive(LintDiagnostic)] #[diag(passes_doc_masked_only_extern_crate)] #[note] pub(crate) struct DocMaskedOnlyExternCrate { #[label] pub attr_span: Span, #[label(passes_not_an_extern_crate_label)] pub item_span: Option, } #[derive(LintDiagnostic)] #[diag(passes_doc_masked_not_extern_crate_self)] pub(crate) struct DocMaskedNotExternCrateSelf { #[label] pub attr_span: Span, #[label(passes_extern_crate_self_label)] pub item_span: Option, } #[derive(Diagnostic)] #[diag(passes_doc_attr_not_crate_level)] pub(crate) struct DocAttrNotCrateLevel<'a> { #[primary_span] pub span: Span, pub attr_name: &'a str, } #[derive(LintDiagnostic)] #[diag(passes_doc_test_unknown)] pub(crate) struct DocTestUnknown { pub path: String, } #[derive(LintDiagnostic)] #[diag(passes_doc_test_literal)] pub(crate) struct DocTestLiteral; #[derive(LintDiagnostic)] #[diag(passes_doc_test_takes_list)] pub(crate) struct DocTestTakesList; #[derive(LintDiagnostic)] #[diag(passes_doc_cfg_hide_takes_list)] pub(crate) struct DocCfgHideTakesList; #[derive(LintDiagnostic)] #[diag(passes_doc_test_unknown_any)] pub(crate) struct DocTestUnknownAny { pub path: String, } #[derive(LintDiagnostic)] #[diag(passes_doc_test_unknown_spotlight)] #[note] #[note(passes_no_op_note)] pub(crate) struct DocTestUnknownSpotlight { pub path: String, #[suggestion(style = "short", applicability = "machine-applicable", code = "notable_trait")] pub span: Span, } #[derive(LintDiagnostic)] #[diag(passes_doc_test_unknown_include)] pub(crate) struct DocTestUnknownInclude { pub path: String, pub value: String, pub inner: &'static str, #[suggestion(code = "#{inner}[doc = include_str!(\"{value}\")]")] pub sugg: (Span, Applicability), } #[derive(LintDiagnostic)] #[diag(passes_doc_invalid)] pub(crate) struct DocInvalid; #[derive(Diagnostic)] #[diag(passes_pass_by_value)] pub(crate) struct PassByValue { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_allow_incoherent_impl)] pub(crate) struct AllowIncoherentImpl { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_has_incoherent_inherent_impl)] pub(crate) struct HasIncoherentInherentImpl { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_both_ffi_const_and_pure, code = E0757)] pub(crate) struct BothFfiConstAndPure { #[primary_span] pub attr_span: Span, } #[derive(Diagnostic)] #[diag(passes_ffi_pure_invalid_target, code = E0755)] pub(crate) struct FfiPureInvalidTarget { #[primary_span] pub attr_span: Span, } #[derive(Diagnostic)] #[diag(passes_ffi_const_invalid_target, code = E0756)] pub(crate) struct FfiConstInvalidTarget { #[primary_span] pub attr_span: Span, } #[derive(LintDiagnostic)] #[diag(passes_must_use_no_effect)] pub(crate) struct MustUseNoEffect { pub article: &'static str, pub target: rustc_hir::Target, } #[derive(Diagnostic)] #[diag(passes_must_not_suspend)] pub(crate) struct MustNotSuspend { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(LintDiagnostic)] #[diag(passes_cold)] #[warning] pub(crate) struct Cold { #[label] pub span: Span, pub on_crate: bool, } #[derive(LintDiagnostic)] #[diag(passes_link)] #[warning] pub(crate) struct Link { #[label] pub span: Option, } #[derive(LintDiagnostic)] #[diag(passes_link_name)] #[warning] pub(crate) struct LinkName<'a> { #[help] pub attr_span: Option, #[label] pub span: Span, pub value: &'a str, } #[derive(Diagnostic)] #[diag(passes_no_link)] pub(crate) struct NoLink { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_export_name)] pub(crate) struct ExportName { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_rustc_layout_scalar_valid_range_not_struct)] pub(crate) struct RustcLayoutScalarValidRangeNotStruct { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_rustc_layout_scalar_valid_range_arg)] pub(crate) struct RustcLayoutScalarValidRangeArg { #[primary_span] pub attr_span: Span, } #[derive(Diagnostic)] #[diag(passes_rustc_legacy_const_generics_only)] pub(crate) struct RustcLegacyConstGenericsOnly { #[primary_span] pub attr_span: Span, #[label] pub param_span: Span, } #[derive(Diagnostic)] #[diag(passes_rustc_legacy_const_generics_index)] pub(crate) struct RustcLegacyConstGenericsIndex { #[primary_span] pub attr_span: Span, #[label] pub generics_span: Span, } #[derive(Diagnostic)] #[diag(passes_rustc_legacy_const_generics_index_exceed)] pub(crate) struct RustcLegacyConstGenericsIndexExceed { #[primary_span] #[label] pub span: Span, pub arg_count: usize, } #[derive(Diagnostic)] #[diag(passes_rustc_legacy_const_generics_index_negative)] pub(crate) struct RustcLegacyConstGenericsIndexNegative { #[primary_span] pub invalid_args: Vec, } #[derive(Diagnostic)] #[diag(passes_rustc_dirty_clean)] pub(crate) struct RustcDirtyClean { #[primary_span] pub span: Span, } #[derive(LintDiagnostic)] #[diag(passes_link_section)] #[warning] pub(crate) struct LinkSection { #[label] pub span: Span, } #[derive(LintDiagnostic)] #[diag(passes_no_mangle_foreign)] #[warning] #[note] pub(crate) struct NoMangleForeign { #[label] pub span: Span, #[suggestion(code = "", applicability = "machine-applicable")] pub attr_span: Span, pub foreign_item_kind: &'static str, } #[derive(LintDiagnostic)] #[diag(passes_no_mangle)] #[warning] pub(crate) struct NoMangle { #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_repr_ident, code = E0565)] pub(crate) struct ReprIdent { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_repr_conflicting, code = E0566)] pub(crate) struct ReprConflicting { #[primary_span] pub hint_spans: Vec, } #[derive(LintDiagnostic)] #[diag(passes_repr_conflicting, code = E0566)] pub(crate) struct ReprConflictingLint; #[derive(Diagnostic)] #[diag(passes_used_static)] pub(crate) struct UsedStatic { #[primary_span] pub attr_span: Span, #[label] pub span: Span, pub target: &'static str, } #[derive(Diagnostic)] #[diag(passes_used_compiler_linker)] pub(crate) struct UsedCompilerLinker { #[primary_span] pub spans: Vec, } #[derive(Diagnostic)] #[diag(passes_allow_internal_unstable)] pub(crate) struct AllowInternalUnstable { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_debug_visualizer_placement)] pub(crate) struct DebugVisualizerPlacement { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_debug_visualizer_invalid)] #[note(passes_note_1)] #[note(passes_note_2)] #[note(passes_note_3)] pub(crate) struct DebugVisualizerInvalid { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_debug_visualizer_unreadable)] pub(crate) struct DebugVisualizerUnreadable<'a> { #[primary_span] pub span: Span, pub file: &'a Path, pub error: Error, } #[derive(Diagnostic)] #[diag(passes_rustc_allow_const_fn_unstable)] pub(crate) struct RustcAllowConstFnUnstable { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_rustc_safe_intrinsic)] pub(crate) struct RustcSafeIntrinsic { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_rustc_std_internal_symbol)] pub(crate) struct RustcStdInternalSymbol { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_rustc_pub_transparent)] pub(crate) struct RustcPubTransparent { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_link_ordinal)] pub(crate) struct LinkOrdinal { #[primary_span] pub attr_span: Span, } #[derive(Diagnostic)] #[diag(passes_confusables)] pub(crate) struct Confusables { #[primary_span] pub attr_span: Span, } #[derive(Diagnostic)] #[diag(passes_coroutine_on_non_closure)] pub(crate) struct CoroutineOnNonClosure { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_linkage)] pub(crate) struct Linkage { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_empty_confusables)] pub(crate) struct EmptyConfusables { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_incorrect_meta_item, code = E0539)] pub(crate) struct IncorrectMetaItem { #[primary_span] pub span: Span, #[subdiagnostic] pub suggestion: IncorrectMetaItemSuggestion, } #[derive(Subdiagnostic)] #[multipart_suggestion(passes_incorrect_meta_item_suggestion, applicability = "maybe-incorrect")] pub(crate) struct IncorrectMetaItemSuggestion { #[suggestion_part(code = "\"")] pub lo: Span, #[suggestion_part(code = "\"")] pub hi: Span, } #[derive(Diagnostic)] #[diag(passes_stability_promotable)] pub(crate) struct StabilityPromotable { #[primary_span] pub attr_span: Span, } #[derive(LintDiagnostic)] #[diag(passes_deprecated)] pub(crate) struct Deprecated; #[derive(LintDiagnostic)] #[diag(passes_macro_use)] pub(crate) struct MacroUse { pub name: Symbol, } #[derive(LintDiagnostic)] pub(crate) enum MacroExport { #[diag(passes_macro_export)] Normal, #[diag(passes_macro_export_on_decl_macro)] #[note] OnDeclMacro, #[diag(passes_invalid_macro_export_arguments)] UnknownItem { name: Symbol }, #[diag(passes_invalid_macro_export_arguments_too_many_items)] TooManyItems, } #[derive(Subdiagnostic)] pub(crate) enum UnusedNote { #[note(passes_unused_empty_lints_note)] EmptyList { name: Symbol }, #[note(passes_unused_no_lints_note)] NoLints { name: Symbol }, #[note(passes_unused_default_method_body_const_note)] DefaultMethodBodyConst, } #[derive(LintDiagnostic)] #[diag(passes_unused)] pub(crate) struct Unused { #[suggestion(code = "", applicability = "machine-applicable")] pub attr_span: Span, #[subdiagnostic] pub note: UnusedNote, } #[derive(Diagnostic)] #[diag(passes_non_exported_macro_invalid_attrs, code = E0518)] pub(crate) struct NonExportedMacroInvalidAttrs { #[primary_span] #[label] pub attr_span: Span, } #[derive(Diagnostic)] #[diag(passes_may_dangle)] pub(crate) struct InvalidMayDangle { #[primary_span] pub attr_span: Span, } #[derive(LintDiagnostic)] #[diag(passes_unused_duplicate)] pub(crate) struct UnusedDuplicate { #[suggestion(code = "", applicability = "machine-applicable")] pub this: Span, #[note] pub other: Span, #[warning] pub warning: bool, } #[derive(Diagnostic)] #[diag(passes_unused_multiple)] pub(crate) struct UnusedMultiple { #[primary_span] #[suggestion(code = "", applicability = "machine-applicable")] pub this: Span, #[note] pub other: Span, pub name: Symbol, } #[derive(Diagnostic)] #[diag(passes_rustc_lint_opt_ty)] pub(crate) struct RustcLintOptTy { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_rustc_lint_opt_deny_field_access)] pub(crate) struct RustcLintOptDenyFieldAccess { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_collapse_debuginfo)] pub(crate) struct CollapseDebuginfo { #[primary_span] pub attr_span: Span, #[label] pub defn_span: Span, } #[derive(LintDiagnostic)] #[diag(passes_deprecated_annotation_has_no_effect)] pub(crate) struct DeprecatedAnnotationHasNoEffect { #[suggestion(applicability = "machine-applicable", code = "")] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_unknown_external_lang_item, code = E0264)] pub(crate) struct UnknownExternLangItem { #[primary_span] pub span: Span, pub lang_item: Symbol, } #[derive(Diagnostic)] #[diag(passes_missing_panic_handler)] pub(crate) struct MissingPanicHandler; #[derive(Diagnostic)] #[diag(passes_panic_unwind_without_std)] #[help] #[note] pub(crate) struct PanicUnwindWithoutStd; #[derive(Diagnostic)] #[diag(passes_missing_lang_item)] #[note] #[help] pub(crate) struct MissingLangItem { pub name: Symbol, } #[derive(Diagnostic)] #[diag(passes_lang_item_fn_with_track_caller)] pub(crate) struct LangItemWithTrackCaller { #[primary_span] pub attr_span: Span, pub name: Symbol, #[label] pub sig_span: Span, } #[derive(Diagnostic)] #[diag(passes_lang_item_fn_with_target_feature)] pub(crate) struct LangItemWithTargetFeature { #[primary_span] pub attr_span: Span, pub name: Symbol, #[label] pub sig_span: Span, } #[derive(Diagnostic)] #[diag(passes_lang_item_on_incorrect_target, code = E0718)] pub(crate) struct LangItemOnIncorrectTarget { #[primary_span] #[label] pub span: Span, pub name: Symbol, pub expected_target: Target, pub actual_target: Target, } #[derive(Diagnostic)] #[diag(passes_unknown_lang_item, code = E0522)] pub(crate) struct UnknownLangItem { #[primary_span] #[label] pub span: Span, pub name: Symbol, } pub(crate) struct InvalidAttrAtCrateLevel { pub span: Span, pub sugg_span: Option, pub name: Symbol, pub item: Option, } #[derive(Clone, Copy)] pub(crate) struct ItemFollowingInnerAttr { pub span: Span, pub kind: &'static str, } impl Diagnostic<'_, G> for InvalidAttrAtCrateLevel { #[track_caller] fn into_diag(self, dcx: DiagCtxtHandle<'_>, level: Level) -> Diag<'_, G> { let mut diag = Diag::new(dcx, level, fluent::passes_invalid_attr_at_crate_level); diag.span(self.span); diag.arg("name", self.name); // Only emit an error with a suggestion if we can create a string out // of the attribute span if let Some(span) = self.sugg_span { diag.span_suggestion_verbose( span, fluent::passes_suggestion, String::new(), Applicability::MachineApplicable, ); } if let Some(item) = self.item { diag.arg("kind", item.kind); diag.span_label(item.span, fluent::passes_invalid_attr_at_crate_level_item); } diag } } #[derive(Diagnostic)] #[diag(passes_duplicate_diagnostic_item_in_crate)] pub(crate) struct DuplicateDiagnosticItemInCrate { #[primary_span] pub duplicate_span: Option, #[note(passes_diagnostic_item_first_defined)] pub orig_span: Option, #[note] pub different_crates: bool, pub crate_name: Symbol, pub orig_crate_name: Symbol, pub name: Symbol, } #[derive(Diagnostic)] #[diag(passes_layout_abi)] pub(crate) struct LayoutAbi { #[primary_span] pub span: Span, pub abi: String, } #[derive(Diagnostic)] #[diag(passes_layout_align)] pub(crate) struct LayoutAlign { #[primary_span] pub span: Span, pub align: String, } #[derive(Diagnostic)] #[diag(passes_layout_size)] pub(crate) struct LayoutSize { #[primary_span] pub span: Span, pub size: String, } #[derive(Diagnostic)] #[diag(passes_layout_homogeneous_aggregate)] pub(crate) struct LayoutHomogeneousAggregate { #[primary_span] pub span: Span, pub homogeneous_aggregate: String, } #[derive(Diagnostic)] #[diag(passes_layout_of)] pub(crate) struct LayoutOf { #[primary_span] pub span: Span, pub normalized_ty: String, pub ty_layout: String, } #[derive(Diagnostic)] #[diag(passes_layout_invalid_attribute)] pub(crate) struct LayoutInvalidAttribute { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_abi_of)] pub(crate) struct AbiOf { #[primary_span] pub span: Span, pub fn_name: Symbol, pub fn_abi: String, } #[derive(Diagnostic)] #[diag(passes_abi_ne)] pub(crate) struct AbiNe { #[primary_span] pub span: Span, pub left: String, pub right: String, } #[derive(Diagnostic)] #[diag(passes_abi_invalid_attribute)] pub(crate) struct AbiInvalidAttribute { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_unrecognized_field)] pub(crate) struct UnrecognizedField { #[primary_span] pub span: Span, pub name: Symbol, } #[derive(Diagnostic)] #[diag(passes_feature_stable_twice, code = E0711)] pub(crate) struct FeatureStableTwice { #[primary_span] pub span: Span, pub feature: Symbol, pub since: Symbol, pub prev_since: Symbol, } #[derive(Diagnostic)] #[diag(passes_feature_previously_declared, code = E0711)] pub(crate) struct FeaturePreviouslyDeclared<'a> { #[primary_span] pub span: Span, pub feature: Symbol, pub declared: &'a str, pub prev_declared: &'a str, } pub(crate) struct BreakNonLoop<'a> { pub span: Span, pub head: Option, pub kind: &'a str, pub suggestion: String, pub loop_label: Option