rustc_builtin_macros/
errors.rs

1use rustc_errors::codes::*;
2use rustc_errors::{
3    Diag, DiagCtxtHandle, Diagnostic, EmissionGuarantee, Level, MultiSpan, SingleLabelManySpans,
4    Subdiagnostic,
5};
6use rustc_macros::{Diagnostic, LintDiagnostic, Subdiagnostic};
7use rustc_span::{Ident, Span, Symbol};
8
9#[derive(LintDiagnostic)]
10#[diag(builtin_macros_avoid_intel_syntax)]
11pub(crate) struct AvoidIntelSyntax;
12
13#[derive(LintDiagnostic)]
14#[diag(builtin_macros_avoid_att_syntax)]
15pub(crate) struct AvoidAttSyntax;
16
17#[derive(LintDiagnostic)]
18#[diag(builtin_macros_incomplete_include)]
19pub(crate) struct IncompleteInclude;
20
21#[derive(LintDiagnostic)]
22#[diag(builtin_macros_unnameable_test_items)]
23pub(crate) struct UnnameableTestItems;
24
25#[derive(LintDiagnostic)]
26#[diag(builtin_macros_duplicate_macro_attribute)]
27pub(crate) struct DuplicateMacroAttribute;
28
29#[derive(Diagnostic)]
30#[diag(builtin_macros_requires_cfg_pattern)]
31pub(crate) struct RequiresCfgPattern {
32    #[primary_span]
33    #[label]
34    pub(crate) span: Span,
35}
36
37#[derive(Diagnostic)]
38#[diag(builtin_macros_expected_one_cfg_pattern)]
39pub(crate) struct OneCfgPattern {
40    #[primary_span]
41    pub(crate) span: Span,
42}
43
44#[derive(Diagnostic)]
45#[diag(builtin_macros_alloc_error_must_be_fn)]
46pub(crate) struct AllocErrorMustBeFn {
47    #[primary_span]
48    pub(crate) span: Span,
49}
50
51#[derive(Diagnostic)]
52#[diag(builtin_macros_assert_requires_boolean)]
53pub(crate) struct AssertRequiresBoolean {
54    #[primary_span]
55    #[label]
56    pub(crate) span: Span,
57}
58
59#[derive(Diagnostic)]
60#[diag(builtin_macros_assert_requires_expression)]
61pub(crate) struct AssertRequiresExpression {
62    #[primary_span]
63    pub(crate) span: Span,
64    #[suggestion(code = "", applicability = "maybe-incorrect")]
65    pub(crate) token: Span,
66}
67
68#[derive(Diagnostic)]
69#[diag(builtin_macros_assert_missing_comma)]
70pub(crate) struct AssertMissingComma {
71    #[primary_span]
72    pub(crate) span: Span,
73    #[suggestion(code = ", ", applicability = "maybe-incorrect", style = "short")]
74    pub(crate) comma: Span,
75}
76
77#[derive(Diagnostic)]
78pub(crate) enum CfgAccessibleInvalid {
79    #[diag(builtin_macros_cfg_accessible_unspecified_path)]
80    UnspecifiedPath(#[primary_span] Span),
81    #[diag(builtin_macros_cfg_accessible_multiple_paths)]
82    MultiplePaths(#[primary_span] Span),
83    #[diag(builtin_macros_cfg_accessible_literal_path)]
84    LiteralPath(#[primary_span] Span),
85    #[diag(builtin_macros_cfg_accessible_has_args)]
86    HasArguments(#[primary_span] Span),
87}
88
89#[derive(Diagnostic)]
90#[diag(builtin_macros_cfg_accessible_indeterminate)]
91pub(crate) struct CfgAccessibleIndeterminate {
92    #[primary_span]
93    pub(crate) span: Span,
94}
95
96#[derive(Diagnostic)]
97#[diag(builtin_macros_concat_missing_literal)]
98#[note]
99pub(crate) struct ConcatMissingLiteral {
100    #[primary_span]
101    pub(crate) spans: Vec<Span>,
102}
103
104#[derive(Diagnostic)]
105#[diag(builtin_macros_concat_bytestr)]
106pub(crate) struct ConcatBytestr {
107    #[primary_span]
108    pub(crate) span: Span,
109}
110
111#[derive(Diagnostic)]
112#[diag(builtin_macros_concat_c_str_lit)]
113pub(crate) struct ConcatCStrLit {
114    #[primary_span]
115    pub(crate) span: Span,
116}
117
118#[derive(Diagnostic)]
119#[diag(builtin_macros_export_macro_rules)]
120pub(crate) struct ExportMacroRules {
121    #[primary_span]
122    pub(crate) span: Span,
123}
124
125#[derive(Diagnostic)]
126#[diag(builtin_macros_proc_macro)]
127pub(crate) struct ProcMacro {
128    #[primary_span]
129    pub(crate) span: Span,
130}
131
132#[derive(Diagnostic)]
133#[diag(builtin_macros_trace_macros)]
134pub(crate) struct TraceMacros {
135    #[primary_span]
136    pub(crate) span: Span,
137}
138
139#[derive(Diagnostic)]
140#[diag(builtin_macros_bench_sig)]
141pub(crate) struct BenchSig {
142    #[primary_span]
143    pub(crate) span: Span,
144}
145
146#[derive(Diagnostic)]
147#[diag(builtin_macros_alloc_must_statics)]
148pub(crate) struct AllocMustStatics {
149    #[primary_span]
150    pub(crate) span: Span,
151}
152
153pub(crate) use autodiff::*;
154
155mod autodiff {
156    use super::*;
157    #[derive(Diagnostic)]
158    #[diag(builtin_macros_autodiff_missing_config)]
159    pub(crate) struct AutoDiffMissingConfig {
160        #[primary_span]
161        pub(crate) span: Span,
162    }
163    #[derive(Diagnostic)]
164    #[diag(builtin_macros_autodiff_unknown_activity)]
165    pub(crate) struct AutoDiffUnknownActivity {
166        #[primary_span]
167        pub(crate) span: Span,
168        pub(crate) act: String,
169    }
170    #[derive(Diagnostic)]
171    #[diag(builtin_macros_autodiff_ty_activity)]
172    pub(crate) struct AutoDiffInvalidTypeForActivity {
173        #[primary_span]
174        pub(crate) span: Span,
175        pub(crate) act: String,
176    }
177    #[derive(Diagnostic)]
178    #[diag(builtin_macros_autodiff_number_activities)]
179    pub(crate) struct AutoDiffInvalidNumberActivities {
180        #[primary_span]
181        pub(crate) span: Span,
182        pub(crate) expected: usize,
183        pub(crate) found: usize,
184    }
185    #[derive(Diagnostic)]
186    #[diag(builtin_macros_autodiff_mode_activity)]
187    pub(crate) struct AutoDiffInvalidApplicationModeAct {
188        #[primary_span]
189        pub(crate) span: Span,
190        pub(crate) mode: String,
191        pub(crate) act: String,
192    }
193
194    #[derive(Diagnostic)]
195    #[diag(builtin_macros_autodiff_ret_activity)]
196    pub(crate) struct AutoDiffInvalidRetAct {
197        #[primary_span]
198        pub(crate) span: Span,
199        pub(crate) mode: String,
200        pub(crate) act: String,
201    }
202
203    #[derive(Diagnostic)]
204    #[diag(builtin_macros_autodiff_width)]
205    pub(crate) struct AutoDiffInvalidWidth {
206        #[primary_span]
207        pub(crate) span: Span,
208        pub(crate) width: u128,
209    }
210
211    #[derive(Diagnostic)]
212    #[diag(builtin_macros_autodiff)]
213    pub(crate) struct AutoDiffInvalidApplication {
214        #[primary_span]
215        pub(crate) span: Span,
216    }
217}
218
219pub(crate) use ad_fallback::*;
220mod ad_fallback {
221    use super::*;
222    #[derive(Diagnostic)]
223    #[diag(builtin_macros_autodiff_not_build)]
224    pub(crate) struct AutoDiffSupportNotBuild {
225        #[primary_span]
226        pub(crate) span: Span,
227    }
228}
229
230#[derive(Diagnostic)]
231#[diag(builtin_macros_concat_bytes_invalid)]
232pub(crate) struct ConcatBytesInvalid {
233    #[primary_span]
234    pub(crate) span: Span,
235    pub(crate) lit_kind: &'static str,
236    #[subdiagnostic]
237    pub(crate) sugg: Option<ConcatBytesInvalidSuggestion>,
238    #[note(builtin_macros_c_str_note)]
239    pub(crate) cs_note: Option<()>,
240}
241
242#[derive(Subdiagnostic)]
243pub(crate) enum ConcatBytesInvalidSuggestion {
244    #[suggestion(
245        builtin_macros_byte_char,
246        code = "b{snippet}",
247        applicability = "machine-applicable"
248    )]
249    CharLit {
250        #[primary_span]
251        span: Span,
252        snippet: String,
253    },
254    #[suggestion(
255        builtin_macros_byte_str,
256        code = "b{snippet}",
257        applicability = "machine-applicable"
258    )]
259    StrLit {
260        #[primary_span]
261        span: Span,
262        snippet: String,
263    },
264    #[note(builtin_macros_c_str_note)]
265    #[suggestion(builtin_macros_c_str, code = "{as_bstr}", applicability = "machine-applicable")]
266    CStrLit {
267        #[primary_span]
268        span: Span,
269        as_bstr: String,
270    },
271    #[suggestion(
272        builtin_macros_number_array,
273        code = "[{snippet}]",
274        applicability = "machine-applicable"
275    )]
276    IntLit {
277        #[primary_span]
278        span: Span,
279        snippet: String,
280    },
281}
282
283#[derive(Diagnostic)]
284#[diag(builtin_macros_concat_bytes_oob)]
285pub(crate) struct ConcatBytesOob {
286    #[primary_span]
287    pub(crate) span: Span,
288}
289
290#[derive(Diagnostic)]
291#[diag(builtin_macros_concat_bytes_non_u8)]
292pub(crate) struct ConcatBytesNonU8 {
293    #[primary_span]
294    pub(crate) span: Span,
295}
296
297#[derive(Diagnostic)]
298#[diag(builtin_macros_concat_bytes_missing_literal)]
299#[note]
300pub(crate) struct ConcatBytesMissingLiteral {
301    #[primary_span]
302    pub(crate) spans: Vec<Span>,
303}
304
305#[derive(Diagnostic)]
306#[diag(builtin_macros_concat_bytes_array)]
307pub(crate) struct ConcatBytesArray {
308    #[primary_span]
309    pub(crate) span: Span,
310    #[note]
311    #[help]
312    pub(crate) bytestr: bool,
313}
314
315#[derive(Diagnostic)]
316#[diag(builtin_macros_concat_bytes_bad_repeat)]
317pub(crate) struct ConcatBytesBadRepeat {
318    #[primary_span]
319    pub(crate) span: Span,
320}
321
322#[derive(Diagnostic)]
323#[diag(builtin_macros_bad_derive_target, code = E0774)]
324pub(crate) struct BadDeriveTarget {
325    #[primary_span]
326    #[label]
327    pub(crate) span: Span,
328    #[label(builtin_macros_label2)]
329    pub(crate) item: Span,
330}
331
332#[derive(Diagnostic)]
333#[diag(builtin_macros_tests_not_support)]
334pub(crate) struct TestsNotSupport {}
335
336#[derive(Diagnostic)]
337#[diag(builtin_macros_unexpected_lit, code = E0777)]
338pub(crate) struct BadDeriveLit {
339    #[primary_span]
340    #[label]
341    pub(crate) span: Span,
342    #[subdiagnostic]
343    pub help: BadDeriveLitHelp,
344}
345
346#[derive(Subdiagnostic)]
347pub(crate) enum BadDeriveLitHelp {
348    #[help(builtin_macros_str_lit)]
349    StrLit { sym: Symbol },
350    #[help(builtin_macros_other)]
351    Other,
352}
353
354#[derive(Diagnostic)]
355#[diag(builtin_macros_derive_path_args_list)]
356pub(crate) struct DerivePathArgsList {
357    #[suggestion(code = "", applicability = "machine-applicable")]
358    #[primary_span]
359    pub(crate) span: Span,
360}
361
362#[derive(Diagnostic)]
363#[diag(builtin_macros_derive_path_args_value)]
364pub(crate) struct DerivePathArgsValue {
365    #[suggestion(code = "", applicability = "machine-applicable")]
366    #[primary_span]
367    pub(crate) span: Span,
368}
369
370#[derive(Diagnostic)]
371#[diag(builtin_macros_no_default_variant, code = E0665)]
372pub(crate) struct NoDefaultVariant {
373    #[primary_span]
374    pub(crate) span: Span,
375    #[label]
376    pub(crate) item_span: Span,
377    #[subdiagnostic]
378    pub(crate) suggs: Vec<NoDefaultVariantSugg>,
379}
380
381#[derive(Subdiagnostic)]
382#[suggestion(builtin_macros_suggestion, code = "#[default] ", applicability = "maybe-incorrect")]
383pub(crate) struct NoDefaultVariantSugg {
384    #[primary_span]
385    pub(crate) span: Span,
386}
387
388#[derive(Diagnostic)]
389#[diag(builtin_macros_multiple_defaults)]
390#[note]
391pub(crate) struct MultipleDefaults {
392    #[primary_span]
393    pub(crate) span: Span,
394    #[label]
395    pub(crate) first: Span,
396    #[label(builtin_macros_additional)]
397    pub additional: Vec<Span>,
398    #[subdiagnostic]
399    pub suggs: Vec<MultipleDefaultsSugg>,
400}
401
402#[derive(Subdiagnostic)]
403#[multipart_suggestion(
404    builtin_macros_suggestion,
405    applicability = "maybe-incorrect",
406    style = "tool-only"
407)]
408pub(crate) struct MultipleDefaultsSugg {
409    #[suggestion_part(code = "")]
410    pub(crate) spans: Vec<Span>,
411    pub(crate) ident: Ident,
412}
413
414#[derive(Diagnostic)]
415#[diag(builtin_macros_non_unit_default)]
416#[help]
417pub(crate) struct NonUnitDefault {
418    #[primary_span]
419    pub(crate) span: Span,
420    pub(crate) post: &'static str,
421}
422
423#[derive(Diagnostic)]
424#[diag(builtin_macros_non_exhaustive_default)]
425#[help]
426pub(crate) struct NonExhaustiveDefault {
427    #[primary_span]
428    pub(crate) span: Span,
429    #[label]
430    pub(crate) non_exhaustive: Span,
431}
432
433#[derive(Diagnostic)]
434#[diag(builtin_macros_multiple_default_attrs)]
435#[note]
436pub(crate) struct MultipleDefaultAttrs {
437    #[primary_span]
438    pub(crate) span: Span,
439    #[label]
440    pub(crate) first: Span,
441    #[label(builtin_macros_label_again)]
442    pub(crate) first_rest: Span,
443    #[help]
444    pub(crate) rest: MultiSpan,
445    pub(crate) only_one: bool,
446    #[subdiagnostic]
447    pub(crate) sugg: MultipleDefaultAttrsSugg,
448}
449
450#[derive(Subdiagnostic)]
451#[multipart_suggestion(
452    builtin_macros_help,
453    applicability = "machine-applicable",
454    style = "tool-only"
455)]
456pub(crate) struct MultipleDefaultAttrsSugg {
457    #[suggestion_part(code = "")]
458    pub(crate) spans: Vec<Span>,
459}
460
461#[derive(Diagnostic)]
462#[diag(builtin_macros_default_arg)]
463pub(crate) struct DefaultHasArg {
464    #[primary_span]
465    #[suggestion(code = "#[default]", style = "hidden", applicability = "maybe-incorrect")]
466    pub(crate) span: Span,
467}
468
469#[derive(Diagnostic)]
470#[diag(builtin_macros_derive_from_wrong_target)]
471#[note(builtin_macros_derive_from_usage_note)]
472pub(crate) struct DeriveFromWrongTarget<'a> {
473    #[primary_span]
474    pub(crate) span: MultiSpan,
475    pub(crate) kind: &'a str,
476}
477
478#[derive(Diagnostic)]
479#[diag(builtin_macros_derive_from_wrong_field_count)]
480#[note(builtin_macros_derive_from_usage_note)]
481pub(crate) struct DeriveFromWrongFieldCount {
482    #[primary_span]
483    pub(crate) span: MultiSpan,
484    pub(crate) multiple_fields: bool,
485}
486
487#[derive(Diagnostic)]
488#[diag(builtin_macros_derive_macro_call)]
489pub(crate) struct DeriveMacroCall {
490    #[primary_span]
491    pub(crate) span: Span,
492}
493
494#[derive(Diagnostic)]
495#[diag(builtin_macros_cannot_derive_union)]
496pub(crate) struct DeriveUnion {
497    #[primary_span]
498    pub(crate) span: Span,
499}
500
501#[derive(Diagnostic)]
502#[diag(builtin_macros_env_takes_args)]
503pub(crate) struct EnvTakesArgs {
504    #[primary_span]
505    pub(crate) span: Span,
506}
507
508pub(crate) struct EnvNotDefinedWithUserMessage {
509    pub(crate) span: Span,
510    pub(crate) msg_from_user: Symbol,
511}
512
513// Hand-written implementation to support custom user messages.
514impl<'a, G: EmissionGuarantee> Diagnostic<'a, G> for EnvNotDefinedWithUserMessage {
515    #[track_caller]
516    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, G> {
517        #[expect(
518            rustc::untranslatable_diagnostic,
519            reason = "cannot translate user-provided messages"
520        )]
521        let mut diag = Diag::new(dcx, level, self.msg_from_user.to_string());
522        diag.span(self.span);
523        diag
524    }
525}
526
527#[derive(Diagnostic)]
528pub(crate) enum EnvNotDefined<'a> {
529    #[diag(builtin_macros_env_not_defined)]
530    #[help(builtin_macros_cargo)]
531    CargoEnvVar {
532        #[primary_span]
533        span: Span,
534        var: Symbol,
535        var_expr: &'a rustc_ast::Expr,
536    },
537    #[diag(builtin_macros_env_not_defined)]
538    #[help(builtin_macros_cargo_typo)]
539    CargoEnvVarTypo {
540        #[primary_span]
541        span: Span,
542        var: Symbol,
543        suggested_var: Symbol,
544    },
545    #[diag(builtin_macros_env_not_defined)]
546    #[help(builtin_macros_custom)]
547    CustomEnvVar {
548        #[primary_span]
549        span: Span,
550        var: Symbol,
551        var_expr: &'a rustc_ast::Expr,
552    },
553}
554
555#[derive(Diagnostic)]
556#[diag(builtin_macros_env_not_unicode)]
557pub(crate) struct EnvNotUnicode {
558    #[primary_span]
559    pub(crate) span: Span,
560    pub(crate) var: Symbol,
561}
562
563#[derive(Diagnostic)]
564#[diag(builtin_macros_format_requires_string)]
565pub(crate) struct FormatRequiresString {
566    #[primary_span]
567    pub(crate) span: Span,
568}
569
570#[derive(Diagnostic)]
571#[diag(builtin_macros_format_duplicate_arg)]
572pub(crate) struct FormatDuplicateArg {
573    #[primary_span]
574    pub(crate) span: Span,
575    #[label(builtin_macros_label1)]
576    pub(crate) prev: Span,
577    #[label(builtin_macros_label2)]
578    pub(crate) duplicate: Span,
579    pub(crate) ident: Ident,
580}
581
582#[derive(Diagnostic)]
583#[diag(builtin_macros_format_positional_after_named)]
584pub(crate) struct PositionalAfterNamed {
585    #[primary_span]
586    #[label]
587    pub(crate) span: Span,
588    #[label(builtin_macros_named_args)]
589    pub(crate) args: Vec<Span>,
590}
591
592#[derive(Diagnostic)]
593#[diag(builtin_macros_format_string_invalid)]
594pub(crate) struct InvalidFormatString {
595    #[primary_span]
596    #[label]
597    pub(crate) span: Span,
598    pub(crate) desc: String,
599    pub(crate) label1: String,
600    #[subdiagnostic]
601    pub(crate) note_: Option<InvalidFormatStringNote>,
602    #[subdiagnostic]
603    pub(crate) label_: Option<InvalidFormatStringLabel>,
604    #[subdiagnostic]
605    pub(crate) sugg_: Option<InvalidFormatStringSuggestion>,
606}
607
608#[derive(Subdiagnostic)]
609#[note(builtin_macros_note)]
610pub(crate) struct InvalidFormatStringNote {
611    pub(crate) note: String,
612}
613
614#[derive(Subdiagnostic)]
615#[label(builtin_macros_second_label)]
616pub(crate) struct InvalidFormatStringLabel {
617    #[primary_span]
618    pub(crate) span: Span,
619    pub(crate) label: String,
620}
621
622#[derive(Subdiagnostic)]
623pub(crate) enum InvalidFormatStringSuggestion {
624    #[multipart_suggestion(
625        builtin_macros_format_use_positional,
626        style = "verbose",
627        applicability = "machine-applicable"
628    )]
629    UsePositional {
630        #[suggestion_part(code = "{len}")]
631        captured: Span,
632        len: String,
633        #[suggestion_part(code = ", {arg}")]
634        span: Span,
635        arg: String,
636    },
637    #[suggestion(
638        builtin_macros_format_remove_raw_ident,
639        code = "",
640        applicability = "machine-applicable"
641    )]
642    RemoveRawIdent {
643        #[primary_span]
644        span: Span,
645    },
646    #[suggestion(
647        builtin_macros_format_reorder_format_parameter,
648        code = "{replacement}",
649        style = "verbose",
650        applicability = "machine-applicable"
651    )]
652    ReorderFormatParameter {
653        #[primary_span]
654        span: Span,
655        replacement: String,
656    },
657}
658
659#[derive(Diagnostic)]
660#[diag(builtin_macros_format_no_arg_named)]
661#[note]
662#[note(builtin_macros_note2)]
663pub(crate) struct FormatNoArgNamed {
664    #[primary_span]
665    pub(crate) span: Span,
666    pub(crate) name: Symbol,
667}
668
669#[derive(Diagnostic)]
670#[diag(builtin_macros_format_unknown_trait)]
671#[note]
672pub(crate) struct FormatUnknownTrait<'a> {
673    #[primary_span]
674    pub(crate) span: Span,
675    pub(crate) ty: &'a str,
676    #[subdiagnostic]
677    pub(crate) suggs: Vec<FormatUnknownTraitSugg>,
678}
679
680#[derive(Subdiagnostic)]
681#[suggestion(
682    builtin_macros_suggestion,
683    code = "{fmt}",
684    style = "tool-only",
685    applicability = "maybe-incorrect"
686)]
687pub(crate) struct FormatUnknownTraitSugg {
688    #[primary_span]
689    pub span: Span,
690    pub fmt: &'static str,
691    pub trait_name: &'static str,
692}
693
694#[derive(Diagnostic)]
695#[diag(builtin_macros_format_unused_arg)]
696pub(crate) struct FormatUnusedArg {
697    #[primary_span]
698    #[label(builtin_macros_format_unused_arg)]
699    pub(crate) span: Span,
700    pub(crate) named: bool,
701}
702
703// Allow the singular form to be a subdiagnostic of the multiple-unused
704// form of diagnostic.
705impl Subdiagnostic for FormatUnusedArg {
706    fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) {
707        diag.arg("named", self.named);
708        let msg = diag.eagerly_translate(crate::fluent_generated::builtin_macros_format_unused_arg);
709        diag.remove_arg("named");
710        diag.span_label(self.span, msg);
711    }
712}
713
714#[derive(Diagnostic)]
715#[diag(builtin_macros_format_unused_args)]
716pub(crate) struct FormatUnusedArgs {
717    #[primary_span]
718    pub(crate) unused: Vec<Span>,
719    #[label]
720    pub(crate) fmt: Span,
721    #[subdiagnostic]
722    pub(crate) unused_labels: Vec<FormatUnusedArg>,
723}
724
725#[derive(Diagnostic)]
726#[diag(builtin_macros_format_pos_mismatch)]
727pub(crate) struct FormatPositionalMismatch {
728    #[primary_span]
729    pub(crate) span: MultiSpan,
730    pub(crate) n: usize,
731    pub(crate) desc: String,
732    #[subdiagnostic]
733    pub(crate) highlight: SingleLabelManySpans,
734}
735
736#[derive(Diagnostic)]
737#[diag(builtin_macros_format_redundant_args)]
738pub(crate) struct FormatRedundantArgs {
739    #[primary_span]
740    pub(crate) span: MultiSpan,
741    pub(crate) n: usize,
742
743    #[note]
744    pub(crate) note: MultiSpan,
745
746    #[subdiagnostic]
747    pub(crate) sugg: Option<FormatRedundantArgsSugg>,
748}
749
750#[derive(Subdiagnostic)]
751#[multipart_suggestion(builtin_macros_suggestion, applicability = "machine-applicable")]
752pub(crate) struct FormatRedundantArgsSugg {
753    #[suggestion_part(code = "")]
754    pub(crate) spans: Vec<Span>,
755}
756
757#[derive(Diagnostic)]
758#[diag(builtin_macros_test_case_non_item)]
759pub(crate) struct TestCaseNonItem {
760    #[primary_span]
761    pub(crate) span: Span,
762}
763
764#[derive(Diagnostic)]
765#[diag(builtin_macros_test_bad_fn)]
766pub(crate) struct TestBadFn {
767    #[primary_span]
768    pub(crate) span: Span,
769    #[label]
770    pub(crate) cause: Span,
771    pub(crate) kind: &'static str,
772}
773
774#[derive(Diagnostic)]
775#[diag(builtin_macros_asm_explicit_register_name)]
776pub(crate) struct AsmExplicitRegisterName {
777    #[primary_span]
778    pub(crate) span: Span,
779}
780
781#[derive(Diagnostic)]
782#[diag(builtin_macros_asm_mutually_exclusive)]
783pub(crate) struct AsmMutuallyExclusive {
784    #[primary_span]
785    pub(crate) spans: Vec<Span>,
786    pub(crate) opt1: &'static str,
787    pub(crate) opt2: &'static str,
788}
789
790#[derive(Diagnostic)]
791#[diag(builtin_macros_asm_pure_combine)]
792pub(crate) struct AsmPureCombine {
793    #[primary_span]
794    pub(crate) spans: Vec<Span>,
795}
796
797#[derive(Diagnostic)]
798#[diag(builtin_macros_asm_pure_no_output)]
799pub(crate) struct AsmPureNoOutput {
800    #[primary_span]
801    pub(crate) spans: Vec<Span>,
802}
803
804#[derive(Diagnostic)]
805#[diag(builtin_macros_asm_modifier_invalid)]
806pub(crate) struct AsmModifierInvalid {
807    #[primary_span]
808    pub(crate) span: Span,
809}
810
811#[derive(Diagnostic)]
812#[diag(builtin_macros_asm_attribute_not_supported)]
813pub(crate) struct AsmAttributeNotSupported {
814    #[primary_span]
815    pub(crate) span: Span,
816}
817
818#[derive(Diagnostic)]
819#[diag(builtin_macros_asm_duplicate_arg)]
820pub(crate) struct AsmDuplicateArg {
821    #[primary_span]
822    #[label(builtin_macros_arg)]
823    pub(crate) span: Span,
824    #[label]
825    pub(crate) prev: Span,
826    pub(crate) name: Symbol,
827}
828
829#[derive(Diagnostic)]
830#[diag(builtin_macros_asm_pos_after)]
831pub(crate) struct AsmPositionalAfter {
832    #[primary_span]
833    #[label(builtin_macros_pos)]
834    pub(crate) span: Span,
835    #[label(builtin_macros_named)]
836    pub(crate) named: Vec<Span>,
837    #[label(builtin_macros_explicit)]
838    pub(crate) explicit: Vec<Span>,
839}
840
841#[derive(Diagnostic)]
842#[diag(builtin_macros_asm_noreturn)]
843pub(crate) struct AsmNoReturn {
844    #[primary_span]
845    pub(crate) outputs_sp: Vec<Span>,
846}
847
848#[derive(Diagnostic)]
849#[diag(builtin_macros_asm_no_matched_argument_name)]
850pub(crate) struct AsmNoMatchedArgumentName {
851    pub(crate) name: String,
852    #[primary_span]
853    pub(crate) span: Span,
854}
855
856#[derive(Diagnostic)]
857#[diag(builtin_macros_asm_mayunwind)]
858pub(crate) struct AsmMayUnwind {
859    #[primary_span]
860    pub(crate) labels_sp: Vec<Span>,
861}
862
863pub(crate) struct AsmClobberNoReg {
864    pub(crate) spans: Vec<Span>,
865    pub(crate) clobbers: Vec<Span>,
866}
867
868impl<'a, G: EmissionGuarantee> Diagnostic<'a, G> for AsmClobberNoReg {
869    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, G> {
870        // eager translation as `span_labels` takes `AsRef<str>`
871        let lbl1 = dcx.eagerly_translate_to_string(
872            crate::fluent_generated::builtin_macros_asm_clobber_abi,
873            [].into_iter(),
874        );
875        let lbl2 = dcx.eagerly_translate_to_string(
876            crate::fluent_generated::builtin_macros_asm_clobber_outputs,
877            [].into_iter(),
878        );
879        Diag::new(dcx, level, crate::fluent_generated::builtin_macros_asm_clobber_no_reg)
880            .with_span(self.spans.clone())
881            .with_span_labels(self.clobbers, &lbl1)
882            .with_span_labels(self.spans, &lbl2)
883    }
884}
885
886#[derive(Diagnostic)]
887#[diag(builtin_macros_asm_opt_already_provided)]
888pub(crate) struct AsmOptAlreadyprovided {
889    #[primary_span]
890    #[label]
891    pub(crate) span: Span,
892    pub(crate) symbol: Symbol,
893    #[suggestion(code = "", applicability = "machine-applicable", style = "tool-only")]
894    pub(crate) span_with_comma: Span,
895}
896
897#[derive(Diagnostic)]
898#[diag(builtin_macros_asm_unsupported_option)]
899pub(crate) struct AsmUnsupportedOption {
900    #[primary_span]
901    #[label]
902    pub(crate) span: Span,
903    pub(crate) symbol: Symbol,
904    #[suggestion(code = "", applicability = "machine-applicable", style = "tool-only")]
905    pub(crate) span_with_comma: Span,
906    pub(crate) macro_name: &'static str,
907}
908
909#[derive(Diagnostic)]
910#[diag(builtin_macros_asm_unsupported_clobber_abi)]
911pub(crate) struct AsmUnsupportedClobberAbi {
912    #[primary_span]
913    pub(crate) spans: Vec<Span>,
914    pub(crate) macro_name: &'static str,
915}
916
917#[derive(Diagnostic)]
918#[diag(builtin_macros_test_runner_invalid)]
919pub(crate) struct TestRunnerInvalid {
920    #[primary_span]
921    pub(crate) span: Span,
922}
923
924#[derive(Diagnostic)]
925#[diag(builtin_macros_test_runner_nargs)]
926pub(crate) struct TestRunnerNargs {
927    #[primary_span]
928    pub(crate) span: Span,
929}
930
931#[derive(Diagnostic)]
932#[diag(builtin_macros_expected_comma_in_list)]
933pub(crate) struct ExpectedCommaInList {
934    #[primary_span]
935    pub span: Span,
936}
937
938#[derive(Diagnostic)]
939#[diag(builtin_macros_only_one_argument)]
940pub(crate) struct OnlyOneArgument<'a> {
941    #[primary_span]
942    pub span: Span,
943    pub name: &'a str,
944}
945
946#[derive(Diagnostic)]
947#[diag(builtin_macros_takes_no_arguments)]
948pub(crate) struct TakesNoArguments<'a> {
949    #[primary_span]
950    pub span: Span,
951    pub name: &'a str,
952}
953
954#[derive(Diagnostic)]
955#[diag(builtin_macros_proc_macro_attribute_only_usable_with_crate_type)]
956pub(crate) struct AttributeOnlyUsableWithCrateType<'a> {
957    #[primary_span]
958    pub span: Span,
959    pub path: &'a str,
960}
961
962#[derive(Diagnostic)]
963#[diag(builtin_macros_source_utils_expected_item)]
964pub(crate) struct ExpectedItem<'a> {
965    #[primary_span]
966    pub span: Span,
967    pub token: &'a str,
968}
969
970#[derive(Diagnostic)]
971#[diag(builtin_macros_naked_functions_testing_attribute, code = E0736)]
972pub(crate) struct NakedFunctionTestingAttribute {
973    #[primary_span]
974    #[label(builtin_macros_naked_attribute)]
975    pub naked_span: Span,
976    #[label]
977    pub testing_span: Span,
978}
979
980#[derive(Diagnostic)]
981#[diag(builtin_macros_non_generic_pointee)]
982pub(crate) struct NonGenericPointee {
983    #[primary_span]
984    pub span: Span,
985}
986
987#[derive(Diagnostic)]
988#[diag(builtin_macros_expected_other)]
989pub(crate) struct AsmExpectedOther {
990    #[primary_span]
991    #[label(builtin_macros_expected_other)]
992    pub(crate) span: Span,
993    pub(crate) is_inline_asm: bool,
994}
995
996#[derive(Diagnostic)]
997#[diag(builtin_macros_cfg_select_no_matches)]
998pub(crate) struct CfgSelectNoMatches {
999    #[primary_span]
1000    pub span: Span,
1001}
1002
1003#[derive(Diagnostic)]
1004#[diag(builtin_macros_cfg_select_unreachable)]
1005pub(crate) struct CfgSelectUnreachable {
1006    #[primary_span]
1007    #[label(builtin_macros_label2)]
1008    pub span: Span,
1009
1010    #[label]
1011    pub wildcard_span: Span,
1012}