use std::io::Error; use std::path::{Path, PathBuf}; use rustc_errors::codes::*; use rustc_errors::{ Applicability, Diag, DiagCtxtHandle, DiagSymbolList, Diagnostic, EmissionGuarantee, Level, MultiSpan, Subdiagnostic, }; use rustc_hir::Target; use rustc_hir::attrs::{MirDialect, MirPhase}; use rustc_macros::{Diagnostic, LintDiagnostic, Subdiagnostic}; use rustc_middle::ty::{MainDefinition, Ty}; use rustc_span::{DUMMY_SP, Span, Symbol}; 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_incorrect_do_not_recommend_args)] pub(crate) struct DoNotRecommendDoesNotExpectArgs; #[derive(Diagnostic)] #[diag(passes_autodiff_attr)] pub(crate) struct AutoDiffAttr { #[primary_span] #[label] pub attr_span: Span, } #[derive(Diagnostic)] #[diag(passes_loop_match_attr)] pub(crate) struct LoopMatchAttr { #[primary_span] pub attr_span: Span, #[label] pub node_span: Span, } #[derive(Diagnostic)] #[diag(passes_const_continue_attr)] pub(crate) struct ConstContinueAttr { #[primary_span] pub attr_span: Span, #[label] pub node_span: Span, } #[derive(LintDiagnostic)] #[diag(passes_mixed_export_name_and_no_mangle)] pub(crate) struct MixedExportNameAndNoMangle { #[label] #[suggestion(style = "verbose", code = "", applicability = "machine-applicable")] pub no_mangle_span: Span, #[note] pub export_name_span: Span, pub no_mangle_attr: &'static str, pub export_name_attr: &'static str, } #[derive(LintDiagnostic)] #[diag(passes_outer_crate_level_attr)] pub(crate) struct OuterCrateLevelAttr { #[subdiagnostic] pub suggestion: OuterCrateLevelAttrSuggestion, } #[derive(Subdiagnostic)] #[multipart_suggestion(passes_outer_crate_level_attr_suggestion, style = "verbose")] pub(crate) struct OuterCrateLevelAttrSuggestion { #[suggestion_part(code = "!")] pub bang_position: Span, } #[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(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_non_exhaustive_with_default_field_values)] pub(crate) struct NonExhaustiveWithDefaultFieldValues { #[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(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_attribute_empty_mod)] pub(crate) struct DocKeywordAttributeEmptyMod { #[primary_span] pub span: Span, pub attr_name: &'static str, } #[derive(Diagnostic)] #[diag(passes_doc_keyword_not_keyword)] #[help] pub(crate) struct DocKeywordNotKeyword { #[primary_span] pub span: Span, pub keyword: Symbol, } #[derive(Diagnostic)] #[diag(passes_doc_attribute_not_attribute)] #[help] pub(crate) struct DocAttributeNotAttribute { #[primary_span] pub span: Span, pub attribute: Symbol, } #[derive(Diagnostic)] #[diag(passes_doc_keyword_attribute_not_mod)] pub(crate) struct DocKeywordAttributeNotMod { #[primary_span] pub span: Span, pub attr_name: &'static str, } #[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_search_unbox_invalid)] pub(crate) struct DocSearchUnboxInvalid { #[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_passes)] #[note] #[help] #[note(passes_no_op_note)] pub(crate) struct DocTestUnknownPasses { pub path: String, #[label] pub span: Span, } #[derive(LintDiagnostic)] #[diag(passes_doc_test_unknown_plugins)] #[note] #[note(passes_no_op_note)] pub(crate) struct DocTestUnknownPlugins { pub path: String, #[label] 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_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_must_not_suspend)] pub(crate) struct MustNotSuspend { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(LintDiagnostic)] #[diag(passes_link)] #[warning] pub(crate) struct Link { #[label] pub span: Option, } #[derive(Diagnostic)] #[diag(passes_no_link)] pub(crate) struct NoLink { #[primary_span] pub attr_span: Span, #[label] pub 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(Diagnostic)] #[diag(passes_repr_conflicting, code = E0566)] pub(crate) struct ReprConflicting { #[primary_span] pub hint_spans: Vec, } #[derive(Diagnostic)] #[diag(passes_repr_align_greater_than_target_max, code = E0589)] #[note] pub(crate) struct InvalidReprAlignForTarget { #[primary_span] pub span: Span, pub size: u64, } #[derive(LintDiagnostic)] #[diag(passes_repr_conflicting, code = E0566)] pub(crate) struct ReprConflictingLint; #[derive(Diagnostic)] #[diag(passes_macro_only_attribute)] pub(crate) struct MacroOnlyAttribute { #[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_pub_transparent)] pub(crate) struct RustcPubTransparent { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_rustc_force_inline_coro)] pub(crate) struct RustcForceInlineCoro { #[primary_span] pub attr_span: Span, #[label] pub span: Span, } #[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)] InvalidArgument, #[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, #[note(passes_unused_linker_messages_note)] LinkerMessagesBinaryCrateOnly, } #[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<'tcx> { #[primary_span] pub span: Span, pub normalized_ty: Ty<'tcx>, 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_argument)] pub(crate) struct UnrecognizedArgument { #[primary_span] pub span: Span, } #[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, } #[derive(Diagnostic)] #[diag(passes_attr_only_in_functions)] pub(crate) struct AttrOnlyInFunctions { #[primary_span] pub span: Span, pub attr: Symbol, } #[derive(Diagnostic)] #[diag(passes_multiple_rustc_main, code = E0137)] pub(crate) struct MultipleRustcMain { #[primary_span] pub span: Span, #[label(passes_first)] pub first: Span, #[label(passes_additional)] pub additional: Span, } #[derive(Diagnostic)] #[diag(passes_extern_main)] pub(crate) struct ExternMain { #[primary_span] pub span: Span, } pub(crate) struct NoMainErr { pub sp: Span, pub crate_name: Symbol, pub has_filename: bool, pub filename: PathBuf, pub file_empty: bool, pub non_main_fns: Vec, pub main_def_opt: Option, pub add_teach_note: bool, } impl<'a, G: EmissionGuarantee> Diagnostic<'a, G> for NoMainErr { #[track_caller] fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, G> { let mut diag = Diag::new(dcx, level, fluent::passes_no_main_function); diag.span(DUMMY_SP); diag.code(E0601); diag.arg("crate_name", self.crate_name); diag.arg("filename", self.filename); diag.arg("has_filename", self.has_filename); let note = if !self.non_main_fns.is_empty() { for &span in &self.non_main_fns { diag.span_note(span, fluent::passes_here_is_main); } diag.note(fluent::passes_one_or_more_possible_main); diag.help(fluent::passes_consider_moving_main); // There were some functions named `main` though. Try to give the user a hint. fluent::passes_main_must_be_defined_at_crate } else if self.has_filename { fluent::passes_consider_adding_main_to_file } else { fluent::passes_consider_adding_main_at_crate }; if self.file_empty { diag.note(note); } else { diag.span(self.sp.shrink_to_hi()); diag.span_label(self.sp.shrink_to_hi(), note); } if let Some(main_def) = self.main_def_opt && main_def.opt_fn_def_id().is_none() { // There is something at `crate::main`, but it is not a function definition. diag.span_label(main_def.span, fluent::passes_non_function_main); } if self.add_teach_note { diag.note(fluent::passes_teach_note); } diag } } pub(crate) struct DuplicateLangItem { pub local_span: Option, pub lang_item_name: Symbol, pub crate_name: Symbol, pub dependency_of: Option, pub is_local: bool, pub path: String, pub first_defined_span: Option, pub orig_crate_name: Option, pub orig_dependency_of: Option, pub orig_is_local: bool, pub orig_path: String, pub(crate) duplicate: Duplicate, } impl Diagnostic<'_, G> for DuplicateLangItem { #[track_caller] fn into_diag(self, dcx: DiagCtxtHandle<'_>, level: Level) -> Diag<'_, G> { let mut diag = Diag::new( dcx, level, match self.duplicate { Duplicate::Plain => fluent::passes_duplicate_lang_item, Duplicate::Crate => fluent::passes_duplicate_lang_item_crate, Duplicate::CrateDepends => fluent::passes_duplicate_lang_item_crate_depends, }, ); diag.code(E0152); diag.arg("lang_item_name", self.lang_item_name); diag.arg("crate_name", self.crate_name); if let Some(dependency_of) = self.dependency_of { diag.arg("dependency_of", dependency_of); } diag.arg("path", self.path); if let Some(orig_crate_name) = self.orig_crate_name { diag.arg("orig_crate_name", orig_crate_name); } if let Some(orig_dependency_of) = self.orig_dependency_of { diag.arg("orig_dependency_of", orig_dependency_of); } diag.arg("orig_path", self.orig_path); if let Some(span) = self.local_span { diag.span(span); } if let Some(span) = self.first_defined_span { diag.span_note(span, fluent::passes_first_defined_span); } else { if self.orig_dependency_of.is_none() { diag.note(fluent::passes_first_defined_crate); } else { diag.note(fluent::passes_first_defined_crate_depends); } if self.orig_is_local { diag.note(fluent::passes_first_definition_local); } else { diag.note(fluent::passes_first_definition_path); } if self.is_local { diag.note(fluent::passes_second_definition_local); } else { diag.note(fluent::passes_second_definition_path); } } diag } } #[derive(Diagnostic)] #[diag(passes_incorrect_target, code = E0718)] pub(crate) struct IncorrectTarget<'a> { #[primary_span] pub span: Span, #[label] pub generics_span: Span, pub name: &'a str, // cannot be symbol because it renders e.g. `r#fn` instead of `fn` pub kind: &'static str, pub num: usize, pub actual_num: usize, pub at_least: bool, } #[derive(Diagnostic)] #[diag(passes_incorrect_crate_type)] pub(crate) struct IncorrectCrateType { #[primary_span] pub span: Span, } #[derive(LintDiagnostic)] #[diag(passes_useless_assignment)] pub(crate) struct UselessAssignment<'a> { pub is_field_assign: bool, pub ty: Ty<'a>, } #[derive(LintDiagnostic)] #[diag(passes_inline_ignored_for_exported)] #[help] pub(crate) struct InlineIgnoredForExported {} #[derive(Diagnostic)] #[diag(passes_object_lifetime_err)] pub(crate) struct ObjectLifetimeErr { #[primary_span] pub span: Span, pub repr: String, } #[derive(Diagnostic)] pub(crate) enum AttrApplication { #[diag(passes_attr_application_enum, code = E0517)] Enum { #[primary_span] hint_span: Span, #[label] span: Span, }, #[diag(passes_attr_application_struct, code = E0517)] Struct { #[primary_span] hint_span: Span, #[label] span: Span, }, #[diag(passes_attr_application_struct_union, code = E0517)] StructUnion { #[primary_span] hint_span: Span, #[label] span: Span, }, #[diag(passes_attr_application_struct_enum_union, code = E0517)] StructEnumUnion { #[primary_span] hint_span: Span, #[label] span: Span, }, } #[derive(Diagnostic)] #[diag(passes_transparent_incompatible, code = E0692)] pub(crate) struct TransparentIncompatible { #[primary_span] pub hint_spans: Vec, pub target: String, } #[derive(Diagnostic)] #[diag(passes_deprecated_attribute, code = E0549)] pub(crate) struct DeprecatedAttribute { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_useless_stability)] pub(crate) struct UselessStability { #[primary_span] #[label] pub span: Span, #[label(passes_item)] pub item_sp: Span, } #[derive(Diagnostic)] #[diag(passes_cannot_stabilize_deprecated)] pub(crate) struct CannotStabilizeDeprecated { #[primary_span] #[label] pub span: Span, #[label(passes_item)] pub item_sp: Span, } #[derive(Diagnostic)] #[diag(passes_unstable_attr_for_already_stable_feature)] pub(crate) struct UnstableAttrForAlreadyStableFeature { #[primary_span] #[label] #[help] pub attr_span: Span, #[label(passes_item)] pub item_span: Span, } #[derive(Diagnostic)] #[diag(passes_missing_stability_attr)] pub(crate) struct MissingStabilityAttr<'a> { #[primary_span] pub span: Span, pub descr: &'a str, } #[derive(Diagnostic)] #[diag(passes_missing_const_stab_attr)] pub(crate) struct MissingConstStabAttr<'a> { #[primary_span] pub span: Span, pub descr: &'a str, } #[derive(Diagnostic)] #[diag(passes_trait_impl_const_stable)] #[note] pub(crate) struct TraitImplConstStable { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_trait_impl_const_stability_mismatch)] pub(crate) struct TraitImplConstStabilityMismatch { #[primary_span] pub span: Span, #[subdiagnostic] pub impl_stability: ImplConstStability, #[subdiagnostic] pub trait_stability: TraitConstStability, } #[derive(Subdiagnostic)] pub(crate) enum TraitConstStability { #[note(passes_trait_impl_const_stability_mismatch_trait_stable)] Stable { #[primary_span] span: Span, }, #[note(passes_trait_impl_const_stability_mismatch_trait_unstable)] Unstable { #[primary_span] span: Span, }, } #[derive(Subdiagnostic)] pub(crate) enum ImplConstStability { #[note(passes_trait_impl_const_stability_mismatch_impl_stable)] Stable { #[primary_span] span: Span, }, #[note(passes_trait_impl_const_stability_mismatch_impl_unstable)] Unstable { #[primary_span] span: Span, }, } #[derive(Diagnostic)] #[diag(passes_unknown_feature, code = E0635)] pub(crate) struct UnknownFeature { #[primary_span] pub span: Span, pub feature: Symbol, } #[derive(Diagnostic)] #[diag(passes_unknown_feature_alias, code = E0635)] pub(crate) struct RenamedFeature { #[primary_span] pub span: Span, pub feature: Symbol, pub alias: Symbol, } #[derive(Diagnostic)] #[diag(passes_implied_feature_not_exist)] pub(crate) struct ImpliedFeatureNotExist { #[primary_span] pub span: Span, pub feature: Symbol, pub implied_by: Symbol, } #[derive(Diagnostic)] #[diag(passes_duplicate_feature_err, code = E0636)] pub(crate) struct DuplicateFeatureErr { #[primary_span] pub span: Span, pub feature: Symbol, } #[derive(Diagnostic)] #[diag(passes_missing_const_err)] pub(crate) struct MissingConstErr { #[primary_span] #[help] pub fn_sig_span: Span, } #[derive(Diagnostic)] #[diag(passes_const_stable_not_stable)] pub(crate) struct ConstStableNotStable { #[primary_span] pub fn_sig_span: Span, #[label] pub const_span: Span, } #[derive(LintDiagnostic)] pub(crate) enum MultipleDeadCodes<'tcx> { #[diag(passes_dead_codes)] DeadCodes { multiple: bool, num: usize, descr: &'tcx str, participle: &'tcx str, name_list: DiagSymbolList, #[subdiagnostic] // only on DeadCodes since it's never a problem for tuple struct fields enum_variants_with_same_name: Vec>, #[subdiagnostic] parent_info: Option>, #[subdiagnostic] ignored_derived_impls: Option, }, #[diag(passes_dead_codes)] UnusedTupleStructFields { multiple: bool, num: usize, descr: &'tcx str, participle: &'tcx str, name_list: DiagSymbolList, #[subdiagnostic] change_fields_suggestion: ChangeFields, #[subdiagnostic] parent_info: Option>, #[subdiagnostic] ignored_derived_impls: Option, }, } #[derive(Subdiagnostic)] #[note(passes_enum_variant_same_name)] pub(crate) struct EnumVariantSameName<'tcx> { #[primary_span] pub variant_span: Span, pub dead_name: Symbol, pub dead_descr: &'tcx str, } #[derive(Subdiagnostic)] #[label(passes_parent_info)] pub(crate) struct ParentInfo<'tcx> { pub num: usize, pub descr: &'tcx str, pub parent_descr: &'tcx str, #[primary_span] pub span: Span, } #[derive(Subdiagnostic)] #[note(passes_ignored_derived_impls)] pub(crate) struct IgnoredDerivedImpls { pub name: Symbol, pub trait_list: DiagSymbolList, pub trait_list_len: usize, } #[derive(Subdiagnostic)] pub(crate) enum ChangeFields { #[multipart_suggestion( passes_change_fields_to_be_of_unit_type, applicability = "has-placeholders" )] ChangeToUnitTypeOrRemove { num: usize, #[suggestion_part(code = "()")] spans: Vec, }, #[help(passes_remove_fields)] Remove { num: usize }, } #[derive(Diagnostic)] #[diag(passes_proc_macro_bad_sig)] pub(crate) struct ProcMacroBadSig { #[primary_span] pub span: Span, pub kind: ProcMacroKind, } #[derive(LintDiagnostic)] #[diag(passes_unreachable_due_to_uninhabited)] pub(crate) struct UnreachableDueToUninhabited<'desc, 'tcx> { pub descr: &'desc str, #[label] pub expr: Span, #[label(passes_label_orig)] #[note] pub orig: Span, pub ty: Ty<'tcx>, } #[derive(LintDiagnostic)] #[diag(passes_unused_var_maybe_capture_ref)] #[help] pub(crate) struct UnusedVarMaybeCaptureRef { pub name: String, } #[derive(LintDiagnostic)] #[diag(passes_unused_capture_maybe_capture_ref)] #[help] pub(crate) struct UnusedCaptureMaybeCaptureRef { pub name: String, } #[derive(LintDiagnostic)] #[diag(passes_unused_var_remove_field)] pub(crate) struct UnusedVarRemoveField { pub name: String, #[subdiagnostic] pub sugg: UnusedVarRemoveFieldSugg, } #[derive(Subdiagnostic)] #[multipart_suggestion( passes_unused_var_remove_field_suggestion, applicability = "machine-applicable" )] pub(crate) struct UnusedVarRemoveFieldSugg { #[suggestion_part(code = "")] pub spans: Vec, } #[derive(LintDiagnostic)] #[diag(passes_unused_var_assigned_only)] #[note] pub(crate) struct UnusedVarAssignedOnly { pub name: String, #[subdiagnostic] pub typo: Option, } #[derive(Subdiagnostic)] #[multipart_suggestion( passes_unused_var_typo, style = "verbose", applicability = "machine-applicable" )] pub(crate) struct PatternTypo { #[suggestion_part(code = "{code}")] pub span: Span, pub code: String, pub item_name: String, pub kind: String, } #[derive(LintDiagnostic)] #[diag(passes_unnecessary_stable_feature)] pub(crate) struct UnnecessaryStableFeature { pub feature: Symbol, pub since: Symbol, } #[derive(LintDiagnostic)] #[diag(passes_unnecessary_partial_stable_feature)] pub(crate) struct UnnecessaryPartialStableFeature { #[suggestion(code = "{implies}", applicability = "maybe-incorrect")] pub span: Span, #[suggestion(passes_suggestion_remove, code = "", applicability = "maybe-incorrect")] pub line: Span, pub feature: Symbol, pub since: Symbol, pub implies: Symbol, } #[derive(LintDiagnostic)] #[diag(passes_ineffective_unstable_impl)] #[note] pub(crate) struct IneffectiveUnstableImpl; #[derive(LintDiagnostic)] #[diag(passes_unused_assign)] pub(crate) struct UnusedAssign { pub name: String, #[subdiagnostic] pub suggestion: Option, #[help] pub help: bool, } #[derive(Subdiagnostic)] #[multipart_suggestion(passes_unused_assign_suggestion, applicability = "maybe-incorrect")] pub(crate) struct UnusedAssignSuggestion { pub pre: &'static str, #[suggestion_part(code = "{pre}mut ")] pub ty_span: Option, #[suggestion_part(code = "")] pub ty_ref_span: Span, #[suggestion_part(code = "*")] pub ident_span: Span, #[suggestion_part(code = "")] pub expr_ref_span: Span, } #[derive(LintDiagnostic)] #[diag(passes_unused_assign_passed)] #[help] pub(crate) struct UnusedAssignPassed { pub name: String, } #[derive(LintDiagnostic)] #[diag(passes_unused_variable_try_prefix)] pub(crate) struct UnusedVariableTryPrefix { #[label] pub label: Option, #[subdiagnostic] pub string_interp: Vec, #[subdiagnostic] pub sugg: UnusedVariableSugg, pub name: String, #[subdiagnostic] pub typo: Option, } #[derive(Subdiagnostic)] pub(crate) enum UnusedVariableSugg { #[multipart_suggestion(passes_suggestion, applicability = "maybe-incorrect")] TryPrefixSugg { #[suggestion_part(code = "_{name}")] spans: Vec, name: String, }, #[help(passes_unused_variable_args_in_macro)] NoSugg { #[primary_span] span: Span, name: String, }, } pub(crate) struct UnusedVariableStringInterp { pub lit: Span, pub lo: Span, pub hi: Span, } impl Subdiagnostic for UnusedVariableStringInterp { fn add_to_diag(self, diag: &mut Diag<'_, G>) { diag.span_label(self.lit, crate::fluent_generated::passes_maybe_string_interpolation); diag.multipart_suggestion( crate::fluent_generated::passes_string_interpolation_only_works, vec![(self.lo, String::from("format!(")), (self.hi, String::from(")"))], Applicability::MachineApplicable, ); } } #[derive(LintDiagnostic)] #[diag(passes_unused_variable_try_ignore)] pub(crate) struct UnusedVarTryIgnore { pub name: String, #[subdiagnostic] pub sugg: UnusedVarTryIgnoreSugg, } #[derive(Subdiagnostic)] #[multipart_suggestion(passes_suggestion, applicability = "maybe-incorrect")] pub(crate) struct UnusedVarTryIgnoreSugg { #[suggestion_part(code = "{name}: _")] pub shorthands: Vec, #[suggestion_part(code = "_")] pub non_shorthands: Vec, pub name: String, } #[derive(LintDiagnostic)] #[diag(passes_attr_crate_level)] #[note] pub(crate) struct AttrCrateLevelOnly { #[subdiagnostic] pub sugg: Option, } #[derive(Subdiagnostic)] #[suggestion(passes_suggestion, applicability = "maybe-incorrect", code = "!", style = "verbose")] pub(crate) struct AttrCrateLevelOnlySugg { #[primary_span] pub attr: Span, } /// "sanitize attribute not allowed here" #[derive(Diagnostic)] #[diag(passes_sanitize_attribute_not_allowed)] pub(crate) struct SanitizeAttributeNotAllowed { #[primary_span] pub attr_span: Span, /// "not a function, impl block, or module" #[label(passes_not_fn_impl_mod)] pub not_fn_impl_mod: Option, /// "function has no body" #[label(passes_no_body)] pub no_body: Option, /// "sanitize attribute can be applied to a function (with body), impl block, or module" #[help] pub help: (), } // FIXME(jdonszelmann): move back to rustc_attr #[derive(Diagnostic)] #[diag(passes_rustc_const_stable_indirect_pairing)] pub(crate) struct RustcConstStableIndirectPairing { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(passes_unsupported_attributes_in_where)] #[help] pub(crate) struct UnsupportedAttributesInWhere { #[primary_span] pub span: MultiSpan, } #[derive(Diagnostic)] pub(crate) enum UnexportableItem<'a> { #[diag(passes_unexportable_item)] Item { #[primary_span] span: Span, descr: &'a str, }, #[diag(passes_unexportable_generic_fn)] GenericFn(#[primary_span] Span), #[diag(passes_unexportable_fn_abi)] FnAbi(#[primary_span] Span), #[diag(passes_unexportable_type_repr)] TypeRepr(#[primary_span] Span), #[diag(passes_unexportable_type_in_interface)] TypeInInterface { #[primary_span] span: Span, desc: &'a str, ty: &'a str, #[label] ty_span: Span, }, #[diag(passes_unexportable_priv_item)] PrivItem { #[primary_span] span: Span, #[note] vis_note: Span, vis_descr: &'a str, }, #[diag(passes_unexportable_adt_with_private_fields)] AdtWithPrivFields { #[primary_span] span: Span, #[note] vis_note: Span, field_name: &'a str, }, } #[derive(Diagnostic)] #[diag(passes_repr_align_should_be_align)] pub(crate) struct ReprAlignShouldBeAlign { #[primary_span] #[help] pub span: Span, pub item: &'static str, } #[derive(Diagnostic)] #[diag(passes_repr_align_should_be_align_static)] pub(crate) struct ReprAlignShouldBeAlignStatic { #[primary_span] #[help] pub span: Span, pub item: &'static str, } #[derive(Diagnostic)] #[diag(passes_custom_mir_phase_requires_dialect)] pub(crate) struct CustomMirPhaseRequiresDialect { #[primary_span] pub attr_span: Span, #[label] pub phase_span: Span, } #[derive(Diagnostic)] #[diag(passes_custom_mir_incompatible_dialect_and_phase)] pub(crate) struct CustomMirIncompatibleDialectAndPhase { pub dialect: MirDialect, pub phase: MirPhase, #[primary_span] pub attr_span: Span, #[label] pub dialect_span: Span, #[label] pub phase_span: Span, }