rustc_builtin_macros/
errors.rs

1use rustc_errors::codes::*;
2use rustc_errors::{
3    Diag, DiagCtxtHandle, Diagnostic, EmissionGuarantee, Level, MultiSpan, SingleLabelManySpans,
4    SubdiagMessageOp, 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_invalid_crate_attribute)]
114pub(crate) struct InvalidCrateAttr {
115    #[primary_span]
116    pub(crate) span: Span,
117}
118
119#[derive(Diagnostic)]
120#[diag(builtin_macros_non_abi)]
121pub(crate) struct NonABI {
122    #[primary_span]
123    pub(crate) span: Span,
124}
125
126#[derive(Diagnostic)]
127#[diag(builtin_macros_trace_macros)]
128pub(crate) struct TraceMacros {
129    #[primary_span]
130    pub(crate) span: Span,
131}
132
133#[derive(Diagnostic)]
134#[diag(builtin_macros_bench_sig)]
135pub(crate) struct BenchSig {
136    #[primary_span]
137    pub(crate) span: Span,
138}
139
140#[derive(Diagnostic)]
141#[diag(builtin_macros_alloc_must_statics)]
142pub(crate) struct AllocMustStatics {
143    #[primary_span]
144    pub(crate) span: Span,
145}
146
147#[cfg(llvm_enzyme)]
148pub(crate) use autodiff::*;
149
150#[cfg(llvm_enzyme)]
151mod autodiff {
152    use super::*;
153    #[derive(Diagnostic)]
154    #[diag(builtin_macros_autodiff_missing_config)]
155    pub(crate) struct AutoDiffMissingConfig {
156        #[primary_span]
157        pub(crate) span: Span,
158    }
159    #[derive(Diagnostic)]
160    #[diag(builtin_macros_autodiff_unknown_activity)]
161    pub(crate) struct AutoDiffUnknownActivity {
162        #[primary_span]
163        pub(crate) span: Span,
164        pub(crate) act: String,
165    }
166    #[derive(Diagnostic)]
167    #[diag(builtin_macros_autodiff_ty_activity)]
168    pub(crate) struct AutoDiffInvalidTypeForActivity {
169        #[primary_span]
170        pub(crate) span: Span,
171        pub(crate) act: String,
172    }
173    #[derive(Diagnostic)]
174    #[diag(builtin_macros_autodiff_number_activities)]
175    pub(crate) struct AutoDiffInvalidNumberActivities {
176        #[primary_span]
177        pub(crate) span: Span,
178        pub(crate) expected: usize,
179        pub(crate) found: usize,
180    }
181    #[derive(Diagnostic)]
182    #[diag(builtin_macros_autodiff_mode_activity)]
183    pub(crate) struct AutoDiffInvalidApplicationModeAct {
184        #[primary_span]
185        pub(crate) span: Span,
186        pub(crate) mode: String,
187        pub(crate) act: String,
188    }
189
190    #[derive(Diagnostic)]
191    #[diag(builtin_macros_autodiff_mode)]
192    pub(crate) struct AutoDiffInvalidMode {
193        #[primary_span]
194        pub(crate) span: Span,
195        pub(crate) mode: String,
196    }
197
198    #[derive(Diagnostic)]
199    #[diag(builtin_macros_autodiff)]
200    pub(crate) struct AutoDiffInvalidApplication {
201        #[primary_span]
202        pub(crate) span: Span,
203    }
204}
205
206#[cfg(not(llvm_enzyme))]
207pub(crate) use ad_fallback::*;
208#[cfg(not(llvm_enzyme))]
209mod ad_fallback {
210    use super::*;
211    #[derive(Diagnostic)]
212    #[diag(builtin_macros_autodiff_not_build)]
213    pub(crate) struct AutoDiffSupportNotBuild {
214        #[primary_span]
215        pub(crate) span: Span,
216    }
217}
218
219#[derive(Diagnostic)]
220#[diag(builtin_macros_concat_bytes_invalid)]
221pub(crate) struct ConcatBytesInvalid {
222    #[primary_span]
223    pub(crate) span: Span,
224    pub(crate) lit_kind: &'static str,
225    #[subdiagnostic]
226    pub(crate) sugg: Option<ConcatBytesInvalidSuggestion>,
227}
228
229#[derive(Subdiagnostic)]
230pub(crate) enum ConcatBytesInvalidSuggestion {
231    #[suggestion(
232        builtin_macros_byte_char,
233        code = "b{snippet}",
234        applicability = "machine-applicable"
235    )]
236    CharLit {
237        #[primary_span]
238        span: Span,
239        snippet: String,
240    },
241    #[suggestion(
242        builtin_macros_byte_str,
243        code = "b{snippet}",
244        applicability = "machine-applicable"
245    )]
246    StrLit {
247        #[primary_span]
248        span: Span,
249        snippet: 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_concat_idents_missing_args)]
304pub(crate) struct ConcatIdentsMissingArgs {
305    #[primary_span]
306    pub(crate) span: Span,
307}
308
309#[derive(Diagnostic)]
310#[diag(builtin_macros_concat_idents_missing_comma)]
311pub(crate) struct ConcatIdentsMissingComma {
312    #[primary_span]
313    pub(crate) span: Span,
314}
315
316#[derive(Diagnostic)]
317#[diag(builtin_macros_concat_idents_ident_args)]
318pub(crate) struct ConcatIdentsIdentArgs {
319    #[primary_span]
320    pub(crate) span: Span,
321}
322
323#[derive(Diagnostic)]
324#[diag(builtin_macros_bad_derive_target, code = E0774)]
325pub(crate) struct BadDeriveTarget {
326    #[primary_span]
327    #[label]
328    pub(crate) span: Span,
329    #[label(builtin_macros_label2)]
330    pub(crate) item: Span,
331}
332
333#[derive(Diagnostic)]
334#[diag(builtin_macros_tests_not_support)]
335pub(crate) struct TestsNotSupport {}
336
337#[derive(Diagnostic)]
338#[diag(builtin_macros_unexpected_lit, code = E0777)]
339pub(crate) struct BadDeriveLit {
340    #[primary_span]
341    #[label]
342    pub(crate) span: Span,
343    #[subdiagnostic]
344    pub help: BadDeriveLitHelp,
345}
346
347#[derive(Subdiagnostic)]
348pub(crate) enum BadDeriveLitHelp {
349    #[help(builtin_macros_str_lit)]
350    StrLit { sym: Symbol },
351    #[help(builtin_macros_other)]
352    Other,
353}
354
355#[derive(Diagnostic)]
356#[diag(builtin_macros_derive_path_args_list)]
357pub(crate) struct DerivePathArgsList {
358    #[suggestion(code = "", applicability = "machine-applicable")]
359    #[primary_span]
360    pub(crate) span: Span,
361}
362
363#[derive(Diagnostic)]
364#[diag(builtin_macros_derive_path_args_value)]
365pub(crate) struct DerivePathArgsValue {
366    #[suggestion(code = "", applicability = "machine-applicable")]
367    #[primary_span]
368    pub(crate) span: Span,
369}
370
371#[derive(Diagnostic)]
372#[diag(builtin_macros_no_default_variant, code = E0665)]
373pub(crate) struct NoDefaultVariant {
374    #[primary_span]
375    pub(crate) span: Span,
376    #[label]
377    pub(crate) item_span: Span,
378    #[subdiagnostic]
379    pub(crate) suggs: Vec<NoDefaultVariantSugg>,
380}
381
382#[derive(Subdiagnostic)]
383#[suggestion(builtin_macros_suggestion, code = "#[default] ", applicability = "maybe-incorrect")]
384pub(crate) struct NoDefaultVariantSugg {
385    #[primary_span]
386    pub(crate) span: Span,
387}
388
389#[derive(Diagnostic)]
390#[diag(builtin_macros_multiple_defaults)]
391#[note]
392pub(crate) struct MultipleDefaults {
393    #[primary_span]
394    pub(crate) span: Span,
395    #[label]
396    pub(crate) first: Span,
397    #[label(builtin_macros_additional)]
398    pub additional: Vec<Span>,
399    #[subdiagnostic]
400    pub suggs: Vec<MultipleDefaultsSugg>,
401}
402
403#[derive(Subdiagnostic)]
404#[multipart_suggestion(
405    builtin_macros_suggestion,
406    applicability = "maybe-incorrect",
407    style = "tool-only"
408)]
409pub(crate) struct MultipleDefaultsSugg {
410    #[suggestion_part(code = "")]
411    pub(crate) spans: Vec<Span>,
412    pub(crate) ident: Ident,
413}
414
415#[derive(Diagnostic)]
416#[diag(builtin_macros_non_unit_default)]
417#[help]
418pub(crate) struct NonUnitDefault {
419    #[primary_span]
420    pub(crate) span: Span,
421    pub(crate) post: &'static str,
422}
423
424#[derive(Diagnostic)]
425#[diag(builtin_macros_non_exhaustive_default)]
426#[help]
427pub(crate) struct NonExhaustiveDefault {
428    #[primary_span]
429    pub(crate) span: Span,
430    #[label]
431    pub(crate) non_exhaustive: Span,
432}
433
434#[derive(Diagnostic)]
435#[diag(builtin_macros_multiple_default_attrs)]
436#[note]
437pub(crate) struct MultipleDefaultAttrs {
438    #[primary_span]
439    pub(crate) span: Span,
440    #[label]
441    pub(crate) first: Span,
442    #[label(builtin_macros_label_again)]
443    pub(crate) first_rest: Span,
444    #[help]
445    pub(crate) rest: MultiSpan,
446    pub(crate) only_one: bool,
447    #[subdiagnostic]
448    pub(crate) sugg: MultipleDefaultAttrsSugg,
449}
450
451#[derive(Subdiagnostic)]
452#[multipart_suggestion(
453    builtin_macros_help,
454    applicability = "machine-applicable",
455    style = "tool-only"
456)]
457pub(crate) struct MultipleDefaultAttrsSugg {
458    #[suggestion_part(code = "")]
459    pub(crate) spans: Vec<Span>,
460}
461
462#[derive(Diagnostic)]
463#[diag(builtin_macros_default_arg)]
464pub(crate) struct DefaultHasArg {
465    #[primary_span]
466    #[suggestion(code = "#[default]", style = "hidden", applicability = "maybe-incorrect")]
467    pub(crate) span: Span,
468}
469
470#[derive(Diagnostic)]
471#[diag(builtin_macros_derive_macro_call)]
472pub(crate) struct DeriveMacroCall {
473    #[primary_span]
474    pub(crate) span: Span,
475}
476
477#[derive(Diagnostic)]
478#[diag(builtin_macros_cannot_derive_union)]
479pub(crate) struct DeriveUnion {
480    #[primary_span]
481    pub(crate) span: Span,
482}
483
484#[derive(Diagnostic)]
485#[diag(builtin_macros_env_takes_args)]
486pub(crate) struct EnvTakesArgs {
487    #[primary_span]
488    pub(crate) span: Span,
489}
490
491pub(crate) struct EnvNotDefinedWithUserMessage {
492    pub(crate) span: Span,
493    pub(crate) msg_from_user: Symbol,
494}
495
496// Hand-written implementation to support custom user messages.
497impl<'a, G: EmissionGuarantee> Diagnostic<'a, G> for EnvNotDefinedWithUserMessage {
498    #[track_caller]
499    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, G> {
500        #[expect(
501            rustc::untranslatable_diagnostic,
502            reason = "cannot translate user-provided messages"
503        )]
504        let mut diag = Diag::new(dcx, level, self.msg_from_user.to_string());
505        diag.span(self.span);
506        diag
507    }
508}
509
510#[derive(Diagnostic)]
511pub(crate) enum EnvNotDefined<'a> {
512    #[diag(builtin_macros_env_not_defined)]
513    #[help(builtin_macros_cargo)]
514    CargoEnvVar {
515        #[primary_span]
516        span: Span,
517        var: Symbol,
518        var_expr: &'a rustc_ast::Expr,
519    },
520    #[diag(builtin_macros_env_not_defined)]
521    #[help(builtin_macros_custom)]
522    CustomEnvVar {
523        #[primary_span]
524        span: Span,
525        var: Symbol,
526        var_expr: &'a rustc_ast::Expr,
527    },
528}
529
530#[derive(Diagnostic)]
531#[diag(builtin_macros_env_not_unicode)]
532pub(crate) struct EnvNotUnicode {
533    #[primary_span]
534    pub(crate) span: Span,
535    pub(crate) var: Symbol,
536}
537
538#[derive(Diagnostic)]
539#[diag(builtin_macros_format_requires_string)]
540pub(crate) struct FormatRequiresString {
541    #[primary_span]
542    pub(crate) span: Span,
543}
544
545#[derive(Diagnostic)]
546#[diag(builtin_macros_format_duplicate_arg)]
547pub(crate) struct FormatDuplicateArg {
548    #[primary_span]
549    pub(crate) span: Span,
550    #[label(builtin_macros_label1)]
551    pub(crate) prev: Span,
552    #[label(builtin_macros_label2)]
553    pub(crate) duplicate: Span,
554    pub(crate) ident: Ident,
555}
556
557#[derive(Diagnostic)]
558#[diag(builtin_macros_format_positional_after_named)]
559pub(crate) struct PositionalAfterNamed {
560    #[primary_span]
561    #[label]
562    pub(crate) span: Span,
563    #[label(builtin_macros_named_args)]
564    pub(crate) args: Vec<Span>,
565}
566
567#[derive(Diagnostic)]
568#[diag(builtin_macros_format_string_invalid)]
569pub(crate) struct InvalidFormatString {
570    #[primary_span]
571    #[label]
572    pub(crate) span: Span,
573    pub(crate) desc: String,
574    pub(crate) label1: String,
575    #[subdiagnostic]
576    pub(crate) note_: Option<InvalidFormatStringNote>,
577    #[subdiagnostic]
578    pub(crate) label_: Option<InvalidFormatStringLabel>,
579    #[subdiagnostic]
580    pub(crate) sugg_: Option<InvalidFormatStringSuggestion>,
581}
582
583#[derive(Subdiagnostic)]
584#[note(builtin_macros_note)]
585pub(crate) struct InvalidFormatStringNote {
586    pub(crate) note: String,
587}
588
589#[derive(Subdiagnostic)]
590#[label(builtin_macros_second_label)]
591pub(crate) struct InvalidFormatStringLabel {
592    #[primary_span]
593    pub(crate) span: Span,
594    pub(crate) label: String,
595}
596
597#[derive(Subdiagnostic)]
598pub(crate) enum InvalidFormatStringSuggestion {
599    #[multipart_suggestion(
600        builtin_macros_format_use_positional,
601        style = "verbose",
602        applicability = "machine-applicable"
603    )]
604    UsePositional {
605        #[suggestion_part(code = "{len}")]
606        captured: Span,
607        len: String,
608        #[suggestion_part(code = ", {arg}")]
609        span: Span,
610        arg: String,
611    },
612    #[suggestion(
613        builtin_macros_format_remove_raw_ident,
614        code = "",
615        applicability = "machine-applicable"
616    )]
617    RemoveRawIdent {
618        #[primary_span]
619        span: Span,
620    },
621    #[suggestion(
622        builtin_macros_format_reorder_format_parameter,
623        code = "{replacement}",
624        style = "verbose",
625        applicability = "machine-applicable"
626    )]
627    ReorderFormatParameter {
628        #[primary_span]
629        span: Span,
630        replacement: String,
631    },
632}
633
634#[derive(Diagnostic)]
635#[diag(builtin_macros_format_no_arg_named)]
636#[note]
637#[note(builtin_macros_note2)]
638pub(crate) struct FormatNoArgNamed {
639    #[primary_span]
640    pub(crate) span: Span,
641    pub(crate) name: Symbol,
642}
643
644#[derive(Diagnostic)]
645#[diag(builtin_macros_format_unknown_trait)]
646#[note]
647pub(crate) struct FormatUnknownTrait<'a> {
648    #[primary_span]
649    pub(crate) span: Span,
650    pub(crate) ty: &'a str,
651    #[subdiagnostic]
652    pub(crate) suggs: Vec<FormatUnknownTraitSugg>,
653}
654
655#[derive(Subdiagnostic)]
656#[suggestion(
657    builtin_macros_suggestion,
658    code = "{fmt}",
659    style = "tool-only",
660    applicability = "maybe-incorrect"
661)]
662pub(crate) struct FormatUnknownTraitSugg {
663    #[primary_span]
664    pub span: Span,
665    pub fmt: &'static str,
666    pub trait_name: &'static str,
667}
668
669#[derive(Diagnostic)]
670#[diag(builtin_macros_format_unused_arg)]
671pub(crate) struct FormatUnusedArg {
672    #[primary_span]
673    #[label(builtin_macros_format_unused_arg)]
674    pub(crate) span: Span,
675    pub(crate) named: bool,
676}
677
678// Allow the singular form to be a subdiagnostic of the multiple-unused
679// form of diagnostic.
680impl Subdiagnostic for FormatUnusedArg {
681    fn add_to_diag_with<G: EmissionGuarantee, F: SubdiagMessageOp<G>>(
682        self,
683        diag: &mut Diag<'_, G>,
684        f: &F,
685    ) {
686        diag.arg("named", self.named);
687        let msg = f(diag, crate::fluent_generated::builtin_macros_format_unused_arg.into());
688        diag.span_label(self.span, msg);
689    }
690}
691
692#[derive(Diagnostic)]
693#[diag(builtin_macros_format_unused_args)]
694pub(crate) struct FormatUnusedArgs {
695    #[primary_span]
696    pub(crate) unused: Vec<Span>,
697    #[label]
698    pub(crate) fmt: Span,
699    #[subdiagnostic]
700    pub(crate) unused_labels: Vec<FormatUnusedArg>,
701}
702
703#[derive(Diagnostic)]
704#[diag(builtin_macros_format_pos_mismatch)]
705pub(crate) struct FormatPositionalMismatch {
706    #[primary_span]
707    pub(crate) span: MultiSpan,
708    pub(crate) n: usize,
709    pub(crate) desc: String,
710    #[subdiagnostic]
711    pub(crate) highlight: SingleLabelManySpans,
712}
713
714#[derive(Diagnostic)]
715#[diag(builtin_macros_format_redundant_args)]
716pub(crate) struct FormatRedundantArgs {
717    #[primary_span]
718    pub(crate) span: MultiSpan,
719    pub(crate) n: usize,
720
721    #[note]
722    pub(crate) note: MultiSpan,
723
724    #[subdiagnostic]
725    pub(crate) sugg: Option<FormatRedundantArgsSugg>,
726}
727
728#[derive(Subdiagnostic)]
729#[multipart_suggestion(builtin_macros_suggestion, applicability = "machine-applicable")]
730pub(crate) struct FormatRedundantArgsSugg {
731    #[suggestion_part(code = "")]
732    pub(crate) spans: Vec<Span>,
733}
734
735#[derive(Diagnostic)]
736#[diag(builtin_macros_test_case_non_item)]
737pub(crate) struct TestCaseNonItem {
738    #[primary_span]
739    pub(crate) span: Span,
740}
741
742#[derive(Diagnostic)]
743#[diag(builtin_macros_test_bad_fn)]
744pub(crate) struct TestBadFn {
745    #[primary_span]
746    pub(crate) span: Span,
747    #[label]
748    pub(crate) cause: Span,
749    pub(crate) kind: &'static str,
750}
751
752#[derive(Diagnostic)]
753#[diag(builtin_macros_asm_explicit_register_name)]
754pub(crate) struct AsmExplicitRegisterName {
755    #[primary_span]
756    pub(crate) span: Span,
757}
758
759#[derive(Diagnostic)]
760#[diag(builtin_macros_asm_mutually_exclusive)]
761pub(crate) struct AsmMutuallyExclusive {
762    #[primary_span]
763    pub(crate) spans: Vec<Span>,
764    pub(crate) opt1: &'static str,
765    pub(crate) opt2: &'static str,
766}
767
768#[derive(Diagnostic)]
769#[diag(builtin_macros_asm_pure_combine)]
770pub(crate) struct AsmPureCombine {
771    #[primary_span]
772    pub(crate) spans: Vec<Span>,
773}
774
775#[derive(Diagnostic)]
776#[diag(builtin_macros_asm_pure_no_output)]
777pub(crate) struct AsmPureNoOutput {
778    #[primary_span]
779    pub(crate) spans: Vec<Span>,
780}
781
782#[derive(Diagnostic)]
783#[diag(builtin_macros_asm_modifier_invalid)]
784pub(crate) struct AsmModifierInvalid {
785    #[primary_span]
786    pub(crate) span: Span,
787}
788
789#[derive(Diagnostic)]
790#[diag(builtin_macros_asm_requires_template)]
791pub(crate) struct AsmRequiresTemplate {
792    #[primary_span]
793    pub(crate) span: Span,
794}
795
796#[derive(Diagnostic)]
797#[diag(builtin_macros_asm_expected_comma)]
798pub(crate) struct AsmExpectedComma {
799    #[primary_span]
800    #[label]
801    pub(crate) span: Span,
802}
803
804#[derive(Diagnostic)]
805#[diag(builtin_macros_asm_expected_string_literal)]
806pub(crate) struct AsmExpectedStringLiteral {
807    #[primary_span]
808    #[label]
809    pub(crate) span: Span,
810}
811
812#[derive(Diagnostic)]
813#[diag(builtin_macros_asm_underscore_input)]
814pub(crate) struct AsmUnderscoreInput {
815    #[primary_span]
816    pub(crate) span: Span,
817}
818
819#[derive(Diagnostic)]
820#[diag(builtin_macros_asm_sym_no_path)]
821pub(crate) struct AsmSymNoPath {
822    #[primary_span]
823    pub(crate) span: Span,
824}
825
826#[derive(Diagnostic)]
827#[diag(builtin_macros_asm_expected_other)]
828pub(crate) struct AsmExpectedOther {
829    #[primary_span]
830    #[label(builtin_macros_asm_expected_other)]
831    pub(crate) span: Span,
832    pub(crate) is_inline_asm: bool,
833}
834
835#[derive(Diagnostic)]
836#[diag(builtin_macros_asm_duplicate_arg)]
837pub(crate) struct AsmDuplicateArg {
838    #[primary_span]
839    #[label(builtin_macros_arg)]
840    pub(crate) span: Span,
841    #[label]
842    pub(crate) prev: Span,
843    pub(crate) name: Symbol,
844}
845
846#[derive(Diagnostic)]
847#[diag(builtin_macros_asm_pos_after)]
848pub(crate) struct AsmPositionalAfter {
849    #[primary_span]
850    #[label(builtin_macros_pos)]
851    pub(crate) span: Span,
852    #[label(builtin_macros_named)]
853    pub(crate) named: Vec<Span>,
854    #[label(builtin_macros_explicit)]
855    pub(crate) explicit: Vec<Span>,
856}
857
858#[derive(Diagnostic)]
859#[diag(builtin_macros_asm_noreturn)]
860pub(crate) struct AsmNoReturn {
861    #[primary_span]
862    pub(crate) outputs_sp: Vec<Span>,
863}
864
865#[derive(Diagnostic)]
866#[diag(builtin_macros_asm_no_matched_argument_name)]
867pub(crate) struct AsmNoMatchedArgumentName {
868    pub(crate) name: String,
869    #[primary_span]
870    pub(crate) span: Span,
871}
872
873#[derive(Diagnostic)]
874#[diag(builtin_macros_asm_mayunwind)]
875pub(crate) struct AsmMayUnwind {
876    #[primary_span]
877    pub(crate) labels_sp: Vec<Span>,
878}
879
880pub(crate) struct AsmClobberNoReg {
881    pub(crate) spans: Vec<Span>,
882    pub(crate) clobbers: Vec<Span>,
883}
884
885impl<'a, G: EmissionGuarantee> Diagnostic<'a, G> for AsmClobberNoReg {
886    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, G> {
887        // eager translation as `span_labels` takes `AsRef<str>`
888        let lbl1 = dcx.eagerly_translate_to_string(
889            crate::fluent_generated::builtin_macros_asm_clobber_abi,
890            [].into_iter(),
891        );
892        let lbl2 = dcx.eagerly_translate_to_string(
893            crate::fluent_generated::builtin_macros_asm_clobber_outputs,
894            [].into_iter(),
895        );
896        Diag::new(dcx, level, crate::fluent_generated::builtin_macros_asm_clobber_no_reg)
897            .with_span(self.spans.clone())
898            .with_span_labels(self.clobbers, &lbl1)
899            .with_span_labels(self.spans, &lbl2)
900    }
901}
902
903#[derive(Diagnostic)]
904#[diag(builtin_macros_asm_opt_already_provided)]
905pub(crate) struct AsmOptAlreadyprovided {
906    #[primary_span]
907    #[label]
908    pub(crate) span: Span,
909    pub(crate) symbol: Symbol,
910    #[suggestion(code = "", applicability = "machine-applicable", style = "tool-only")]
911    pub(crate) full_span: Span,
912}
913
914#[derive(Diagnostic)]
915#[diag(builtin_macros_asm_unsupported_option)]
916pub(crate) struct AsmUnsupportedOption {
917    #[primary_span]
918    #[label]
919    pub(crate) span: Span,
920    pub(crate) symbol: Symbol,
921    #[suggestion(code = "", applicability = "machine-applicable", style = "tool-only")]
922    pub(crate) full_span: Span,
923    pub(crate) macro_name: &'static str,
924}
925
926#[derive(Diagnostic)]
927#[diag(builtin_macros_asm_unsupported_operand)]
928pub(crate) struct AsmUnsupportedOperand<'a> {
929    #[primary_span]
930    #[label]
931    pub(crate) span: Span,
932    pub(crate) symbol: &'a str,
933    pub(crate) macro_name: &'static str,
934}
935
936#[derive(Diagnostic)]
937#[diag(builtin_macros_asm_unsupported_clobber_abi)]
938pub(crate) struct AsmUnsupportedClobberAbi {
939    #[primary_span]
940    pub(crate) spans: Vec<Span>,
941    pub(crate) macro_name: &'static str,
942}
943
944#[derive(Diagnostic)]
945#[diag(builtin_macros_test_runner_invalid)]
946pub(crate) struct TestRunnerInvalid {
947    #[primary_span]
948    pub(crate) span: Span,
949}
950
951#[derive(Diagnostic)]
952#[diag(builtin_macros_test_runner_nargs)]
953pub(crate) struct TestRunnerNargs {
954    #[primary_span]
955    pub(crate) span: Span,
956}
957
958#[derive(Diagnostic)]
959#[diag(builtin_macros_expected_register_class_or_explicit_register)]
960pub(crate) struct ExpectedRegisterClassOrExplicitRegister {
961    #[primary_span]
962    pub(crate) span: Span,
963}
964
965#[derive(Diagnostic)]
966#[diag(builtin_macros_expected_comma_in_list)]
967pub(crate) struct ExpectedCommaInList {
968    #[primary_span]
969    pub span: Span,
970}
971
972#[derive(Diagnostic)]
973#[diag(builtin_macros_only_one_argument)]
974pub(crate) struct OnlyOneArgument<'a> {
975    #[primary_span]
976    pub span: Span,
977    pub name: &'a str,
978}
979
980#[derive(Diagnostic)]
981#[diag(builtin_macros_takes_no_arguments)]
982pub(crate) struct TakesNoArguments<'a> {
983    #[primary_span]
984    pub span: Span,
985    pub name: &'a str,
986}
987
988#[derive(Diagnostic)]
989#[diag(builtin_macros_proc_macro_attribute_only_be_used_on_bare_functions)]
990pub(crate) struct AttributeOnlyBeUsedOnBareFunctions<'a> {
991    #[primary_span]
992    pub span: Span,
993    pub path: &'a str,
994}
995
996#[derive(Diagnostic)]
997#[diag(builtin_macros_proc_macro_attribute_only_usable_with_crate_type)]
998pub(crate) struct AttributeOnlyUsableWithCrateType<'a> {
999    #[primary_span]
1000    pub span: Span,
1001    pub path: &'a str,
1002}
1003
1004#[derive(Diagnostic)]
1005#[diag(builtin_macros_source_uitls_expected_item)]
1006pub(crate) struct ExpectedItem<'a> {
1007    #[primary_span]
1008    pub span: Span,
1009    pub token: &'a str,
1010}
1011
1012#[derive(Diagnostic)]
1013#[diag(builtin_macros_naked_functions_testing_attribute, code = E0736)]
1014pub(crate) struct NakedFunctionTestingAttribute {
1015    #[primary_span]
1016    #[label(builtin_macros_naked_attribute)]
1017    pub naked_span: Span,
1018    #[label]
1019    pub testing_span: Span,
1020}
1021
1022#[derive(Diagnostic)]
1023#[diag(builtin_macros_non_generic_pointee)]
1024pub(crate) struct NonGenericPointee {
1025    #[primary_span]
1026    pub span: Span,
1027}