1 use std::num::NonZeroU32;
3 use rustc_errors::{fluent, AddToDiagnostic, Applicability, DecorateLint, DiagnosticMessage};
4 use rustc_hir::def_id::DefId;
5 use rustc_macros::{LintDiagnostic, Subdiagnostic};
8 ty::{Predicate, Ty, TyCtxt},
10 use rustc_span::{edition::Edition, symbol::Ident, Span, Symbol};
12 use crate::{errors::OverruledAttributeSub, LateContext};
15 #[derive(LintDiagnostic)]
16 #[diag(lint_array_into_iter)]
17 pub struct ArrayIntoIterDiag<'a> {
19 #[suggestion(use_iter_suggestion, code = "iter", applicability = "machine-applicable")]
22 pub sub: Option<ArrayIntoIterDiagSub>,
25 #[derive(Subdiagnostic)]
26 pub enum ArrayIntoIterDiagSub {
27 #[suggestion(remove_into_iter_suggestion, code = "", applicability = "maybe-incorrect")]
32 #[multipart_suggestion(use_explicit_into_iter_suggestion, applicability = "maybe-incorrect")]
34 #[suggestion_part(code = "IntoIterator::into_iter(")]
36 #[suggestion_part(code = ")")]
42 #[derive(LintDiagnostic)]
43 #[diag(lint_builtin_while_true)]
44 pub struct BuiltinWhileTrue {
45 #[suggestion(style = "short", code = "{replace}", applicability = "machine-applicable")]
50 #[derive(LintDiagnostic)]
51 #[diag(lint_builtin_box_pointers)]
52 pub struct BuiltinBoxPointers<'a> {
56 #[derive(LintDiagnostic)]
57 #[diag(lint_builtin_non_shorthand_field_patterns)]
58 pub struct BuiltinNonShorthandFieldPatterns {
60 #[suggestion(code = "{prefix}{ident}", applicability = "machine-applicable")]
62 pub prefix: &'static str,
65 // FIXME: add lint::unsafe_code
67 #[derive(LintDiagnostic)]
68 #[diag(lint_builtin_missing_doc)]
69 pub struct BuiltinMissingDoc<'a> {
74 #[derive(LintDiagnostic)]
75 #[diag(lint_builtin_missing_copy_impl)]
76 pub struct BuiltinMissingCopyImpl;
78 pub struct BuiltinMissingDebugImpl<'a> {
83 impl<'a> DecorateLint<'a, ()> for BuiltinMissingDebugImpl<'_> {
86 diag: &'b mut rustc_errors::DiagnosticBuilder<'a, ()>,
87 ) -> &'b mut rustc_errors::DiagnosticBuilder<'a, ()> {
88 diag.set_arg("debug", self.tcx.def_path_str(self.def_id));
92 fn msg(&self) -> DiagnosticMessage {
93 fluent::lint_builtin_missing_debug_impl
97 #[derive(LintDiagnostic)]
98 #[diag(lint_builtin_anonymous_params)]
99 pub struct BuiltinAnonymousParams<'a> {
100 #[suggestion(code = "_: {ty_snip}")]
101 pub suggestion: (Span, Applicability),
102 pub ty_snip: &'a str,
105 // FIXME: add lint::builtin_deprecated_attr_link
107 #[derive(LintDiagnostic)]
108 #[diag(lint_builtin_deprecated_attr_used)]
109 pub struct BuiltinDeprecatedAttrUsed {
112 lint_builtin_deprecated_attr_default_suggestion,
115 applicability = "machine-applicable"
117 pub suggestion: Span,
120 #[derive(LintDiagnostic)]
121 #[diag(lint_builtin_unused_doc_comment)]
122 pub struct BuiltinUnusedDocComment<'a> {
127 pub sub: BuiltinUnusedDocCommentSub,
130 #[derive(Subdiagnostic)]
131 pub enum BuiltinUnusedDocCommentSub {
138 #[derive(LintDiagnostic)]
139 #[diag(lint_builtin_no_mangle_generic)]
140 pub struct BuiltinNoMangleGeneric {
141 // Use of `#[no_mangle]` suggests FFI intent; correct
142 // fix may be to monomorphize source by hand
143 #[suggestion(style = "short", code = "", applicability = "maybe-incorrect")]
144 pub suggestion: Span,
147 #[derive(LintDiagnostic)]
148 #[diag(lint_builtin_const_no_mangle)]
149 pub struct BuiltinConstNoMangle {
150 #[suggestion(code = "pub static", applicability = "machine-applicable")]
151 pub suggestion: Span,
154 #[derive(LintDiagnostic)]
155 #[diag(lint_builtin_mutable_transmutes)]
156 pub struct BuiltinMutablesTransmutes;
158 #[derive(LintDiagnostic)]
159 #[diag(lint_builtin_unstable_features)]
160 pub struct BuiltinUnstableFeatures;
162 #[derive(LintDiagnostic)]
163 #[diag(lint_builtin_unreachable_pub)]
164 pub struct BuiltinUnreachablePub<'a> {
166 #[suggestion(code = "pub(crate)")]
167 pub suggestion: (Span, Applicability),
169 pub help: Option<()>,
172 // FIXME: migrate builtin_type_alias_where_clause
174 // FIXME: migrate builtin_type_alias_generic_bounds
176 #[derive(LintDiagnostic)]
177 #[diag(lint_builtin_trivial_bounds)]
178 pub struct BuiltinTrivialBounds<'a> {
179 pub predicate_kind_name: &'a str,
180 pub predicate: Predicate<'a>,
183 #[derive(LintDiagnostic)]
184 pub enum BuiltinEllipsisInclusiveRangePatternsLint {
185 #[diag(lint_builtin_ellipsis_inclusive_range_patterns)]
187 #[suggestion(code = "{replace}", applicability = "machine-applicable")]
191 #[diag(lint_builtin_ellipsis_inclusive_range_patterns)]
193 #[suggestion(style = "short", code = "..=", applicability = "machine-applicable")]
198 #[derive(LintDiagnostic)]
199 #[diag(lint_builtin_unnameable_test_items)]
200 pub struct BuiltinUnnameableTestItems;
202 #[derive(LintDiagnostic)]
203 #[diag(lint_builtin_keyword_idents)]
204 pub struct BuiltinKeywordIdents {
207 #[suggestion(code = "r#{kw}", applicability = "machine-applicable")]
208 pub suggestion: Span,
211 #[derive(LintDiagnostic)]
212 #[diag(lint_builtin_explicit_outlives)]
213 pub struct BuiltinExplicitOutlives {
216 pub suggestion: BuiltinExplicitOutlivesSuggestion,
219 #[derive(Subdiagnostic)]
220 #[multipart_suggestion(suggestion)]
221 pub struct BuiltinExplicitOutlivesSuggestion {
222 #[suggestion_part(code = "")]
223 pub spans: Vec<Span>,
225 pub applicability: Applicability,
228 pub struct BuiltinIncompleteFeatures {
230 pub note: Option<NonZeroU32>,
231 pub help: Option<()>,
234 impl<'a> DecorateLint<'a, ()> for BuiltinIncompleteFeatures {
235 fn decorate_lint<'b>(
237 diag: &'b mut rustc_errors::DiagnosticBuilder<'a, ()>,
238 ) -> &'b mut rustc_errors::DiagnosticBuilder<'a, ()> {
239 diag.set_arg("name", self.name);
240 if let Some(n) = self.note {
241 diag.set_arg("n", n);
242 diag.note(fluent::note);
244 if let Some(_) = self.help {
245 diag.help(fluent::help);
250 fn msg(&self) -> DiagnosticMessage {
251 fluent::lint_builtin_incomplete_features
255 // FIXME: migrate "the type `{}` does not permit {}"
257 // FIXME: fluent::lint::builtin_clashing_extern_{same,diff}_name
259 #[derive(LintDiagnostic)]
260 #[diag(lint_builtin_deref_nullptr)]
261 pub struct BuiltinDerefNullptr {
266 // FIXME: migrate fluent::lint::builtin_asm_labels
268 #[derive(LintDiagnostic)]
269 pub enum BuiltinSpecialModuleNameUsed {
270 #[diag(lint_builtin_special_module_name_used_lib)]
274 #[diag(lint_builtin_special_module_name_used_main)]
279 #[derive(LintDiagnostic)]
280 #[diag(lint_builtin_unexpected_cli_config_name)]
282 pub struct BuiltinUnexpectedCliConfigName {
286 #[derive(LintDiagnostic)]
287 #[diag(lint_builtin_unexpected_cli_config_value)]
289 pub struct BuiltinUnexpectedCliConfigValue {
294 // enum_intrinsics_non_enums.rs
295 #[derive(LintDiagnostic)]
296 #[diag(lint_enum_intrinsics_mem_discriminant)]
297 pub struct EnumIntrinsicsMemDiscriminate<'a> {
298 pub ty_param: Ty<'a>,
303 #[derive(LintDiagnostic)]
304 #[diag(lint_enum_intrinsics_mem_variant)]
306 pub struct EnumIntrinsicsMemVariant<'a> {
307 pub ty_param: Ty<'a>,
311 pub struct Expectation<'a> {
312 pub expectation: &'a LintExpectation,
315 impl<'a> DecorateLint<'a, ()> for Expectation<'_> {
316 fn decorate_lint<'b>(
318 diag: &'b mut rustc_errors::DiagnosticBuilder<'a, ()>,
319 ) -> &'b mut rustc_errors::DiagnosticBuilder<'a, ()> {
320 if let Some(rationale) = self.expectation.reason {
321 diag.note(rationale.as_str());
324 if self.expectation.is_unfulfilled_lint_expectations {
325 diag.note(fluent::note);
331 fn msg(&self) -> DiagnosticMessage {
332 fluent::lint_expectation
337 #[derive(LintDiagnostic)]
338 #[diag(lint_default_hash_types)]
340 pub struct DefaultHashTypesDiag<'a> {
341 pub preferred: &'a str,
345 #[derive(LintDiagnostic)]
346 #[diag(lint_query_instability)]
348 pub struct QueryInstability {
352 #[derive(LintDiagnostic)]
353 #[diag(lint_tykind_kind)]
354 pub struct TykindKind {
355 #[suggestion(code = "ty", applicability = "maybe-incorrect")]
356 pub suggestion: Span,
359 #[derive(LintDiagnostic)]
362 pub struct TykindDiag;
364 #[derive(LintDiagnostic)]
365 #[diag(lint_ty_qualified)]
366 pub struct TyQualified {
368 #[suggestion(code = "{ty}", applicability = "maybe-incorrect")]
369 pub suggestion: Span,
372 #[derive(LintDiagnostic)]
373 #[diag(lint_lintpass_by_hand)]
375 pub struct LintPassByHand;
377 #[derive(LintDiagnostic)]
378 #[diag(lint_non_existant_doc_keyword)]
380 pub struct NonExistantDocKeyword {
384 #[derive(LintDiagnostic)]
385 #[diag(lint_diag_out_of_impl)]
386 pub struct DiagOutOfImpl;
388 #[derive(LintDiagnostic)]
389 #[diag(lint_untranslatable_diag)]
390 pub struct UntranslatableDiag;
392 #[derive(LintDiagnostic)]
393 #[diag(lint_bad_opt_access)]
394 pub struct BadOptAccessDiag<'a> {
399 #[derive(LintDiagnostic)]
400 pub enum NonBindingLet {
401 #[diag(lint_non_binding_let_on_sync_lock)]
404 sub: NonBindingLetSub,
406 #[diag(lint_non_binding_let_on_drop_type)]
409 sub: NonBindingLetSub,
413 pub struct NonBindingLetSub {
414 pub suggestion: Span,
415 pub multi_suggestion_start: Span,
416 pub multi_suggestion_end: Span,
419 impl AddToDiagnostic for NonBindingLetSub {
420 fn add_to_diagnostic_with<F>(self, diag: &mut rustc_errors::Diagnostic, _: F)
423 &mut rustc_errors::Diagnostic,
424 rustc_errors::SubdiagnosticMessage,
425 ) -> rustc_errors::SubdiagnosticMessage,
427 diag.span_suggestion_verbose(
429 fluent::lint_non_binding_let_suggestion,
431 Applicability::MachineApplicable,
433 diag.multipart_suggestion(
434 fluent::lint_non_binding_let_multi_suggestion,
436 (self.multi_suggestion_start, "drop(".to_string()),
437 (self.multi_suggestion_end, ")".to_string()),
439 Applicability::MachineApplicable,
445 #[derive(LintDiagnostic)]
446 #[diag(lint_overruled_attribute)]
447 pub struct OverruledAtributeLint<'a> {
450 pub lint_level: &'a str,
451 pub lint_source: Symbol,
453 pub sub: OverruledAttributeSub,
456 #[derive(LintDiagnostic)]
457 #[diag(lint_deprecated_lint_name)]
458 pub struct DeprecatedLintName<'a> {
460 #[suggestion(code = "{replace}", applicability = "machine-applicable")]
461 pub suggestion: Span,
462 pub replace: &'a str,
465 pub struct RenamedOrRemovedLint<'a> {
467 pub suggestion: Span,
468 pub renamed: &'a Option<String>,
471 impl<'a> DecorateLint<'a, ()> for RenamedOrRemovedLint<'_> {
472 fn decorate_lint<'b>(
474 diag: &'b mut rustc_errors::DiagnosticBuilder<'a, ()>,
475 ) -> &'b mut rustc_errors::DiagnosticBuilder<'a, ()> {
476 if let Some(new_name) = self.renamed {
477 diag.span_suggestion(
479 fluent::lint_renamed_or_removed_lint_suggestion,
481 Applicability::MachineApplicable,
487 fn msg(&self) -> rustc_errors::DiagnosticMessage {
488 rustc_errors::DiagnosticMessage::Str(self.msg.to_string())
492 pub struct UnknownLint<'a> {
494 pub suggestion: Span,
495 pub replace: &'a Option<Symbol>,
498 impl<'a> DecorateLint<'a, ()> for UnknownLint<'_> {
499 fn decorate_lint<'b>(
501 diag: &'b mut rustc_errors::DiagnosticBuilder<'a, ()>,
502 ) -> &'b mut rustc_errors::DiagnosticBuilder<'a, ()> {
503 diag.set_arg("name", self.name);
504 if let Some(replace) = self.replace {
505 diag.span_suggestion(
509 Applicability::MaybeIncorrect,
515 fn msg(&self) -> rustc_errors::DiagnosticMessage {
516 fluent::lint_unknown_lint
520 #[derive(LintDiagnostic)]
521 #[diag(lint_ignored_unless_crate_specified)]
522 pub struct IgnoredUnlessCrateSpecified<'a> {
528 #[derive(LintDiagnostic)]
529 #[diag(lint_cstring_ptr)]
532 pub struct CStringPtr {
533 #[label(as_ptr_label)]
535 #[label(unwrap_label)]
539 // non_ascii_idents.rs
540 #[derive(LintDiagnostic)]
541 #[diag(lint_identifier_non_ascii_char)]
542 pub struct IdentifierNonAsciiChar;
544 #[derive(LintDiagnostic)]
545 #[diag(lint_identifier_uncommon_codepoints)]
546 pub struct IdentifierUncommonCodepoints;
548 #[derive(LintDiagnostic)]
549 #[diag(lint_confusable_identifier_pair)]
550 pub struct ConfusableIdentifierPair {
551 pub existing_sym: Symbol,
557 #[derive(LintDiagnostic)]
558 #[diag(lint_mixed_script_confusables)]
559 #[note(includes_note)]
561 pub struct MixedScriptConfusables {
563 pub includes: String,
567 pub struct NonFmtPanicUnused {
569 pub suggestion: Option<Span>,
572 impl<'a> DecorateLint<'a, ()> for NonFmtPanicUnused {
573 fn decorate_lint<'b>(
575 diag: &'b mut rustc_errors::DiagnosticBuilder<'a, ()>,
576 ) -> &'b mut rustc_errors::DiagnosticBuilder<'a, ()> {
577 diag.set_arg("count", self.count);
578 diag.note(fluent::note);
579 if let Some(span) = self.suggestion {
580 diag.span_suggestion(
582 fluent::add_args_suggestion,
584 Applicability::HasPlaceholders,
586 diag.span_suggestion(
588 fluent::add_fmt_suggestion,
590 Applicability::MachineApplicable,
596 fn msg(&self) -> rustc_errors::DiagnosticMessage {
597 fluent::lint_non_fmt_panic_unused
601 #[derive(LintDiagnostic)]
602 #[diag(lint_non_fmt_panic_braces)]
604 pub struct NonFmtPanicBraces {
606 #[suggestion(code = "\"{{}}\", ", applicability = "machine-applicable")]
607 pub suggestion: Option<Span>,
610 // nonstandard_style.rs
611 #[derive(LintDiagnostic)]
612 #[diag(lint_non_camel_case_type)]
613 pub struct NonCamelCaseType<'a> {
617 pub sub: NonCamelCaseTypeSub,
620 #[derive(Subdiagnostic)]
621 pub enum NonCamelCaseTypeSub {
627 #[suggestion(suggestion, code = "{replace}", applicability = "maybe-incorrect")]
635 #[derive(LintDiagnostic)]
636 #[diag(lint_non_snake_case)]
637 pub struct NonSnakeCaseDiag<'a> {
642 pub sub: NonSnakeCaseDiagSub,
645 pub enum NonSnakeCaseDiagSub {
646 Label { span: Span },
648 RenameOrConvertSuggestion { span: Span, suggestion: Ident },
649 ConvertSuggestion { span: Span, suggestion: String },
650 SuggestionAndNote { span: Span },
653 impl AddToDiagnostic for NonSnakeCaseDiagSub {
654 fn add_to_diagnostic_with<F>(self, diag: &mut rustc_errors::Diagnostic, _: F)
657 &mut rustc_errors::Diagnostic,
658 rustc_errors::SubdiagnosticMessage,
659 ) -> rustc_errors::SubdiagnosticMessage,
662 NonSnakeCaseDiagSub::Label { span } => {
663 diag.span_label(span, fluent::label);
665 NonSnakeCaseDiagSub::Help => {
666 diag.help(fluent::help);
668 NonSnakeCaseDiagSub::ConvertSuggestion { span, suggestion } => {
669 diag.span_suggestion(
671 fluent::convert_suggestion,
673 Applicability::MaybeIncorrect,
676 NonSnakeCaseDiagSub::RenameOrConvertSuggestion { span, suggestion } => {
677 diag.span_suggestion(
679 fluent::rename_or_convert_suggestion,
681 Applicability::MaybeIncorrect,
684 NonSnakeCaseDiagSub::SuggestionAndNote { span } => {
685 diag.note(fluent::cannot_convert_note);
686 diag.span_suggestion(
688 fluent::rename_suggestion,
690 Applicability::MaybeIncorrect,
697 #[derive(LintDiagnostic)]
698 #[diag(lint_non_upper_case_global)]
699 pub struct NonUpperCaseGlobal<'a> {
703 pub sub: NonUpperCaseGlobalSub,
706 #[derive(Subdiagnostic)]
707 pub enum NonUpperCaseGlobalSub {
713 #[suggestion(suggestion, code = "{replace}", applicability = "maybe-incorrect")]
721 // noop_method_call.rs
722 #[derive(LintDiagnostic)]
723 #[diag(lint_noop_method_call)]
725 pub struct NoopMethodCallDiag<'a> {
727 pub receiver_ty: Ty<'a>,
733 #[derive(LintDiagnostic)]
734 #[diag(lint_pass_by_value)]
735 pub struct PassByValueDiag {
737 #[suggestion(code = "{ty}", applicability = "maybe-incorrect")]
738 pub suggestion: Span,
741 // redundant_semicolon.rs
742 #[derive(LintDiagnostic)]
743 #[diag(lint_redundant_semicolons)]
744 pub struct RedundantSemicolonsDiag {
746 #[suggestion(code = "", applicability = "maybe-incorrect")]
747 pub suggestion: Span,
751 pub struct DropTraitConstraintsDiag<'a> {
752 pub predicate: Predicate<'a>,
757 impl<'a> DecorateLint<'a, ()> for DropTraitConstraintsDiag<'_> {
758 fn decorate_lint<'b>(
760 diag: &'b mut rustc_errors::DiagnosticBuilder<'a, ()>,
761 ) -> &'b mut rustc_errors::DiagnosticBuilder<'a, ()> {
762 diag.set_arg("predicate", self.predicate);
763 diag.set_arg("needs_drop", self.tcx.def_path_str(self.def_id))
766 fn msg(&self) -> rustc_errors::DiagnosticMessage {
767 fluent::lint_drop_trait_constraints
771 pub struct DropGlue<'a> {
776 impl<'a> DecorateLint<'a, ()> for DropGlue<'_> {
777 fn decorate_lint<'b>(
779 diag: &'b mut rustc_errors::DiagnosticBuilder<'a, ()>,
780 ) -> &'b mut rustc_errors::DiagnosticBuilder<'a, ()> {
781 diag.set_arg("needs_drop", self.tcx.def_path_str(self.def_id))
784 fn msg(&self) -> rustc_errors::DiagnosticMessage {
785 fluent::lint_drop_glue
790 #[derive(LintDiagnostic)]
791 #[diag(lint_range_endpoint_out_of_range)]
792 pub struct RangeEndpointOutOfRange<'a> {
794 #[suggestion(code = "{start}..={literal}{suffix}", applicability = "machine-applicable")]
795 pub suggestion: Span,
801 #[derive(LintDiagnostic)]
802 #[diag(lint_overflowing_bin_hex)]
803 pub struct OverflowingBinHex<'a> {
807 pub actually: String,
809 pub sign: OverflowingBinHexSign,
811 pub sub: Option<OverflowingBinHexSub<'a>>,
814 pub enum OverflowingBinHexSign {
819 impl AddToDiagnostic for OverflowingBinHexSign {
820 fn add_to_diagnostic_with<F>(self, diag: &mut rustc_errors::Diagnostic, _: F)
823 &mut rustc_errors::Diagnostic,
824 rustc_errors::SubdiagnosticMessage,
825 ) -> rustc_errors::SubdiagnosticMessage,
828 OverflowingBinHexSign::Positive => {
829 diag.note(fluent::positive_note);
831 OverflowingBinHexSign::Negative => {
832 diag.note(fluent::negative_note);
833 diag.note(fluent::negative_becomes_note);
839 #[derive(Subdiagnostic)]
840 pub enum OverflowingBinHexSub<'a> {
843 code = "{sans_suffix}{suggestion_ty}",
844 applicability = "machine-applicable"
849 suggestion_ty: &'a str,
850 sans_suffix: &'a str,
853 Help { suggestion_ty: &'a str },
856 pub struct OverflowingInt<'a> {
861 pub suggestion_ty: Option<&'a str>,
864 // FIXME: refactor with `Option<&'a str>` in macro
865 impl<'a> DecorateLint<'a, ()> for OverflowingInt<'_> {
866 fn decorate_lint<'b>(
868 diag: &'b mut rustc_errors::DiagnosticBuilder<'a, ()>,
869 ) -> &'b mut rustc_errors::DiagnosticBuilder<'a, ()> {
870 diag.set_arg("ty", self.ty);
871 diag.set_arg("lit", self.lit);
872 diag.set_arg("min", self.min);
873 diag.set_arg("max", self.max);
874 diag.note(fluent::note);
875 if let Some(suggestion_ty) = self.suggestion_ty {
876 diag.set_arg("suggestion_ty", suggestion_ty);
877 diag.help(fluent::help);
882 fn msg(&self) -> rustc_errors::DiagnosticMessage {
883 fluent::lint_overflowing_int
887 #[derive(LintDiagnostic)]
888 #[diag(lint_only_cast_u8_to_char)]
889 pub struct OnlyCastu8ToChar {
890 #[suggestion(code = "'\\u{{{literal:X}}}'", applicability = "machine-applicable")]
895 #[derive(LintDiagnostic)]
896 #[diag(lint_overflowing_uint)]
898 pub struct OverflowingUInt<'a> {
905 #[derive(LintDiagnostic)]
906 #[diag(lint_overflowing_literal)]
908 pub struct OverflowingLiteral<'a> {
913 #[derive(LintDiagnostic)]
914 #[diag(lint_unused_comparisons)]
915 pub struct UnusedComparisons;
917 pub struct ImproperCTypes<'a> {
921 pub help: Option<DiagnosticMessage>,
922 pub note: DiagnosticMessage,
923 pub span_note: Option<Span>,
926 impl<'a> DecorateLint<'a, ()> for ImproperCTypes<'_> {
927 fn decorate_lint<'b>(
929 diag: &'b mut rustc_errors::DiagnosticBuilder<'a, ()>,
930 ) -> &'b mut rustc_errors::DiagnosticBuilder<'a, ()> {
931 diag.set_arg("ty", self.ty);
932 diag.set_arg("desc", self.desc);
933 diag.span_label(self.label, fluent::label);
934 if let Some(help) = self.help {
937 diag.note(self.note);
938 if let Some(note) = self.span_note {
939 diag.span_note(note, fluent::note);
944 fn msg(&self) -> rustc_errors::DiagnosticMessage {
945 fluent::lint_improper_ctypes
949 #[derive(LintDiagnostic)]
950 #[diag(lint_variant_size_differences)]
951 pub struct VariantSizeDifferencesDiag {
955 #[derive(LintDiagnostic)]
956 #[diag(lint_atomic_ordering_load)]
958 pub struct AtomicOrderingLoad;
960 #[derive(LintDiagnostic)]
961 #[diag(lint_atomic_ordering_store)]
963 pub struct AtomicOrderingStore;
965 #[derive(LintDiagnostic)]
966 #[diag(lint_atomic_ordering_fence)]
968 pub struct AtomicOrderingFence;
970 #[derive(LintDiagnostic)]
971 #[diag(lint_atomic_ordering_invalid)]
973 pub struct InvalidAtomicOrderingDiag {
976 pub fail_order_arg_span: Span,
980 #[derive(LintDiagnostic)]
981 #[diag(lint_unused_op)]
982 pub struct UnusedOp<'a> {
986 #[suggestion(style = "verbose", code = "let _ = ", applicability = "machine-applicable")]
987 pub suggestion: Span,
990 #[derive(LintDiagnostic)]
991 #[diag(lint_unused_result)]
992 pub struct UnusedResult<'a> {
996 // FIXME(davidtwco): this isn't properly translatable becauses of the
998 #[derive(LintDiagnostic)]
999 #[diag(lint_unused_closure)]
1001 pub struct UnusedClosure<'a> {
1007 // FIXME(davidtwco): this isn't properly translatable becauses of the
1009 #[derive(LintDiagnostic)]
1010 #[diag(lint_unused_generator)]
1012 pub struct UnusedGenerator<'a> {
1018 // FIXME(davidtwco): this isn't properly translatable becauses of the pre/post
1020 pub struct UnusedDef<'a, 'b> {
1023 pub cx: &'a LateContext<'b>,
1025 pub note: Option<Symbol>,
1028 // FIXME: refactor with `Option<String>` in macro
1029 impl<'a> DecorateLint<'a, ()> for UnusedDef<'_, '_> {
1030 fn decorate_lint<'b>(
1032 diag: &'b mut rustc_errors::DiagnosticBuilder<'a, ()>,
1033 ) -> &'b mut rustc_errors::DiagnosticBuilder<'a, ()> {
1034 diag.set_arg("pre", self.pre);
1035 diag.set_arg("post", self.post);
1036 diag.set_arg("def", self.cx.tcx.def_path_str(self.def_id));
1037 // check for #[must_use = "..."]
1038 if let Some(note) = self.note {
1039 diag.note(note.as_str());
1044 fn msg(&self) -> rustc_errors::DiagnosticMessage {
1045 fluent::lint_unused_def
1049 #[derive(LintDiagnostic)]
1050 #[diag(lint_path_statement_drop)]
1051 pub struct PathStatementDrop {
1053 pub sub: PathStatementDropSub,
1056 #[derive(Subdiagnostic)]
1057 pub enum PathStatementDropSub {
1058 #[suggestion(suggestion, code = "drop({snippet});", applicability = "machine-applicable")]
1071 #[derive(LintDiagnostic)]
1072 #[diag(lint_path_statement_no_effect)]
1073 pub struct PathStatementNoEffect;
1075 #[derive(LintDiagnostic)]
1076 #[diag(lint_unused_delim)]
1077 pub struct UnusedDelim<'a> {
1078 pub delim: &'static str,
1081 pub suggestion: Option<UnusedDelimSuggestion>,
1084 #[derive(Subdiagnostic)]
1085 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1086 pub struct UnusedDelimSuggestion {
1087 #[suggestion_part(code = "{start_replace}")]
1088 pub start_span: Span,
1089 pub start_replace: &'static str,
1090 #[suggestion_part(code = "{end_replace}")]
1092 pub end_replace: &'static str,
1095 #[derive(LintDiagnostic)]
1096 #[diag(lint_unused_import_braces)]
1097 pub struct UnusedImportBracesDiag {
1101 #[derive(LintDiagnostic)]
1102 #[diag(lint_unused_allocation)]
1103 pub struct UnusedAllocationDiag;
1105 #[derive(LintDiagnostic)]
1106 #[diag(lint_unused_allocation_mut)]
1107 pub struct UnusedAllocationMutDiag;