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