rustc_parse/
errors.rs

1// ignore-tidy-filelength
2
3use std::borrow::Cow;
4
5use rustc_ast::token::Token;
6use rustc_ast::util::parser::ExprPrecedence;
7use rustc_ast::{Path, Visibility};
8use rustc_errors::codes::*;
9use rustc_errors::{
10    Applicability, Diag, DiagCtxtHandle, Diagnostic, EmissionGuarantee, Level, Subdiagnostic,
11};
12use rustc_macros::{Diagnostic, Subdiagnostic};
13use rustc_session::errors::ExprParenthesesNeeded;
14use rustc_span::edition::{Edition, LATEST_STABLE_EDITION};
15use rustc_span::{Ident, Span, Symbol};
16
17use crate::fluent_generated as fluent;
18use crate::parser::{ForbiddenLetReason, TokenDescription};
19
20#[derive(Diagnostic)]
21#[diag(parse_maybe_report_ambiguous_plus)]
22pub(crate) struct AmbiguousPlus {
23    #[primary_span]
24    pub span: Span,
25    #[subdiagnostic]
26    pub suggestion: AddParen,
27}
28
29#[derive(Diagnostic)]
30#[diag(parse_maybe_recover_from_bad_type_plus, code = E0178)]
31pub(crate) struct BadTypePlus {
32    #[primary_span]
33    pub span: Span,
34    #[subdiagnostic]
35    pub sub: BadTypePlusSub,
36}
37
38#[derive(Subdiagnostic)]
39#[multipart_suggestion(parse_add_paren, applicability = "machine-applicable")]
40pub(crate) struct AddParen {
41    #[suggestion_part(code = "(")]
42    pub lo: Span,
43    #[suggestion_part(code = ")")]
44    pub hi: Span,
45}
46
47#[derive(Subdiagnostic)]
48pub(crate) enum BadTypePlusSub {
49    AddParen {
50        #[subdiagnostic]
51        suggestion: AddParen,
52    },
53    #[label(parse_forgot_paren)]
54    ForgotParen {
55        #[primary_span]
56        span: Span,
57    },
58    #[label(parse_expect_path)]
59    ExpectPath {
60        #[primary_span]
61        span: Span,
62    },
63}
64
65#[derive(Diagnostic)]
66#[diag(parse_maybe_recover_from_bad_qpath_stage_2)]
67pub(crate) struct BadQPathStage2 {
68    #[primary_span]
69    pub span: Span,
70    #[subdiagnostic]
71    pub wrap: WrapType,
72}
73
74#[derive(Subdiagnostic)]
75#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
76pub(crate) struct WrapType {
77    #[suggestion_part(code = "<")]
78    pub lo: Span,
79    #[suggestion_part(code = ">")]
80    pub hi: Span,
81}
82
83#[derive(Diagnostic)]
84#[diag(parse_incorrect_semicolon)]
85pub(crate) struct IncorrectSemicolon<'a> {
86    #[primary_span]
87    #[suggestion(style = "verbose", code = "", applicability = "machine-applicable")]
88    pub span: Span,
89    #[help]
90    pub show_help: bool,
91    pub name: &'a str,
92}
93
94#[derive(Diagnostic)]
95#[diag(parse_incorrect_use_of_await)]
96pub(crate) struct IncorrectUseOfAwait {
97    #[primary_span]
98    #[suggestion(
99        parse_parentheses_suggestion,
100        style = "verbose",
101        code = "",
102        applicability = "machine-applicable"
103    )]
104    pub span: Span,
105}
106
107#[derive(Diagnostic)]
108#[diag(parse_incorrect_use_of_use)]
109pub(crate) struct IncorrectUseOfUse {
110    #[primary_span]
111    #[suggestion(
112        parse_parentheses_suggestion,
113        style = "verbose",
114        code = "",
115        applicability = "machine-applicable"
116    )]
117    pub span: Span,
118}
119
120#[derive(Subdiagnostic)]
121#[multipart_suggestion(
122    parse_incorrect_use_of_await_postfix_suggestion,
123    applicability = "machine-applicable"
124)]
125pub(crate) struct AwaitSuggestion {
126    #[suggestion_part(code = "")]
127    pub removal: Span,
128    #[suggestion_part(code = ".await{question_mark}")]
129    pub dot_await: Span,
130    pub question_mark: &'static str,
131}
132
133#[derive(Diagnostic)]
134#[diag(parse_incorrect_use_of_await)]
135pub(crate) struct IncorrectAwait {
136    #[primary_span]
137    pub span: Span,
138    #[subdiagnostic]
139    pub suggestion: AwaitSuggestion,
140}
141
142#[derive(Diagnostic)]
143#[diag(parse_in_in_typo)]
144pub(crate) struct InInTypo {
145    #[primary_span]
146    pub span: Span,
147    #[suggestion(code = "", style = "verbose", applicability = "machine-applicable")]
148    pub sugg_span: Span,
149}
150
151#[derive(Diagnostic)]
152#[diag(parse_invalid_variable_declaration)]
153pub(crate) struct InvalidVariableDeclaration {
154    #[primary_span]
155    pub span: Span,
156    #[subdiagnostic]
157    pub sub: InvalidVariableDeclarationSub,
158}
159
160#[derive(Subdiagnostic)]
161pub(crate) enum InvalidVariableDeclarationSub {
162    #[suggestion(
163        parse_switch_mut_let_order,
164        style = "verbose",
165        applicability = "maybe-incorrect",
166        code = "let mut"
167    )]
168    SwitchMutLetOrder(#[primary_span] Span),
169    #[suggestion(
170        parse_missing_let_before_mut,
171        applicability = "machine-applicable",
172        style = "verbose",
173        code = "let mut"
174    )]
175    MissingLet(#[primary_span] Span),
176    #[suggestion(
177        parse_use_let_not_auto,
178        style = "verbose",
179        applicability = "machine-applicable",
180        code = "let"
181    )]
182    UseLetNotAuto(#[primary_span] Span),
183    #[suggestion(
184        parse_use_let_not_var,
185        style = "verbose",
186        applicability = "machine-applicable",
187        code = "let"
188    )]
189    UseLetNotVar(#[primary_span] Span),
190}
191
192#[derive(Diagnostic)]
193#[diag(parse_switch_ref_box_order)]
194pub(crate) struct SwitchRefBoxOrder {
195    #[primary_span]
196    #[suggestion(applicability = "machine-applicable", style = "verbose", code = "box ref")]
197    pub span: Span,
198}
199
200#[derive(Diagnostic)]
201#[diag(parse_invalid_comparison_operator)]
202pub(crate) struct InvalidComparisonOperator {
203    #[primary_span]
204    pub span: Span,
205    pub invalid: String,
206    #[subdiagnostic]
207    pub sub: InvalidComparisonOperatorSub,
208}
209
210#[derive(Subdiagnostic)]
211pub(crate) enum InvalidComparisonOperatorSub {
212    #[suggestion(
213        parse_use_instead,
214        style = "verbose",
215        applicability = "machine-applicable",
216        code = "{correct}"
217    )]
218    Correctable {
219        #[primary_span]
220        span: Span,
221        invalid: String,
222        correct: String,
223    },
224    #[label(parse_spaceship_operator_invalid)]
225    Spaceship(#[primary_span] Span),
226}
227
228#[derive(Diagnostic)]
229#[diag(parse_invalid_logical_operator)]
230#[note]
231pub(crate) struct InvalidLogicalOperator {
232    #[primary_span]
233    pub span: Span,
234    pub incorrect: String,
235    #[subdiagnostic]
236    pub sub: InvalidLogicalOperatorSub,
237}
238
239#[derive(Subdiagnostic)]
240pub(crate) enum InvalidLogicalOperatorSub {
241    #[suggestion(
242        parse_use_amp_amp_for_conjunction,
243        style = "verbose",
244        applicability = "machine-applicable",
245        code = "&&"
246    )]
247    Conjunction(#[primary_span] Span),
248    #[suggestion(
249        parse_use_pipe_pipe_for_disjunction,
250        style = "verbose",
251        applicability = "machine-applicable",
252        code = "||"
253    )]
254    Disjunction(#[primary_span] Span),
255}
256
257#[derive(Diagnostic)]
258#[diag(parse_tilde_is_not_unary_operator)]
259pub(crate) struct TildeAsUnaryOperator(
260    #[primary_span]
261    #[suggestion(style = "verbose", applicability = "machine-applicable", code = "!")]
262    pub Span,
263);
264
265#[derive(Diagnostic)]
266#[diag(parse_unexpected_token_after_not)]
267pub(crate) struct NotAsNegationOperator {
268    #[primary_span]
269    pub negated: Span,
270    pub negated_desc: String,
271    #[subdiagnostic]
272    pub sub: NotAsNegationOperatorSub,
273}
274
275#[derive(Subdiagnostic)]
276pub(crate) enum NotAsNegationOperatorSub {
277    #[suggestion(
278        parse_unexpected_token_after_not_default,
279        style = "verbose",
280        applicability = "machine-applicable",
281        code = "!"
282    )]
283    SuggestNotDefault(#[primary_span] Span),
284
285    #[suggestion(
286        parse_unexpected_token_after_not_bitwise,
287        style = "verbose",
288        applicability = "machine-applicable",
289        code = "!"
290    )]
291    SuggestNotBitwise(#[primary_span] Span),
292
293    #[suggestion(
294        parse_unexpected_token_after_not_logical,
295        style = "verbose",
296        applicability = "machine-applicable",
297        code = "!"
298    )]
299    SuggestNotLogical(#[primary_span] Span),
300}
301
302#[derive(Diagnostic)]
303#[diag(parse_malformed_loop_label)]
304pub(crate) struct MalformedLoopLabel {
305    #[primary_span]
306    pub span: Span,
307    #[suggestion(applicability = "machine-applicable", code = "'", style = "verbose")]
308    pub suggestion: Span,
309}
310
311#[derive(Diagnostic)]
312#[diag(parse_lifetime_in_borrow_expression)]
313pub(crate) struct LifetimeInBorrowExpression {
314    #[primary_span]
315    pub span: Span,
316    #[suggestion(applicability = "machine-applicable", code = "", style = "verbose")]
317    #[label]
318    pub lifetime_span: Span,
319}
320
321#[derive(Diagnostic)]
322#[diag(parse_field_expression_with_generic)]
323pub(crate) struct FieldExpressionWithGeneric(#[primary_span] pub Span);
324
325#[derive(Diagnostic)]
326#[diag(parse_macro_invocation_with_qualified_path)]
327pub(crate) struct MacroInvocationWithQualifiedPath(#[primary_span] pub Span);
328
329#[derive(Diagnostic)]
330#[diag(parse_unexpected_token_after_label)]
331pub(crate) struct UnexpectedTokenAfterLabel {
332    #[primary_span]
333    #[label(parse_unexpected_token_after_label)]
334    pub span: Span,
335    #[suggestion(parse_suggestion_remove_label, style = "verbose", code = "")]
336    pub remove_label: Option<Span>,
337    #[subdiagnostic]
338    pub enclose_in_block: Option<UnexpectedTokenAfterLabelSugg>,
339}
340
341#[derive(Subdiagnostic)]
342#[multipart_suggestion(parse_suggestion_enclose_in_block, applicability = "machine-applicable")]
343pub(crate) struct UnexpectedTokenAfterLabelSugg {
344    #[suggestion_part(code = "{{ ")]
345    pub left: Span,
346    #[suggestion_part(code = " }}")]
347    pub right: Span,
348}
349
350#[derive(Diagnostic)]
351#[diag(parse_require_colon_after_labeled_expression)]
352#[note]
353pub(crate) struct RequireColonAfterLabeledExpression {
354    #[primary_span]
355    pub span: Span,
356    #[label]
357    pub label: Span,
358    #[suggestion(style = "verbose", applicability = "machine-applicable", code = ": ")]
359    pub label_end: Span,
360}
361
362#[derive(Diagnostic)]
363#[diag(parse_do_catch_syntax_removed)]
364#[note]
365pub(crate) struct DoCatchSyntaxRemoved {
366    #[primary_span]
367    #[suggestion(applicability = "machine-applicable", code = "try", style = "verbose")]
368    pub span: Span,
369}
370
371#[derive(Diagnostic)]
372#[diag(parse_float_literal_requires_integer_part)]
373pub(crate) struct FloatLiteralRequiresIntegerPart {
374    #[primary_span]
375    pub span: Span,
376    #[suggestion(applicability = "machine-applicable", code = "0", style = "verbose")]
377    pub suggestion: Span,
378}
379
380#[derive(Diagnostic)]
381#[diag(parse_missing_semicolon_before_array)]
382pub(crate) struct MissingSemicolonBeforeArray {
383    #[primary_span]
384    pub open_delim: Span,
385    #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = ";")]
386    pub semicolon: Span,
387}
388
389#[derive(Diagnostic)]
390#[diag(parse_expect_dotdot_not_dotdotdot)]
391pub(crate) struct MissingDotDot {
392    #[primary_span]
393    pub token_span: Span,
394    #[suggestion(applicability = "maybe-incorrect", code = "..", style = "verbose")]
395    pub sugg_span: Span,
396}
397
398#[derive(Diagnostic)]
399#[diag(parse_invalid_block_macro_segment)]
400pub(crate) struct InvalidBlockMacroSegment {
401    #[primary_span]
402    pub span: Span,
403    #[label]
404    pub context: Span,
405    #[subdiagnostic]
406    pub wrap: WrapInExplicitBlock,
407}
408
409#[derive(Subdiagnostic)]
410#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
411pub(crate) struct WrapInExplicitBlock {
412    #[suggestion_part(code = "{{ ")]
413    pub lo: Span,
414    #[suggestion_part(code = " }}")]
415    pub hi: Span,
416}
417
418#[derive(Diagnostic)]
419#[diag(parse_if_expression_missing_then_block)]
420pub(crate) struct IfExpressionMissingThenBlock {
421    #[primary_span]
422    pub if_span: Span,
423    #[subdiagnostic]
424    pub missing_then_block_sub: IfExpressionMissingThenBlockSub,
425    #[subdiagnostic]
426    pub let_else_sub: Option<IfExpressionLetSomeSub>,
427}
428
429#[derive(Subdiagnostic)]
430pub(crate) enum IfExpressionMissingThenBlockSub {
431    #[help(parse_condition_possibly_unfinished)]
432    UnfinishedCondition(#[primary_span] Span),
433    #[help(parse_add_then_block)]
434    AddThenBlock(#[primary_span] Span),
435}
436
437#[derive(Diagnostic)]
438#[diag(parse_ternary_operator)]
439pub(crate) struct TernaryOperator {
440    #[primary_span]
441    pub span: Span,
442    /// If we have a span for the condition expression, suggest the if/else
443    #[subdiagnostic]
444    pub sugg: Option<TernaryOperatorSuggestion>,
445    /// Otherwise, just print the suggestion message
446    #[help(parse_use_if_else)]
447    pub no_sugg: bool,
448}
449
450#[derive(Subdiagnostic, Copy, Clone)]
451#[multipart_suggestion(parse_use_if_else, applicability = "maybe-incorrect", style = "verbose")]
452pub(crate) struct TernaryOperatorSuggestion {
453    #[suggestion_part(code = "if ")]
454    pub before_cond: Span,
455    #[suggestion_part(code = "{{")]
456    pub question: Span,
457    #[suggestion_part(code = "}} else {{")]
458    pub colon: Span,
459    #[suggestion_part(code = " }}")]
460    pub end: Span,
461}
462
463#[derive(Subdiagnostic)]
464#[suggestion(
465    parse_extra_if_in_let_else,
466    applicability = "maybe-incorrect",
467    code = "",
468    style = "verbose"
469)]
470pub(crate) struct IfExpressionLetSomeSub {
471    #[primary_span]
472    pub if_span: Span,
473}
474
475#[derive(Diagnostic)]
476#[diag(parse_if_expression_missing_condition)]
477pub(crate) struct IfExpressionMissingCondition {
478    #[primary_span]
479    #[label(parse_condition_label)]
480    pub if_span: Span,
481    #[label(parse_block_label)]
482    pub block_span: Span,
483}
484
485#[derive(Diagnostic)]
486#[diag(parse_expected_expression_found_let)]
487#[note]
488pub(crate) struct ExpectedExpressionFoundLet {
489    #[primary_span]
490    pub span: Span,
491    #[subdiagnostic]
492    pub reason: ForbiddenLetReason,
493    #[subdiagnostic]
494    pub missing_let: Option<MaybeMissingLet>,
495    #[subdiagnostic]
496    pub comparison: Option<MaybeComparison>,
497}
498
499#[derive(Diagnostic)]
500#[diag(parse_or_in_let_chain)]
501pub(crate) struct OrInLetChain {
502    #[primary_span]
503    pub span: Span,
504}
505
506#[derive(Subdiagnostic, Clone, Copy)]
507#[multipart_suggestion(
508    parse_maybe_missing_let,
509    applicability = "maybe-incorrect",
510    style = "verbose"
511)]
512pub(crate) struct MaybeMissingLet {
513    #[suggestion_part(code = "let ")]
514    pub span: Span,
515}
516
517#[derive(Subdiagnostic, Clone, Copy)]
518#[multipart_suggestion(
519    parse_maybe_comparison,
520    applicability = "maybe-incorrect",
521    style = "verbose"
522)]
523pub(crate) struct MaybeComparison {
524    #[suggestion_part(code = "=")]
525    pub span: Span,
526}
527
528#[derive(Diagnostic)]
529#[diag(parse_expect_eq_instead_of_eqeq)]
530pub(crate) struct ExpectedEqForLetExpr {
531    #[primary_span]
532    pub span: Span,
533    #[suggestion(applicability = "maybe-incorrect", code = "=", style = "verbose")]
534    pub sugg_span: Span,
535}
536
537#[derive(Diagnostic)]
538#[diag(parse_expected_else_block)]
539pub(crate) struct ExpectedElseBlock {
540    #[primary_span]
541    pub first_tok_span: Span,
542    pub first_tok: String,
543    #[label]
544    pub else_span: Span,
545    #[suggestion(applicability = "maybe-incorrect", code = "if ", style = "verbose")]
546    pub condition_start: Span,
547}
548
549#[derive(Diagnostic)]
550#[diag(parse_expected_struct_field)]
551pub(crate) struct ExpectedStructField {
552    #[primary_span]
553    #[label]
554    pub span: Span,
555    pub token: Token,
556    #[label(parse_ident_label)]
557    pub ident_span: Span,
558}
559
560#[derive(Diagnostic)]
561#[diag(parse_outer_attribute_not_allowed_on_if_else)]
562pub(crate) struct OuterAttributeNotAllowedOnIfElse {
563    #[primary_span]
564    pub last: Span,
565
566    #[label(parse_branch_label)]
567    pub branch_span: Span,
568
569    #[label(parse_ctx_label)]
570    pub ctx_span: Span,
571    pub ctx: String,
572
573    #[suggestion(applicability = "machine-applicable", code = "", style = "verbose")]
574    pub attributes: Span,
575}
576
577#[derive(Diagnostic)]
578#[diag(parse_missing_in_in_for_loop)]
579pub(crate) struct MissingInInForLoop {
580    #[primary_span]
581    pub span: Span,
582    #[subdiagnostic]
583    pub sub: MissingInInForLoopSub,
584}
585
586#[derive(Subdiagnostic)]
587pub(crate) enum MissingInInForLoopSub {
588    // Has been misleading, at least in the past (closed Issue #48492), thus maybe-incorrect
589    #[suggestion(
590        parse_use_in_not_of,
591        style = "verbose",
592        applicability = "maybe-incorrect",
593        code = "in"
594    )]
595    InNotOf(#[primary_span] Span),
596    #[suggestion(parse_add_in, style = "verbose", applicability = "maybe-incorrect", code = " in ")]
597    AddIn(#[primary_span] Span),
598}
599
600#[derive(Diagnostic)]
601#[diag(parse_missing_expression_in_for_loop)]
602pub(crate) struct MissingExpressionInForLoop {
603    #[primary_span]
604    #[suggestion(
605        code = "/* expression */ ",
606        applicability = "has-placeholders",
607        style = "verbose"
608    )]
609    pub span: Span,
610}
611
612#[derive(Diagnostic)]
613#[diag(parse_loop_else)]
614#[note]
615pub(crate) struct LoopElseNotSupported {
616    #[primary_span]
617    pub span: Span,
618    pub loop_kind: &'static str,
619    #[label(parse_loop_keyword)]
620    pub loop_kw: Span,
621}
622
623#[derive(Diagnostic)]
624#[diag(parse_missing_comma_after_match_arm)]
625pub(crate) struct MissingCommaAfterMatchArm {
626    #[primary_span]
627    #[suggestion(applicability = "machine-applicable", code = ",", style = "verbose")]
628    pub span: Span,
629}
630
631#[derive(Diagnostic)]
632#[diag(parse_catch_after_try)]
633#[help]
634pub(crate) struct CatchAfterTry {
635    #[primary_span]
636    pub span: Span,
637}
638
639#[derive(Diagnostic)]
640#[diag(parse_comma_after_base_struct)]
641#[note]
642pub(crate) struct CommaAfterBaseStruct {
643    #[primary_span]
644    pub span: Span,
645    #[suggestion(style = "verbose", applicability = "machine-applicable", code = "")]
646    pub comma: Span,
647}
648
649#[derive(Diagnostic)]
650#[diag(parse_eq_field_init)]
651pub(crate) struct EqFieldInit {
652    #[primary_span]
653    pub span: Span,
654    #[suggestion(applicability = "machine-applicable", code = ":", style = "verbose")]
655    pub eq: Span,
656}
657
658#[derive(Diagnostic)]
659#[diag(parse_dotdotdot)]
660pub(crate) struct DotDotDot {
661    #[primary_span]
662    #[suggestion(
663        parse_suggest_exclusive_range,
664        applicability = "maybe-incorrect",
665        code = "..",
666        style = "verbose"
667    )]
668    #[suggestion(
669        parse_suggest_inclusive_range,
670        applicability = "maybe-incorrect",
671        code = "..=",
672        style = "verbose"
673    )]
674    pub span: Span,
675}
676
677#[derive(Diagnostic)]
678#[diag(parse_left_arrow_operator)]
679pub(crate) struct LeftArrowOperator {
680    #[primary_span]
681    #[suggestion(applicability = "maybe-incorrect", code = "< -", style = "verbose")]
682    pub span: Span,
683}
684
685#[derive(Diagnostic)]
686#[diag(parse_remove_let)]
687pub(crate) struct RemoveLet {
688    #[primary_span]
689    pub span: Span,
690    #[suggestion(applicability = "machine-applicable", code = "", style = "verbose")]
691    pub suggestion: Span,
692}
693
694#[derive(Diagnostic)]
695#[diag(parse_use_eq_instead)]
696pub(crate) struct UseEqInstead {
697    #[primary_span]
698    #[suggestion(style = "verbose", applicability = "machine-applicable", code = "=")]
699    pub span: Span,
700}
701
702#[derive(Diagnostic)]
703#[diag(parse_use_empty_block_not_semi)]
704pub(crate) struct UseEmptyBlockNotSemi {
705    #[primary_span]
706    #[suggestion(style = "hidden", applicability = "machine-applicable", code = "{{}}")]
707    pub span: Span,
708}
709
710#[derive(Diagnostic)]
711#[diag(parse_comparison_interpreted_as_generic)]
712pub(crate) struct ComparisonInterpretedAsGeneric {
713    #[primary_span]
714    #[label(parse_label_comparison)]
715    pub comparison: Span,
716    pub r#type: Path,
717    #[label(parse_label_args)]
718    pub args: Span,
719    #[subdiagnostic]
720    pub suggestion: ComparisonOrShiftInterpretedAsGenericSugg,
721}
722
723#[derive(Diagnostic)]
724#[diag(parse_shift_interpreted_as_generic)]
725pub(crate) struct ShiftInterpretedAsGeneric {
726    #[primary_span]
727    #[label(parse_label_comparison)]
728    pub shift: Span,
729    pub r#type: Path,
730    #[label(parse_label_args)]
731    pub args: Span,
732    #[subdiagnostic]
733    pub suggestion: ComparisonOrShiftInterpretedAsGenericSugg,
734}
735
736#[derive(Subdiagnostic)]
737#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
738pub(crate) struct ComparisonOrShiftInterpretedAsGenericSugg {
739    #[suggestion_part(code = "(")]
740    pub left: Span,
741    #[suggestion_part(code = ")")]
742    pub right: Span,
743}
744
745#[derive(Diagnostic)]
746#[diag(parse_found_expr_would_be_stmt)]
747pub(crate) struct FoundExprWouldBeStmt {
748    #[primary_span]
749    #[label]
750    pub span: Span,
751    pub token: Token,
752    #[subdiagnostic]
753    pub suggestion: ExprParenthesesNeeded,
754}
755
756#[derive(Diagnostic)]
757#[diag(parse_frontmatter_extra_characters_after_close)]
758pub(crate) struct FrontmatterExtraCharactersAfterClose {
759    #[primary_span]
760    pub span: Span,
761}
762
763#[derive(Diagnostic)]
764#[diag(parse_frontmatter_invalid_infostring)]
765#[note]
766pub(crate) struct FrontmatterInvalidInfostring {
767    #[primary_span]
768    pub span: Span,
769}
770
771#[derive(Diagnostic)]
772#[diag(parse_frontmatter_invalid_opening_preceding_whitespace)]
773pub(crate) struct FrontmatterInvalidOpeningPrecedingWhitespace {
774    #[primary_span]
775    pub span: Span,
776    #[note]
777    pub note_span: Span,
778}
779
780#[derive(Diagnostic)]
781#[diag(parse_frontmatter_unclosed)]
782pub(crate) struct FrontmatterUnclosed {
783    #[primary_span]
784    pub span: Span,
785    #[note]
786    pub note_span: Span,
787}
788
789#[derive(Diagnostic)]
790#[diag(parse_frontmatter_invalid_close_preceding_whitespace)]
791pub(crate) struct FrontmatterInvalidClosingPrecedingWhitespace {
792    #[primary_span]
793    pub span: Span,
794    #[note]
795    pub note_span: Span,
796}
797
798#[derive(Diagnostic)]
799#[diag(parse_frontmatter_length_mismatch)]
800pub(crate) struct FrontmatterLengthMismatch {
801    #[primary_span]
802    pub span: Span,
803    #[label(parse_label_opening)]
804    pub opening: Span,
805    #[label(parse_label_close)]
806    pub close: Span,
807    pub len_opening: usize,
808    pub len_close: usize,
809}
810
811#[derive(Diagnostic)]
812#[diag(parse_leading_plus_not_supported)]
813pub(crate) struct LeadingPlusNotSupported {
814    #[primary_span]
815    #[label]
816    pub span: Span,
817    #[suggestion(
818        parse_suggestion_remove_plus,
819        style = "verbose",
820        code = "",
821        applicability = "machine-applicable"
822    )]
823    pub remove_plus: Option<Span>,
824    #[subdiagnostic]
825    pub add_parentheses: Option<ExprParenthesesNeeded>,
826}
827
828#[derive(Diagnostic)]
829#[diag(parse_parentheses_with_struct_fields)]
830pub(crate) struct ParenthesesWithStructFields {
831    #[primary_span]
832    pub span: Span,
833    pub r#type: Path,
834    #[subdiagnostic]
835    pub braces_for_struct: BracesForStructLiteral,
836    #[subdiagnostic]
837    pub no_fields_for_fn: NoFieldsForFnCall,
838}
839
840#[derive(Subdiagnostic)]
841#[multipart_suggestion(parse_suggestion_braces_for_struct, applicability = "maybe-incorrect")]
842pub(crate) struct BracesForStructLiteral {
843    #[suggestion_part(code = " {{ ")]
844    pub first: Span,
845    #[suggestion_part(code = " }}")]
846    pub second: Span,
847}
848
849#[derive(Subdiagnostic)]
850#[multipart_suggestion(parse_suggestion_no_fields_for_fn, applicability = "maybe-incorrect")]
851pub(crate) struct NoFieldsForFnCall {
852    #[suggestion_part(code = "")]
853    pub fields: Vec<Span>,
854}
855
856#[derive(Diagnostic)]
857#[diag(parse_labeled_loop_in_break)]
858pub(crate) struct LabeledLoopInBreak {
859    #[primary_span]
860    pub span: Span,
861    #[subdiagnostic]
862    pub sub: WrapInParentheses,
863}
864
865#[derive(Subdiagnostic)]
866pub(crate) enum WrapInParentheses {
867    #[multipart_suggestion(
868        parse_sugg_wrap_expression_in_parentheses,
869        applicability = "machine-applicable"
870    )]
871    Expression {
872        #[suggestion_part(code = "(")]
873        left: Span,
874        #[suggestion_part(code = ")")]
875        right: Span,
876    },
877    #[multipart_suggestion(
878        parse_sugg_wrap_macro_in_parentheses,
879        applicability = "machine-applicable"
880    )]
881    MacroArgs {
882        #[suggestion_part(code = "(")]
883        left: Span,
884        #[suggestion_part(code = ")")]
885        right: Span,
886    },
887}
888
889#[derive(Diagnostic)]
890#[diag(parse_array_brackets_instead_of_braces)]
891pub(crate) struct ArrayBracketsInsteadOfBraces {
892    #[primary_span]
893    pub span: Span,
894    #[subdiagnostic]
895    pub sub: ArrayBracketsInsteadOfBracesSugg,
896}
897
898#[derive(Subdiagnostic)]
899#[multipart_suggestion(parse_suggestion, applicability = "maybe-incorrect")]
900pub(crate) struct ArrayBracketsInsteadOfBracesSugg {
901    #[suggestion_part(code = "[")]
902    pub left: Span,
903    #[suggestion_part(code = "]")]
904    pub right: Span,
905}
906
907#[derive(Diagnostic)]
908#[diag(parse_match_arm_body_without_braces)]
909pub(crate) struct MatchArmBodyWithoutBraces {
910    #[primary_span]
911    #[label(parse_label_statements)]
912    pub statements: Span,
913    #[label(parse_label_arrow)]
914    pub arrow: Span,
915    pub num_statements: usize,
916    #[subdiagnostic]
917    pub sub: MatchArmBodyWithoutBracesSugg,
918}
919
920#[derive(Diagnostic)]
921#[diag(parse_inclusive_range_extra_equals)]
922#[note]
923pub(crate) struct InclusiveRangeExtraEquals {
924    #[primary_span]
925    #[suggestion(
926        parse_suggestion_remove_eq,
927        style = "verbose",
928        code = "..=",
929        applicability = "maybe-incorrect"
930    )]
931    pub span: Span,
932}
933
934#[derive(Diagnostic)]
935#[diag(parse_inclusive_range_match_arrow)]
936pub(crate) struct InclusiveRangeMatchArrow {
937    #[primary_span]
938    pub arrow: Span,
939    #[label]
940    pub span: Span,
941    #[suggestion(style = "verbose", code = " ", applicability = "machine-applicable")]
942    pub after_pat: Span,
943}
944
945#[derive(Diagnostic)]
946#[diag(parse_inclusive_range_no_end, code = E0586)]
947#[note]
948pub(crate) struct InclusiveRangeNoEnd {
949    #[primary_span]
950    pub span: Span,
951    #[suggestion(
952        parse_suggestion_open_range,
953        code = "",
954        applicability = "machine-applicable",
955        style = "verbose"
956    )]
957    pub suggestion: Span,
958}
959
960#[derive(Subdiagnostic)]
961pub(crate) enum MatchArmBodyWithoutBracesSugg {
962    #[multipart_suggestion(parse_suggestion_add_braces, applicability = "machine-applicable")]
963    AddBraces {
964        #[suggestion_part(code = "{{ ")]
965        left: Span,
966        #[suggestion_part(code = " }}")]
967        right: Span,
968    },
969    #[suggestion(
970        parse_suggestion_use_comma_not_semicolon,
971        code = ",",
972        applicability = "machine-applicable",
973        style = "verbose"
974    )]
975    UseComma {
976        #[primary_span]
977        semicolon: Span,
978    },
979}
980
981#[derive(Diagnostic)]
982#[diag(parse_struct_literal_not_allowed_here)]
983pub(crate) struct StructLiteralNotAllowedHere {
984    #[primary_span]
985    pub span: Span,
986    #[subdiagnostic]
987    pub sub: StructLiteralNotAllowedHereSugg,
988}
989
990#[derive(Subdiagnostic)]
991#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
992pub(crate) struct StructLiteralNotAllowedHereSugg {
993    #[suggestion_part(code = "(")]
994    pub left: Span,
995    #[suggestion_part(code = ")")]
996    pub right: Span,
997}
998
999#[derive(Diagnostic)]
1000#[diag(parse_invalid_literal_suffix_on_tuple_index)]
1001pub(crate) struct InvalidLiteralSuffixOnTupleIndex {
1002    #[primary_span]
1003    #[label]
1004    pub span: Span,
1005    pub suffix: Symbol,
1006    #[help(parse_tuple_exception_line_1)]
1007    #[help(parse_tuple_exception_line_2)]
1008    #[help(parse_tuple_exception_line_3)]
1009    pub exception: bool,
1010}
1011
1012#[derive(Diagnostic)]
1013#[diag(parse_non_string_abi_literal)]
1014pub(crate) struct NonStringAbiLiteral {
1015    #[primary_span]
1016    #[suggestion(code = "\"C\"", applicability = "maybe-incorrect", style = "verbose")]
1017    pub span: Span,
1018}
1019
1020#[derive(Diagnostic)]
1021#[diag(parse_mismatched_closing_delimiter)]
1022pub(crate) struct MismatchedClosingDelimiter {
1023    #[primary_span]
1024    pub spans: Vec<Span>,
1025    pub delimiter: String,
1026    #[label(parse_label_unmatched)]
1027    pub unmatched: Span,
1028    #[label(parse_label_opening_candidate)]
1029    pub opening_candidate: Option<Span>,
1030    #[label(parse_label_unclosed)]
1031    pub unclosed: Option<Span>,
1032}
1033
1034#[derive(Diagnostic)]
1035#[diag(parse_incorrect_visibility_restriction, code = E0704)]
1036#[help]
1037pub(crate) struct IncorrectVisibilityRestriction {
1038    #[primary_span]
1039    #[suggestion(code = "in {inner_str}", applicability = "machine-applicable", style = "verbose")]
1040    pub span: Span,
1041    pub inner_str: String,
1042}
1043
1044#[derive(Diagnostic)]
1045#[diag(parse_assignment_else_not_allowed)]
1046pub(crate) struct AssignmentElseNotAllowed {
1047    #[primary_span]
1048    pub span: Span,
1049}
1050
1051#[derive(Diagnostic)]
1052#[diag(parse_expected_statement_after_outer_attr)]
1053pub(crate) struct ExpectedStatementAfterOuterAttr {
1054    #[primary_span]
1055    pub span: Span,
1056}
1057
1058#[derive(Diagnostic)]
1059#[diag(parse_doc_comment_does_not_document_anything, code = E0585)]
1060#[help]
1061pub(crate) struct DocCommentDoesNotDocumentAnything {
1062    #[primary_span]
1063    pub span: Span,
1064    #[suggestion(code = ",", applicability = "machine-applicable", style = "verbose")]
1065    pub missing_comma: Option<Span>,
1066}
1067
1068#[derive(Diagnostic)]
1069#[diag(parse_const_let_mutually_exclusive)]
1070pub(crate) struct ConstLetMutuallyExclusive {
1071    #[primary_span]
1072    #[suggestion(code = "const", applicability = "maybe-incorrect", style = "verbose")]
1073    pub span: Span,
1074}
1075
1076#[derive(Diagnostic)]
1077#[diag(parse_invalid_expression_in_let_else)]
1078pub(crate) struct InvalidExpressionInLetElse {
1079    #[primary_span]
1080    pub span: Span,
1081    pub operator: &'static str,
1082    #[subdiagnostic]
1083    pub sugg: WrapInParentheses,
1084}
1085
1086#[derive(Diagnostic)]
1087#[diag(parse_invalid_curly_in_let_else)]
1088pub(crate) struct InvalidCurlyInLetElse {
1089    #[primary_span]
1090    pub span: Span,
1091    #[subdiagnostic]
1092    pub sugg: WrapInParentheses,
1093}
1094
1095#[derive(Diagnostic)]
1096#[diag(parse_compound_assignment_expression_in_let)]
1097#[help]
1098pub(crate) struct CompoundAssignmentExpressionInLet {
1099    #[primary_span]
1100    pub span: Span,
1101    #[suggestion(style = "verbose", code = "", applicability = "maybe-incorrect")]
1102    pub suggestion: Span,
1103}
1104
1105#[derive(Diagnostic)]
1106#[diag(parse_suffixed_literal_in_attribute)]
1107#[help]
1108pub(crate) struct SuffixedLiteralInAttribute {
1109    #[primary_span]
1110    pub span: Span,
1111}
1112
1113#[derive(Diagnostic)]
1114#[diag(parse_invalid_meta_item)]
1115pub(crate) struct InvalidMetaItem {
1116    #[primary_span]
1117    pub span: Span,
1118    pub descr: String,
1119    #[subdiagnostic]
1120    pub quote_ident_sugg: Option<InvalidMetaItemQuoteIdentSugg>,
1121}
1122
1123#[derive(Subdiagnostic)]
1124#[multipart_suggestion(parse_quote_ident_sugg, applicability = "machine-applicable")]
1125pub(crate) struct InvalidMetaItemQuoteIdentSugg {
1126    #[suggestion_part(code = "\"")]
1127    pub before: Span,
1128    #[suggestion_part(code = "\"")]
1129    pub after: Span,
1130}
1131
1132#[derive(Subdiagnostic)]
1133#[suggestion(
1134    parse_sugg_escape_identifier,
1135    style = "verbose",
1136    applicability = "maybe-incorrect",
1137    code = "r#"
1138)]
1139pub(crate) struct SuggEscapeIdentifier {
1140    #[primary_span]
1141    pub span: Span,
1142    pub ident_name: String,
1143}
1144
1145#[derive(Subdiagnostic)]
1146#[suggestion(
1147    parse_sugg_remove_comma,
1148    applicability = "machine-applicable",
1149    code = "",
1150    style = "verbose"
1151)]
1152pub(crate) struct SuggRemoveComma {
1153    #[primary_span]
1154    pub span: Span,
1155}
1156
1157#[derive(Subdiagnostic)]
1158#[suggestion(
1159    parse_sugg_add_let_for_stmt,
1160    style = "verbose",
1161    applicability = "maybe-incorrect",
1162    code = "let "
1163)]
1164pub(crate) struct SuggAddMissingLetStmt {
1165    #[primary_span]
1166    pub span: Span,
1167}
1168
1169#[derive(Subdiagnostic)]
1170pub(crate) enum ExpectedIdentifierFound {
1171    #[label(parse_expected_identifier_found_reserved_identifier)]
1172    ReservedIdentifier(#[primary_span] Span),
1173    #[label(parse_expected_identifier_found_keyword)]
1174    Keyword(#[primary_span] Span),
1175    #[label(parse_expected_identifier_found_reserved_keyword)]
1176    ReservedKeyword(#[primary_span] Span),
1177    #[label(parse_expected_identifier_found_doc_comment)]
1178    DocComment(#[primary_span] Span),
1179    #[label(parse_expected_identifier_found_metavar)]
1180    MetaVar(#[primary_span] Span),
1181    #[label(parse_expected_identifier)]
1182    Other(#[primary_span] Span),
1183}
1184
1185impl ExpectedIdentifierFound {
1186    pub(crate) fn new(token_descr: Option<TokenDescription>, span: Span) -> Self {
1187        (match token_descr {
1188            Some(TokenDescription::ReservedIdentifier) => {
1189                ExpectedIdentifierFound::ReservedIdentifier
1190            }
1191            Some(TokenDescription::Keyword) => ExpectedIdentifierFound::Keyword,
1192            Some(TokenDescription::ReservedKeyword) => ExpectedIdentifierFound::ReservedKeyword,
1193            Some(TokenDescription::DocComment) => ExpectedIdentifierFound::DocComment,
1194            Some(TokenDescription::MetaVar(_)) => ExpectedIdentifierFound::MetaVar,
1195            None => ExpectedIdentifierFound::Other,
1196        })(span)
1197    }
1198}
1199
1200pub(crate) struct ExpectedIdentifier {
1201    pub span: Span,
1202    pub token: Token,
1203    pub suggest_raw: Option<SuggEscapeIdentifier>,
1204    pub suggest_remove_comma: Option<SuggRemoveComma>,
1205    pub help_cannot_start_number: Option<HelpIdentifierStartsWithNumber>,
1206}
1207
1208impl<'a, G: EmissionGuarantee> Diagnostic<'a, G> for ExpectedIdentifier {
1209    #[track_caller]
1210    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, G> {
1211        let token_descr = TokenDescription::from_token(&self.token);
1212
1213        let mut add_token = true;
1214        let mut diag = Diag::new(
1215            dcx,
1216            level,
1217            match token_descr {
1218                Some(TokenDescription::ReservedIdentifier) => {
1219                    fluent::parse_expected_identifier_found_reserved_identifier_str
1220                }
1221                Some(TokenDescription::Keyword) => {
1222                    fluent::parse_expected_identifier_found_keyword_str
1223                }
1224                Some(TokenDescription::ReservedKeyword) => {
1225                    fluent::parse_expected_identifier_found_reserved_keyword_str
1226                }
1227                Some(TokenDescription::DocComment) => {
1228                    fluent::parse_expected_identifier_found_doc_comment_str
1229                }
1230                Some(TokenDescription::MetaVar(_)) => {
1231                    add_token = false;
1232                    fluent::parse_expected_identifier_found_metavar_str
1233                }
1234                None => fluent::parse_expected_identifier_found_str,
1235            },
1236        );
1237        diag.span(self.span);
1238        if add_token {
1239            diag.arg("token", self.token);
1240        }
1241
1242        if let Some(sugg) = self.suggest_raw {
1243            sugg.add_to_diag(&mut diag);
1244        }
1245
1246        ExpectedIdentifierFound::new(token_descr, self.span).add_to_diag(&mut diag);
1247
1248        if let Some(sugg) = self.suggest_remove_comma {
1249            sugg.add_to_diag(&mut diag);
1250        }
1251
1252        if let Some(help) = self.help_cannot_start_number {
1253            help.add_to_diag(&mut diag);
1254        }
1255
1256        diag
1257    }
1258}
1259
1260#[derive(Subdiagnostic)]
1261#[help(parse_invalid_identifier_with_leading_number)]
1262pub(crate) struct HelpIdentifierStartsWithNumber {
1263    #[primary_span]
1264    pub num_span: Span,
1265}
1266
1267pub(crate) struct ExpectedSemi {
1268    pub span: Span,
1269    pub token: Token,
1270
1271    pub unexpected_token_label: Option<Span>,
1272    pub sugg: ExpectedSemiSugg,
1273}
1274
1275impl<'a, G: EmissionGuarantee> Diagnostic<'a, G> for ExpectedSemi {
1276    #[track_caller]
1277    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, G> {
1278        let token_descr = TokenDescription::from_token(&self.token);
1279
1280        let mut add_token = true;
1281        let mut diag = Diag::new(
1282            dcx,
1283            level,
1284            match token_descr {
1285                Some(TokenDescription::ReservedIdentifier) => {
1286                    fluent::parse_expected_semi_found_reserved_identifier_str
1287                }
1288                Some(TokenDescription::Keyword) => fluent::parse_expected_semi_found_keyword_str,
1289                Some(TokenDescription::ReservedKeyword) => {
1290                    fluent::parse_expected_semi_found_reserved_keyword_str
1291                }
1292                Some(TokenDescription::DocComment) => {
1293                    fluent::parse_expected_semi_found_doc_comment_str
1294                }
1295                Some(TokenDescription::MetaVar(_)) => {
1296                    add_token = false;
1297                    fluent::parse_expected_semi_found_metavar_str
1298                }
1299                None => fluent::parse_expected_semi_found_str,
1300            },
1301        );
1302        diag.span(self.span);
1303        if add_token {
1304            diag.arg("token", self.token);
1305        }
1306
1307        if let Some(unexpected_token_label) = self.unexpected_token_label {
1308            diag.span_label(unexpected_token_label, fluent::parse_label_unexpected_token);
1309        }
1310
1311        self.sugg.add_to_diag(&mut diag);
1312
1313        diag
1314    }
1315}
1316
1317#[derive(Subdiagnostic)]
1318pub(crate) enum ExpectedSemiSugg {
1319    #[suggestion(
1320        parse_sugg_change_this_to_semi,
1321        code = ";",
1322        applicability = "machine-applicable",
1323        style = "short"
1324    )]
1325    ChangeToSemi(#[primary_span] Span),
1326    #[suggestion(
1327        parse_sugg_add_semi,
1328        code = ";",
1329        applicability = "machine-applicable",
1330        style = "short"
1331    )]
1332    AddSemi(#[primary_span] Span),
1333}
1334
1335#[derive(Diagnostic)]
1336#[diag(parse_struct_literal_body_without_path)]
1337pub(crate) struct StructLiteralBodyWithoutPath {
1338    #[primary_span]
1339    pub span: Span,
1340    #[subdiagnostic]
1341    pub sugg: StructLiteralBodyWithoutPathSugg,
1342}
1343
1344#[derive(Subdiagnostic)]
1345#[multipart_suggestion(parse_suggestion, applicability = "has-placeholders")]
1346pub(crate) struct StructLiteralBodyWithoutPathSugg {
1347    #[suggestion_part(code = "{{ SomeStruct ")]
1348    pub before: Span,
1349    #[suggestion_part(code = " }}")]
1350    pub after: Span,
1351}
1352
1353#[derive(Diagnostic)]
1354#[diag(parse_unmatched_angle_brackets)]
1355pub(crate) struct UnmatchedAngleBrackets {
1356    #[primary_span]
1357    #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
1358    pub span: Span,
1359    pub num_extra_brackets: usize,
1360}
1361
1362#[derive(Diagnostic)]
1363#[diag(parse_generic_parameters_without_angle_brackets)]
1364pub(crate) struct GenericParamsWithoutAngleBrackets {
1365    #[primary_span]
1366    pub span: Span,
1367    #[subdiagnostic]
1368    pub sugg: GenericParamsWithoutAngleBracketsSugg,
1369}
1370
1371#[derive(Subdiagnostic)]
1372#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1373pub(crate) struct GenericParamsWithoutAngleBracketsSugg {
1374    #[suggestion_part(code = "<")]
1375    pub left: Span,
1376    #[suggestion_part(code = ">")]
1377    pub right: Span,
1378}
1379
1380#[derive(Diagnostic)]
1381#[diag(parse_comparison_operators_cannot_be_chained)]
1382pub(crate) struct ComparisonOperatorsCannotBeChained {
1383    #[primary_span]
1384    pub span: Vec<Span>,
1385    #[suggestion(
1386        parse_sugg_turbofish_syntax,
1387        style = "verbose",
1388        code = "::",
1389        applicability = "maybe-incorrect"
1390    )]
1391    pub suggest_turbofish: Option<Span>,
1392    #[help(parse_sugg_turbofish_syntax)]
1393    #[help(parse_sugg_parentheses_for_function_args)]
1394    pub help_turbofish: bool,
1395    #[subdiagnostic]
1396    pub chaining_sugg: Option<ComparisonOperatorsCannotBeChainedSugg>,
1397}
1398
1399#[derive(Subdiagnostic)]
1400pub(crate) enum ComparisonOperatorsCannotBeChainedSugg {
1401    #[suggestion(
1402        parse_sugg_split_comparison,
1403        style = "verbose",
1404        code = " && {middle_term}",
1405        applicability = "maybe-incorrect"
1406    )]
1407    SplitComparison {
1408        #[primary_span]
1409        span: Span,
1410        middle_term: String,
1411    },
1412    #[multipart_suggestion(parse_sugg_parenthesize, applicability = "maybe-incorrect")]
1413    Parenthesize {
1414        #[suggestion_part(code = "(")]
1415        left: Span,
1416        #[suggestion_part(code = ")")]
1417        right: Span,
1418    },
1419}
1420
1421#[derive(Diagnostic)]
1422#[diag(parse_question_mark_in_type)]
1423pub(crate) struct QuestionMarkInType {
1424    #[primary_span]
1425    #[label]
1426    pub span: Span,
1427    #[subdiagnostic]
1428    pub sugg: QuestionMarkInTypeSugg,
1429}
1430
1431#[derive(Subdiagnostic)]
1432#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1433pub(crate) struct QuestionMarkInTypeSugg {
1434    #[suggestion_part(code = "Option<")]
1435    pub left: Span,
1436    #[suggestion_part(code = ">")]
1437    pub right: Span,
1438}
1439
1440#[derive(Diagnostic)]
1441#[diag(parse_unexpected_parentheses_in_for_head)]
1442pub(crate) struct ParenthesesInForHead {
1443    #[primary_span]
1444    pub span: Vec<Span>,
1445    #[subdiagnostic]
1446    pub sugg: ParenthesesInForHeadSugg,
1447}
1448
1449#[derive(Subdiagnostic)]
1450#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1451pub(crate) struct ParenthesesInForHeadSugg {
1452    #[suggestion_part(code = " ")]
1453    pub left: Span,
1454    #[suggestion_part(code = " ")]
1455    pub right: Span,
1456}
1457
1458#[derive(Diagnostic)]
1459#[diag(parse_unexpected_parentheses_in_match_arm_pattern)]
1460pub(crate) struct ParenthesesInMatchPat {
1461    #[primary_span]
1462    pub span: Vec<Span>,
1463    #[subdiagnostic]
1464    pub sugg: ParenthesesInMatchPatSugg,
1465}
1466
1467#[derive(Subdiagnostic)]
1468#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1469pub(crate) struct ParenthesesInMatchPatSugg {
1470    #[suggestion_part(code = "")]
1471    pub left: Span,
1472    #[suggestion_part(code = "")]
1473    pub right: Span,
1474}
1475
1476#[derive(Diagnostic)]
1477#[diag(parse_doc_comment_on_param_type)]
1478pub(crate) struct DocCommentOnParamType {
1479    #[primary_span]
1480    #[label]
1481    pub span: Span,
1482}
1483
1484#[derive(Diagnostic)]
1485#[diag(parse_attribute_on_param_type)]
1486pub(crate) struct AttributeOnParamType {
1487    #[primary_span]
1488    #[label]
1489    pub span: Span,
1490}
1491
1492#[derive(Diagnostic)]
1493#[diag(parse_pattern_method_param_without_body, code = E0642)]
1494pub(crate) struct PatternMethodParamWithoutBody {
1495    #[primary_span]
1496    #[suggestion(code = "_", applicability = "machine-applicable", style = "verbose")]
1497    pub span: Span,
1498}
1499
1500#[derive(Diagnostic)]
1501#[diag(parse_self_param_not_first)]
1502pub(crate) struct SelfParamNotFirst {
1503    #[primary_span]
1504    #[label]
1505    pub span: Span,
1506}
1507
1508#[derive(Diagnostic)]
1509#[diag(parse_const_generic_without_braces)]
1510pub(crate) struct ConstGenericWithoutBraces {
1511    #[primary_span]
1512    pub span: Span,
1513    #[subdiagnostic]
1514    pub sugg: ConstGenericWithoutBracesSugg,
1515}
1516
1517#[derive(Subdiagnostic)]
1518#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1519pub(crate) struct ConstGenericWithoutBracesSugg {
1520    #[suggestion_part(code = "{{ ")]
1521    pub left: Span,
1522    #[suggestion_part(code = " }}")]
1523    pub right: Span,
1524}
1525
1526#[derive(Diagnostic)]
1527#[diag(parse_unexpected_const_param_declaration)]
1528pub(crate) struct UnexpectedConstParamDeclaration {
1529    #[primary_span]
1530    #[label]
1531    pub span: Span,
1532    #[subdiagnostic]
1533    pub sugg: Option<UnexpectedConstParamDeclarationSugg>,
1534}
1535
1536#[derive(Subdiagnostic)]
1537pub(crate) enum UnexpectedConstParamDeclarationSugg {
1538    #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1539    AddParam {
1540        #[suggestion_part(code = "<{snippet}>")]
1541        impl_generics: Span,
1542        #[suggestion_part(code = "{ident}")]
1543        incorrect_decl: Span,
1544        snippet: String,
1545        ident: String,
1546    },
1547    #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1548    AppendParam {
1549        #[suggestion_part(code = ", {snippet}")]
1550        impl_generics_end: Span,
1551        #[suggestion_part(code = "{ident}")]
1552        incorrect_decl: Span,
1553        snippet: String,
1554        ident: String,
1555    },
1556}
1557
1558#[derive(Diagnostic)]
1559#[diag(parse_unexpected_const_in_generic_param)]
1560pub(crate) struct UnexpectedConstInGenericParam {
1561    #[primary_span]
1562    pub span: Span,
1563    #[suggestion(style = "verbose", code = "", applicability = "maybe-incorrect")]
1564    pub to_remove: Option<Span>,
1565}
1566
1567#[derive(Diagnostic)]
1568#[diag(parse_async_move_order_incorrect)]
1569pub(crate) struct AsyncMoveOrderIncorrect {
1570    #[primary_span]
1571    #[suggestion(style = "verbose", code = "async move", applicability = "maybe-incorrect")]
1572    pub span: Span,
1573}
1574
1575#[derive(Diagnostic)]
1576#[diag(parse_async_use_order_incorrect)]
1577pub(crate) struct AsyncUseOrderIncorrect {
1578    #[primary_span]
1579    #[suggestion(style = "verbose", code = "async use", applicability = "maybe-incorrect")]
1580    pub span: Span,
1581}
1582
1583#[derive(Diagnostic)]
1584#[diag(parse_double_colon_in_bound)]
1585pub(crate) struct DoubleColonInBound {
1586    #[primary_span]
1587    pub span: Span,
1588    #[suggestion(code = ": ", applicability = "machine-applicable", style = "verbose")]
1589    pub between: Span,
1590}
1591
1592#[derive(Diagnostic)]
1593#[diag(parse_fn_ptr_with_generics)]
1594pub(crate) struct FnPtrWithGenerics {
1595    #[primary_span]
1596    pub span: Span,
1597    #[subdiagnostic]
1598    pub sugg: Option<FnPtrWithGenericsSugg>,
1599}
1600
1601#[derive(Subdiagnostic)]
1602#[multipart_suggestion(
1603    parse_misplaced_return_type,
1604    style = "verbose",
1605    applicability = "maybe-incorrect"
1606)]
1607pub(crate) struct MisplacedReturnType {
1608    #[suggestion_part(code = " {snippet}")]
1609    pub fn_params_end: Span,
1610    pub snippet: String,
1611    #[suggestion_part(code = "")]
1612    pub ret_ty_span: Span,
1613}
1614
1615#[derive(Subdiagnostic)]
1616#[multipart_suggestion(parse_suggestion, applicability = "maybe-incorrect")]
1617pub(crate) struct FnPtrWithGenericsSugg {
1618    #[suggestion_part(code = "{snippet}")]
1619    pub left: Span,
1620    pub snippet: String,
1621    #[suggestion_part(code = "")]
1622    pub right: Span,
1623    pub arity: usize,
1624    pub for_param_list_exists: bool,
1625}
1626
1627pub(crate) struct FnTraitMissingParen {
1628    pub span: Span,
1629}
1630
1631impl Subdiagnostic for FnTraitMissingParen {
1632    fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) {
1633        diag.span_label(self.span, crate::fluent_generated::parse_fn_trait_missing_paren);
1634        diag.span_suggestion_short(
1635            self.span.shrink_to_hi(),
1636            crate::fluent_generated::parse_add_paren,
1637            "()",
1638            Applicability::MachineApplicable,
1639        );
1640    }
1641}
1642
1643#[derive(Diagnostic)]
1644#[diag(parse_unexpected_if_with_if)]
1645pub(crate) struct UnexpectedIfWithIf(
1646    #[primary_span]
1647    #[suggestion(applicability = "machine-applicable", code = " ", style = "verbose")]
1648    pub Span,
1649);
1650
1651#[derive(Diagnostic)]
1652#[diag(parse_maybe_fn_typo_with_impl)]
1653pub(crate) struct FnTypoWithImpl {
1654    #[primary_span]
1655    #[suggestion(applicability = "maybe-incorrect", code = "impl", style = "verbose")]
1656    pub fn_span: Span,
1657}
1658
1659#[derive(Diagnostic)]
1660#[diag(parse_expected_fn_path_found_fn_keyword)]
1661pub(crate) struct ExpectedFnPathFoundFnKeyword {
1662    #[primary_span]
1663    #[suggestion(applicability = "machine-applicable", code = "Fn", style = "verbose")]
1664    pub fn_token_span: Span,
1665}
1666
1667#[derive(Diagnostic)]
1668#[diag(parse_path_found_named_params)]
1669pub(crate) struct FnPathFoundNamedParams {
1670    #[primary_span]
1671    #[suggestion(applicability = "machine-applicable", code = "")]
1672    pub named_param_span: Span,
1673}
1674
1675#[derive(Diagnostic)]
1676#[diag(parse_path_found_c_variadic_params)]
1677pub(crate) struct PathFoundCVariadicParams {
1678    #[primary_span]
1679    #[suggestion(applicability = "machine-applicable", code = "")]
1680    pub span: Span,
1681}
1682
1683#[derive(Diagnostic)]
1684#[diag(parse_path_found_attribute_in_params)]
1685pub(crate) struct PathFoundAttributeInParams {
1686    #[primary_span]
1687    #[suggestion(applicability = "machine-applicable", code = "")]
1688    pub span: Span,
1689}
1690
1691#[derive(Diagnostic)]
1692#[diag(parse_path_double_colon)]
1693pub(crate) struct PathSingleColon {
1694    #[primary_span]
1695    pub span: Span,
1696
1697    #[suggestion(applicability = "machine-applicable", code = ":", style = "verbose")]
1698    pub suggestion: Span,
1699}
1700
1701#[derive(Diagnostic)]
1702#[diag(parse_path_double_colon)]
1703pub(crate) struct PathTripleColon {
1704    #[primary_span]
1705    #[suggestion(applicability = "maybe-incorrect", code = "", style = "verbose")]
1706    pub span: Span,
1707}
1708
1709#[derive(Diagnostic)]
1710#[diag(parse_colon_as_semi)]
1711pub(crate) struct ColonAsSemi {
1712    #[primary_span]
1713    #[suggestion(applicability = "machine-applicable", code = ";", style = "verbose")]
1714    pub span: Span,
1715}
1716
1717#[derive(Diagnostic)]
1718#[diag(parse_where_clause_before_tuple_struct_body)]
1719pub(crate) struct WhereClauseBeforeTupleStructBody {
1720    #[primary_span]
1721    #[label]
1722    pub span: Span,
1723    #[label(parse_name_label)]
1724    pub name: Span,
1725    #[label(parse_body_label)]
1726    pub body: Span,
1727    #[subdiagnostic]
1728    pub sugg: Option<WhereClauseBeforeTupleStructBodySugg>,
1729}
1730
1731#[derive(Subdiagnostic)]
1732#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1733pub(crate) struct WhereClauseBeforeTupleStructBodySugg {
1734    #[suggestion_part(code = "{snippet}")]
1735    pub left: Span,
1736    pub snippet: String,
1737    #[suggestion_part(code = "")]
1738    pub right: Span,
1739}
1740
1741#[derive(Diagnostic)]
1742#[diag(parse_async_fn_in_2015, code = E0670)]
1743pub(crate) struct AsyncFnIn2015 {
1744    #[primary_span]
1745    #[label]
1746    pub span: Span,
1747    #[subdiagnostic]
1748    pub help: HelpUseLatestEdition,
1749}
1750
1751#[derive(Subdiagnostic)]
1752#[label(parse_async_block_in_2015)]
1753pub(crate) struct AsyncBlockIn2015 {
1754    #[primary_span]
1755    pub span: Span,
1756}
1757
1758#[derive(Diagnostic)]
1759#[diag(parse_async_move_block_in_2015)]
1760pub(crate) struct AsyncMoveBlockIn2015 {
1761    #[primary_span]
1762    pub span: Span,
1763}
1764
1765#[derive(Diagnostic)]
1766#[diag(parse_async_use_block_in_2015)]
1767pub(crate) struct AsyncUseBlockIn2015 {
1768    #[primary_span]
1769    pub span: Span,
1770}
1771
1772#[derive(Diagnostic)]
1773#[diag(parse_async_bound_modifier_in_2015)]
1774pub(crate) struct AsyncBoundModifierIn2015 {
1775    #[primary_span]
1776    pub span: Span,
1777    #[subdiagnostic]
1778    pub help: HelpUseLatestEdition,
1779}
1780
1781#[derive(Diagnostic)]
1782#[diag(parse_let_chain_pre_2024)]
1783pub(crate) struct LetChainPre2024 {
1784    #[primary_span]
1785    pub span: Span,
1786}
1787
1788#[derive(Diagnostic)]
1789#[diag(parse_self_argument_pointer)]
1790pub(crate) struct SelfArgumentPointer {
1791    #[primary_span]
1792    #[label]
1793    pub span: Span,
1794}
1795
1796#[derive(Diagnostic)]
1797#[diag(parse_unexpected_token_after_dot)]
1798pub(crate) struct UnexpectedTokenAfterDot {
1799    #[primary_span]
1800    pub span: Span,
1801    pub actual: String,
1802}
1803
1804#[derive(Diagnostic)]
1805#[diag(parse_visibility_not_followed_by_item)]
1806#[help]
1807pub(crate) struct VisibilityNotFollowedByItem {
1808    #[primary_span]
1809    #[label]
1810    pub span: Span,
1811    pub vis: Visibility,
1812}
1813
1814#[derive(Diagnostic)]
1815#[diag(parse_default_not_followed_by_item)]
1816#[note]
1817pub(crate) struct DefaultNotFollowedByItem {
1818    #[primary_span]
1819    #[label]
1820    pub span: Span,
1821}
1822
1823#[derive(Diagnostic)]
1824pub(crate) enum MissingKeywordForItemDefinition {
1825    #[diag(parse_missing_enum_for_enum_definition)]
1826    Enum {
1827        #[primary_span]
1828        span: Span,
1829        #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = "enum ")]
1830        insert_span: Span,
1831        ident: Ident,
1832    },
1833    #[diag(parse_missing_enum_or_struct_for_item_definition)]
1834    EnumOrStruct {
1835        #[primary_span]
1836        span: Span,
1837    },
1838    #[diag(parse_missing_struct_for_struct_definition)]
1839    Struct {
1840        #[primary_span]
1841        span: Span,
1842        #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = "struct ")]
1843        insert_span: Span,
1844        ident: Ident,
1845    },
1846    #[diag(parse_missing_fn_for_function_definition)]
1847    Function {
1848        #[primary_span]
1849        span: Span,
1850        #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = "fn ")]
1851        insert_span: Span,
1852        ident: Ident,
1853    },
1854    #[diag(parse_missing_fn_for_method_definition)]
1855    Method {
1856        #[primary_span]
1857        span: Span,
1858        #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = "fn ")]
1859        insert_span: Span,
1860        ident: Ident,
1861    },
1862    #[diag(parse_missing_fn_or_struct_for_item_definition)]
1863    Ambiguous {
1864        #[primary_span]
1865        span: Span,
1866        #[subdiagnostic]
1867        subdiag: Option<AmbiguousMissingKwForItemSub>,
1868    },
1869}
1870
1871#[derive(Subdiagnostic)]
1872pub(crate) enum AmbiguousMissingKwForItemSub {
1873    #[suggestion(
1874        parse_suggestion,
1875        applicability = "maybe-incorrect",
1876        code = "{snippet}!",
1877        style = "verbose"
1878    )]
1879    SuggestMacro {
1880        #[primary_span]
1881        span: Span,
1882        snippet: String,
1883    },
1884    #[help(parse_help)]
1885    HelpMacro,
1886}
1887
1888#[derive(Diagnostic)]
1889#[diag(parse_missing_fn_params)]
1890pub(crate) struct MissingFnParams {
1891    #[primary_span]
1892    #[suggestion(code = "()", applicability = "machine-applicable", style = "verbose")]
1893    pub span: Span,
1894}
1895
1896#[derive(Diagnostic)]
1897#[diag(parse_invalid_path_sep_in_fn_definition)]
1898pub(crate) struct InvalidPathSepInFnDefinition {
1899    #[primary_span]
1900    #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
1901    pub span: Span,
1902}
1903
1904#[derive(Diagnostic)]
1905#[diag(parse_missing_trait_in_trait_impl)]
1906pub(crate) struct MissingTraitInTraitImpl {
1907    #[primary_span]
1908    #[suggestion(
1909        parse_suggestion_add_trait,
1910        code = " Trait ",
1911        applicability = "has-placeholders",
1912        style = "verbose"
1913    )]
1914    pub span: Span,
1915    #[suggestion(
1916        parse_suggestion_remove_for,
1917        code = "",
1918        applicability = "maybe-incorrect",
1919        style = "verbose"
1920    )]
1921    pub for_span: Span,
1922}
1923
1924#[derive(Diagnostic)]
1925#[diag(parse_missing_for_in_trait_impl)]
1926pub(crate) struct MissingForInTraitImpl {
1927    #[primary_span]
1928    #[suggestion(style = "verbose", code = " for ", applicability = "machine-applicable")]
1929    pub span: Span,
1930}
1931
1932#[derive(Diagnostic)]
1933#[diag(parse_expected_trait_in_trait_impl_found_type)]
1934pub(crate) struct ExpectedTraitInTraitImplFoundType {
1935    #[primary_span]
1936    pub span: Span,
1937}
1938
1939#[derive(Diagnostic)]
1940#[diag(parse_extra_impl_keyword_in_trait_impl)]
1941pub(crate) struct ExtraImplKeywordInTraitImpl {
1942    #[primary_span]
1943    #[suggestion(code = "", applicability = "maybe-incorrect", style = "short")]
1944    pub extra_impl_kw: Span,
1945    #[note]
1946    pub impl_trait_span: Span,
1947}
1948
1949#[derive(Diagnostic)]
1950#[diag(parse_bounds_not_allowed_on_trait_aliases)]
1951pub(crate) struct BoundsNotAllowedOnTraitAliases {
1952    #[primary_span]
1953    pub span: Span,
1954}
1955
1956#[derive(Diagnostic)]
1957#[diag(parse_trait_alias_cannot_be_auto)]
1958pub(crate) struct TraitAliasCannotBeAuto {
1959    #[primary_span]
1960    #[label(parse_trait_alias_cannot_be_auto)]
1961    pub span: Span,
1962}
1963
1964#[derive(Diagnostic)]
1965#[diag(parse_trait_alias_cannot_be_const)]
1966pub(crate) struct TraitAliasCannotBeConst {
1967    #[primary_span]
1968    #[label(parse_trait_alias_cannot_be_const)]
1969    pub span: Span,
1970}
1971
1972#[derive(Diagnostic)]
1973#[diag(parse_trait_alias_cannot_be_unsafe)]
1974pub(crate) struct TraitAliasCannotBeUnsafe {
1975    #[primary_span]
1976    #[label(parse_trait_alias_cannot_be_unsafe)]
1977    pub span: Span,
1978}
1979
1980#[derive(Diagnostic)]
1981#[diag(parse_associated_static_item_not_allowed)]
1982pub(crate) struct AssociatedStaticItemNotAllowed {
1983    #[primary_span]
1984    pub span: Span,
1985}
1986
1987#[derive(Diagnostic)]
1988#[diag(parse_extern_crate_name_with_dashes)]
1989pub(crate) struct ExternCrateNameWithDashes {
1990    #[primary_span]
1991    #[label]
1992    pub span: Span,
1993    #[subdiagnostic]
1994    pub sugg: ExternCrateNameWithDashesSugg,
1995}
1996
1997#[derive(Subdiagnostic)]
1998#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1999pub(crate) struct ExternCrateNameWithDashesSugg {
2000    #[suggestion_part(code = "_")]
2001    pub dashes: Vec<Span>,
2002}
2003
2004#[derive(Diagnostic)]
2005#[diag(parse_extern_item_cannot_be_const)]
2006#[note]
2007pub(crate) struct ExternItemCannotBeConst {
2008    #[primary_span]
2009    pub ident_span: Span,
2010    #[suggestion(code = "static ", applicability = "machine-applicable", style = "verbose")]
2011    pub const_span: Option<Span>,
2012}
2013
2014#[derive(Diagnostic)]
2015#[diag(parse_const_global_cannot_be_mutable)]
2016pub(crate) struct ConstGlobalCannotBeMutable {
2017    #[primary_span]
2018    #[label]
2019    pub ident_span: Span,
2020    #[suggestion(code = "static", style = "verbose", applicability = "maybe-incorrect")]
2021    pub const_span: Span,
2022}
2023
2024#[derive(Diagnostic)]
2025#[diag(parse_missing_const_type)]
2026pub(crate) struct MissingConstType {
2027    #[primary_span]
2028    #[suggestion(code = "{colon} <type>", style = "verbose", applicability = "has-placeholders")]
2029    pub span: Span,
2030
2031    pub kind: &'static str,
2032    pub colon: &'static str,
2033}
2034
2035#[derive(Diagnostic)]
2036#[diag(parse_enum_struct_mutually_exclusive)]
2037pub(crate) struct EnumStructMutuallyExclusive {
2038    #[primary_span]
2039    #[suggestion(code = "enum", style = "verbose", applicability = "machine-applicable")]
2040    pub span: Span,
2041}
2042
2043#[derive(Diagnostic)]
2044pub(crate) enum UnexpectedTokenAfterStructName {
2045    #[diag(parse_unexpected_token_after_struct_name_found_reserved_identifier)]
2046    ReservedIdentifier {
2047        #[primary_span]
2048        #[label(parse_unexpected_token_after_struct_name)]
2049        span: Span,
2050        token: Token,
2051    },
2052    #[diag(parse_unexpected_token_after_struct_name_found_keyword)]
2053    Keyword {
2054        #[primary_span]
2055        #[label(parse_unexpected_token_after_struct_name)]
2056        span: Span,
2057        token: Token,
2058    },
2059    #[diag(parse_unexpected_token_after_struct_name_found_reserved_keyword)]
2060    ReservedKeyword {
2061        #[primary_span]
2062        #[label(parse_unexpected_token_after_struct_name)]
2063        span: Span,
2064        token: Token,
2065    },
2066    #[diag(parse_unexpected_token_after_struct_name_found_doc_comment)]
2067    DocComment {
2068        #[primary_span]
2069        #[label(parse_unexpected_token_after_struct_name)]
2070        span: Span,
2071        token: Token,
2072    },
2073    #[diag(parse_unexpected_token_after_struct_name_found_metavar)]
2074    MetaVar {
2075        #[primary_span]
2076        #[label(parse_unexpected_token_after_struct_name)]
2077        span: Span,
2078    },
2079    #[diag(parse_unexpected_token_after_struct_name_found_other)]
2080    Other {
2081        #[primary_span]
2082        #[label(parse_unexpected_token_after_struct_name)]
2083        span: Span,
2084        token: Token,
2085    },
2086}
2087
2088impl UnexpectedTokenAfterStructName {
2089    pub(crate) fn new(span: Span, token: Token) -> Self {
2090        match TokenDescription::from_token(&token) {
2091            Some(TokenDescription::ReservedIdentifier) => Self::ReservedIdentifier { span, token },
2092            Some(TokenDescription::Keyword) => Self::Keyword { span, token },
2093            Some(TokenDescription::ReservedKeyword) => Self::ReservedKeyword { span, token },
2094            Some(TokenDescription::DocComment) => Self::DocComment { span, token },
2095            Some(TokenDescription::MetaVar(_)) => Self::MetaVar { span },
2096            None => Self::Other { span, token },
2097        }
2098    }
2099}
2100
2101#[derive(Diagnostic)]
2102#[diag(parse_unexpected_self_in_generic_parameters)]
2103#[note]
2104pub(crate) struct UnexpectedSelfInGenericParameters {
2105    #[primary_span]
2106    pub span: Span,
2107}
2108
2109#[derive(Diagnostic)]
2110#[diag(parse_unexpected_default_value_for_lifetime_in_generic_parameters)]
2111pub(crate) struct UnexpectedDefaultValueForLifetimeInGenericParameters {
2112    #[primary_span]
2113    #[label]
2114    pub span: Span,
2115}
2116
2117#[derive(Diagnostic)]
2118#[diag(parse_multiple_where_clauses)]
2119pub(crate) struct MultipleWhereClauses {
2120    #[primary_span]
2121    pub span: Span,
2122    #[label]
2123    pub previous: Span,
2124    #[suggestion(style = "verbose", code = ",", applicability = "maybe-incorrect")]
2125    pub between: Span,
2126}
2127
2128#[derive(Diagnostic)]
2129pub(crate) enum UnexpectedNonterminal {
2130    #[diag(parse_nonterminal_expected_item_keyword)]
2131    Item(#[primary_span] Span),
2132    #[diag(parse_nonterminal_expected_statement)]
2133    Statement(#[primary_span] Span),
2134    #[diag(parse_nonterminal_expected_ident)]
2135    Ident {
2136        #[primary_span]
2137        span: Span,
2138        token: Token,
2139    },
2140    #[diag(parse_nonterminal_expected_lifetime)]
2141    Lifetime {
2142        #[primary_span]
2143        span: Span,
2144        token: Token,
2145    },
2146}
2147
2148#[derive(Diagnostic)]
2149pub(crate) enum TopLevelOrPatternNotAllowed {
2150    #[diag(parse_or_pattern_not_allowed_in_let_binding)]
2151    LetBinding {
2152        #[primary_span]
2153        span: Span,
2154        #[subdiagnostic]
2155        sub: Option<TopLevelOrPatternNotAllowedSugg>,
2156    },
2157    #[diag(parse_or_pattern_not_allowed_in_fn_parameters)]
2158    FunctionParameter {
2159        #[primary_span]
2160        span: Span,
2161        #[subdiagnostic]
2162        sub: Option<TopLevelOrPatternNotAllowedSugg>,
2163    },
2164}
2165
2166#[derive(Diagnostic)]
2167#[diag(parse_cannot_be_raw_ident)]
2168pub(crate) struct CannotBeRawIdent {
2169    #[primary_span]
2170    pub span: Span,
2171    pub ident: Symbol,
2172}
2173
2174#[derive(Diagnostic)]
2175#[diag(parse_cannot_be_raw_lifetime)]
2176pub(crate) struct CannotBeRawLifetime {
2177    #[primary_span]
2178    pub span: Span,
2179    pub ident: Symbol,
2180}
2181
2182#[derive(Diagnostic)]
2183#[diag(parse_keyword_lifetime)]
2184pub(crate) struct KeywordLifetime {
2185    #[primary_span]
2186    pub span: Span,
2187}
2188
2189#[derive(Diagnostic)]
2190#[diag(parse_invalid_label)]
2191pub(crate) struct InvalidLabel {
2192    #[primary_span]
2193    pub span: Span,
2194    pub name: Symbol,
2195}
2196
2197#[derive(Diagnostic)]
2198#[diag(parse_cr_doc_comment)]
2199pub(crate) struct CrDocComment {
2200    #[primary_span]
2201    pub span: Span,
2202    pub block: bool,
2203}
2204
2205#[derive(Diagnostic)]
2206#[diag(parse_no_digits_literal, code = E0768)]
2207pub(crate) struct NoDigitsLiteral {
2208    #[primary_span]
2209    pub span: Span,
2210}
2211
2212#[derive(Diagnostic)]
2213#[diag(parse_invalid_digit_literal)]
2214pub(crate) struct InvalidDigitLiteral {
2215    #[primary_span]
2216    pub span: Span,
2217    pub base: u32,
2218}
2219
2220#[derive(Diagnostic)]
2221#[diag(parse_empty_exponent_float)]
2222pub(crate) struct EmptyExponentFloat {
2223    #[primary_span]
2224    pub span: Span,
2225}
2226
2227#[derive(Diagnostic)]
2228#[diag(parse_float_literal_unsupported_base)]
2229pub(crate) struct FloatLiteralUnsupportedBase {
2230    #[primary_span]
2231    pub span: Span,
2232    pub base: &'static str,
2233}
2234
2235#[derive(Diagnostic)]
2236#[diag(parse_unknown_prefix)]
2237#[note]
2238pub(crate) struct UnknownPrefix<'a> {
2239    #[primary_span]
2240    #[label]
2241    pub span: Span,
2242    pub prefix: &'a str,
2243    #[subdiagnostic]
2244    pub sugg: Option<UnknownPrefixSugg>,
2245}
2246
2247#[derive(Subdiagnostic)]
2248#[note(parse_macro_expands_to_adt_field)]
2249pub(crate) struct MacroExpandsToAdtField<'a> {
2250    pub adt_ty: &'a str,
2251}
2252
2253#[derive(Subdiagnostic)]
2254pub(crate) enum UnknownPrefixSugg {
2255    #[suggestion(
2256        parse_suggestion_br,
2257        code = "br",
2258        applicability = "maybe-incorrect",
2259        style = "verbose"
2260    )]
2261    UseBr(#[primary_span] Span),
2262    #[suggestion(
2263        parse_suggestion_cr,
2264        code = "cr",
2265        applicability = "maybe-incorrect",
2266        style = "verbose"
2267    )]
2268    UseCr(#[primary_span] Span),
2269    #[suggestion(
2270        parse_suggestion_whitespace,
2271        code = " ",
2272        applicability = "maybe-incorrect",
2273        style = "verbose"
2274    )]
2275    Whitespace(#[primary_span] Span),
2276    #[multipart_suggestion(
2277        parse_suggestion_str,
2278        applicability = "maybe-incorrect",
2279        style = "verbose"
2280    )]
2281    MeantStr {
2282        #[suggestion_part(code = "\"")]
2283        start: Span,
2284        #[suggestion_part(code = "\"")]
2285        end: Span,
2286    },
2287}
2288
2289#[derive(Diagnostic)]
2290#[diag(parse_reserved_multihash)]
2291#[note]
2292pub(crate) struct ReservedMultihash {
2293    #[primary_span]
2294    pub span: Span,
2295    #[subdiagnostic]
2296    pub sugg: Option<GuardedStringSugg>,
2297}
2298#[derive(Diagnostic)]
2299#[diag(parse_reserved_string)]
2300#[note]
2301pub(crate) struct ReservedString {
2302    #[primary_span]
2303    pub span: Span,
2304    #[subdiagnostic]
2305    pub sugg: Option<GuardedStringSugg>,
2306}
2307#[derive(Subdiagnostic)]
2308#[suggestion(
2309    parse_suggestion_whitespace,
2310    code = " ",
2311    applicability = "maybe-incorrect",
2312    style = "verbose"
2313)]
2314pub(crate) struct GuardedStringSugg(#[primary_span] pub Span);
2315
2316#[derive(Diagnostic)]
2317#[diag(parse_too_many_hashes)]
2318pub(crate) struct TooManyHashes {
2319    #[primary_span]
2320    pub span: Span,
2321    pub num: u32,
2322}
2323
2324#[derive(Diagnostic)]
2325#[diag(parse_unknown_start_of_token)]
2326pub(crate) struct UnknownTokenStart {
2327    #[primary_span]
2328    pub span: Span,
2329    pub escaped: String,
2330    #[subdiagnostic]
2331    pub sugg: Option<TokenSubstitution>,
2332    #[subdiagnostic]
2333    pub null: Option<UnknownTokenNull>,
2334    #[subdiagnostic]
2335    pub repeat: Option<UnknownTokenRepeat>,
2336}
2337
2338#[derive(Subdiagnostic)]
2339pub(crate) enum TokenSubstitution {
2340    #[suggestion(
2341        parse_sugg_quotes,
2342        code = "{suggestion}",
2343        applicability = "maybe-incorrect",
2344        style = "verbose"
2345    )]
2346    DirectedQuotes {
2347        #[primary_span]
2348        span: Span,
2349        suggestion: String,
2350        ascii_str: &'static str,
2351        ascii_name: &'static str,
2352    },
2353    #[suggestion(
2354        parse_sugg_other,
2355        code = "{suggestion}",
2356        applicability = "maybe-incorrect",
2357        style = "verbose"
2358    )]
2359    Other {
2360        #[primary_span]
2361        span: Span,
2362        suggestion: String,
2363        ch: String,
2364        u_name: &'static str,
2365        ascii_str: &'static str,
2366        ascii_name: &'static str,
2367    },
2368}
2369
2370#[derive(Subdiagnostic)]
2371#[note(parse_note_repeats)]
2372pub(crate) struct UnknownTokenRepeat {
2373    pub repeats: usize,
2374}
2375
2376#[derive(Subdiagnostic)]
2377#[help(parse_help_null)]
2378pub(crate) struct UnknownTokenNull;
2379
2380#[derive(Diagnostic)]
2381pub(crate) enum UnescapeError {
2382    #[diag(parse_invalid_unicode_escape)]
2383    #[help]
2384    InvalidUnicodeEscape {
2385        #[primary_span]
2386        #[label]
2387        span: Span,
2388        surrogate: bool,
2389    },
2390    #[diag(parse_escape_only_char)]
2391    EscapeOnlyChar {
2392        #[primary_span]
2393        span: Span,
2394        #[suggestion(
2395            parse_escape,
2396            applicability = "machine-applicable",
2397            code = "{escaped_sugg}",
2398            style = "verbose"
2399        )]
2400        char_span: Span,
2401        escaped_sugg: String,
2402        escaped_msg: String,
2403        byte: bool,
2404    },
2405    #[diag(parse_bare_cr)]
2406    BareCr {
2407        #[primary_span]
2408        #[suggestion(
2409            parse_escape,
2410            applicability = "machine-applicable",
2411            code = "\\r",
2412            style = "verbose"
2413        )]
2414        span: Span,
2415        double_quotes: bool,
2416    },
2417    #[diag(parse_bare_cr_in_raw_string)]
2418    BareCrRawString(#[primary_span] Span),
2419    #[diag(parse_too_short_hex_escape)]
2420    TooShortHexEscape(#[primary_span] Span),
2421    #[diag(parse_invalid_char_in_escape)]
2422    InvalidCharInEscape {
2423        #[primary_span]
2424        #[label]
2425        span: Span,
2426        is_hex: bool,
2427        ch: String,
2428    },
2429    #[diag(parse_out_of_range_hex_escape)]
2430    OutOfRangeHexEscape(
2431        #[primary_span]
2432        #[label]
2433        Span,
2434    ),
2435    #[diag(parse_leading_underscore_unicode_escape)]
2436    LeadingUnderscoreUnicodeEscape {
2437        #[primary_span]
2438        #[label(parse_leading_underscore_unicode_escape_label)]
2439        span: Span,
2440        ch: String,
2441    },
2442    #[diag(parse_overlong_unicode_escape)]
2443    OverlongUnicodeEscape(
2444        #[primary_span]
2445        #[label]
2446        Span,
2447    ),
2448    #[diag(parse_unclosed_unicode_escape)]
2449    UnclosedUnicodeEscape(
2450        #[primary_span]
2451        #[label]
2452        Span,
2453        #[suggestion(
2454            parse_terminate,
2455            code = "}}",
2456            applicability = "maybe-incorrect",
2457            style = "verbose"
2458        )]
2459        Span,
2460    ),
2461    #[diag(parse_no_brace_unicode_escape)]
2462    NoBraceInUnicodeEscape {
2463        #[primary_span]
2464        span: Span,
2465        #[label]
2466        label: Option<Span>,
2467        #[subdiagnostic]
2468        sub: NoBraceUnicodeSub,
2469    },
2470    #[diag(parse_unicode_escape_in_byte)]
2471    #[help]
2472    UnicodeEscapeInByte(
2473        #[primary_span]
2474        #[label]
2475        Span,
2476    ),
2477    #[diag(parse_empty_unicode_escape)]
2478    EmptyUnicodeEscape(
2479        #[primary_span]
2480        #[label]
2481        Span,
2482    ),
2483    #[diag(parse_zero_chars)]
2484    ZeroChars(
2485        #[primary_span]
2486        #[label]
2487        Span,
2488    ),
2489    #[diag(parse_lone_slash)]
2490    LoneSlash(
2491        #[primary_span]
2492        #[label]
2493        Span,
2494    ),
2495    #[diag(parse_unskipped_whitespace)]
2496    UnskippedWhitespace {
2497        #[primary_span]
2498        span: Span,
2499        #[label]
2500        char_span: Span,
2501        ch: String,
2502    },
2503    #[diag(parse_multiple_skipped_lines)]
2504    MultipleSkippedLinesWarning(
2505        #[primary_span]
2506        #[label]
2507        Span,
2508    ),
2509    #[diag(parse_more_than_one_char)]
2510    MoreThanOneChar {
2511        #[primary_span]
2512        span: Span,
2513        #[subdiagnostic]
2514        note: Option<MoreThanOneCharNote>,
2515        #[subdiagnostic]
2516        suggestion: MoreThanOneCharSugg,
2517    },
2518    #[diag(parse_nul_in_c_str)]
2519    NulInCStr {
2520        #[primary_span]
2521        span: Span,
2522    },
2523}
2524
2525#[derive(Subdiagnostic)]
2526pub(crate) enum MoreThanOneCharSugg {
2527    #[suggestion(
2528        parse_consider_normalized,
2529        code = "{normalized}",
2530        applicability = "machine-applicable",
2531        style = "verbose"
2532    )]
2533    NormalizedForm {
2534        #[primary_span]
2535        span: Span,
2536        ch: String,
2537        normalized: String,
2538    },
2539    #[suggestion(
2540        parse_remove_non,
2541        code = "{ch}",
2542        applicability = "maybe-incorrect",
2543        style = "verbose"
2544    )]
2545    RemoveNonPrinting {
2546        #[primary_span]
2547        span: Span,
2548        ch: String,
2549    },
2550    #[suggestion(
2551        parse_use_double_quotes,
2552        code = "{sugg}",
2553        applicability = "machine-applicable",
2554        style = "verbose"
2555    )]
2556    QuotesFull {
2557        #[primary_span]
2558        span: Span,
2559        is_byte: bool,
2560        sugg: String,
2561    },
2562    #[multipart_suggestion(parse_use_double_quotes, applicability = "machine-applicable")]
2563    Quotes {
2564        #[suggestion_part(code = "{prefix}\"")]
2565        start: Span,
2566        #[suggestion_part(code = "\"")]
2567        end: Span,
2568        is_byte: bool,
2569        prefix: &'static str,
2570    },
2571}
2572
2573#[derive(Subdiagnostic)]
2574pub(crate) enum MoreThanOneCharNote {
2575    #[note(parse_followed_by)]
2576    AllCombining {
2577        #[primary_span]
2578        span: Span,
2579        chr: String,
2580        len: usize,
2581        escaped_marks: String,
2582    },
2583    #[note(parse_non_printing)]
2584    NonPrinting {
2585        #[primary_span]
2586        span: Span,
2587        escaped: String,
2588    },
2589}
2590
2591#[derive(Subdiagnostic)]
2592pub(crate) enum NoBraceUnicodeSub {
2593    #[suggestion(
2594        parse_use_braces,
2595        code = "{suggestion}",
2596        applicability = "maybe-incorrect",
2597        style = "verbose"
2598    )]
2599    Suggestion {
2600        #[primary_span]
2601        span: Span,
2602        suggestion: String,
2603    },
2604    #[help(parse_format_of_unicode)]
2605    Help,
2606}
2607
2608#[derive(Subdiagnostic)]
2609#[multipart_suggestion(parse_sugg_wrap_pattern_in_parens, applicability = "machine-applicable")]
2610pub(crate) struct WrapInParens {
2611    #[suggestion_part(code = "(")]
2612    pub(crate) lo: Span,
2613    #[suggestion_part(code = ")")]
2614    pub(crate) hi: Span,
2615}
2616
2617#[derive(Subdiagnostic)]
2618pub(crate) enum TopLevelOrPatternNotAllowedSugg {
2619    #[suggestion(
2620        parse_sugg_remove_leading_vert_in_pattern,
2621        code = "",
2622        applicability = "machine-applicable",
2623        style = "verbose"
2624    )]
2625    RemoveLeadingVert {
2626        #[primary_span]
2627        span: Span,
2628    },
2629    WrapInParens {
2630        #[primary_span]
2631        span: Span,
2632        #[subdiagnostic]
2633        suggestion: WrapInParens,
2634    },
2635}
2636
2637#[derive(Diagnostic)]
2638#[diag(parse_unexpected_vert_vert_before_function_parameter)]
2639#[note(parse_note_pattern_alternatives_use_single_vert)]
2640pub(crate) struct UnexpectedVertVertBeforeFunctionParam {
2641    #[primary_span]
2642    #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
2643    pub span: Span,
2644}
2645
2646#[derive(Diagnostic)]
2647#[diag(parse_unexpected_vert_vert_in_pattern)]
2648pub(crate) struct UnexpectedVertVertInPattern {
2649    #[primary_span]
2650    #[suggestion(code = "|", applicability = "machine-applicable", style = "verbose")]
2651    pub span: Span,
2652    #[label(parse_label_while_parsing_or_pattern_here)]
2653    pub start: Option<Span>,
2654}
2655
2656#[derive(Diagnostic)]
2657#[diag(parse_trailing_vert_not_allowed)]
2658pub(crate) struct TrailingVertNotAllowed {
2659    #[primary_span]
2660    #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
2661    pub span: Span,
2662    #[label(parse_label_while_parsing_or_pattern_here)]
2663    pub start: Option<Span>,
2664    pub token: Token,
2665    #[note(parse_note_pattern_alternatives_use_single_vert)]
2666    pub note_double_vert: bool,
2667}
2668
2669#[derive(Diagnostic)]
2670#[diag(parse_dotdotdot_rest_pattern)]
2671pub(crate) struct DotDotDotRestPattern {
2672    #[primary_span]
2673    #[label]
2674    pub span: Span,
2675    #[suggestion(style = "verbose", code = "", applicability = "machine-applicable")]
2676    pub suggestion: Span,
2677}
2678
2679#[derive(Diagnostic)]
2680#[diag(parse_pattern_on_wrong_side_of_at)]
2681pub(crate) struct PatternOnWrongSideOfAt {
2682    #[primary_span]
2683    #[suggestion(code = "{whole_pat}", applicability = "machine-applicable", style = "verbose")]
2684    pub whole_span: Span,
2685    pub whole_pat: String,
2686    #[label(parse_label_pattern)]
2687    pub pattern: Span,
2688    #[label(parse_label_binding)]
2689    pub binding: Span,
2690}
2691
2692#[derive(Diagnostic)]
2693#[diag(parse_expected_binding_left_of_at)]
2694#[note]
2695pub(crate) struct ExpectedBindingLeftOfAt {
2696    #[primary_span]
2697    pub whole_span: Span,
2698    #[label(parse_label_lhs)]
2699    pub lhs: Span,
2700    #[label(parse_label_rhs)]
2701    pub rhs: Span,
2702}
2703
2704#[derive(Subdiagnostic)]
2705#[multipart_suggestion(
2706    parse_ambiguous_range_pattern_suggestion,
2707    applicability = "machine-applicable"
2708)]
2709pub(crate) struct ParenRangeSuggestion {
2710    #[suggestion_part(code = "(")]
2711    pub lo: Span,
2712    #[suggestion_part(code = ")")]
2713    pub hi: Span,
2714}
2715
2716#[derive(Diagnostic)]
2717#[diag(parse_ambiguous_range_pattern)]
2718pub(crate) struct AmbiguousRangePattern {
2719    #[primary_span]
2720    pub span: Span,
2721    #[subdiagnostic]
2722    pub suggestion: ParenRangeSuggestion,
2723}
2724
2725#[derive(Diagnostic)]
2726#[diag(parse_unexpected_lifetime_in_pattern)]
2727pub(crate) struct UnexpectedLifetimeInPattern {
2728    #[primary_span]
2729    pub span: Span,
2730    pub symbol: Symbol,
2731    #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
2732    pub suggestion: Span,
2733}
2734
2735#[derive(Diagnostic)]
2736pub(crate) enum InvalidMutInPattern {
2737    #[diag(parse_mut_on_nested_ident_pattern)]
2738    #[note(parse_note_mut_pattern_usage)]
2739    NestedIdent {
2740        #[primary_span]
2741        #[suggestion(code = "{pat}", applicability = "machine-applicable", style = "verbose")]
2742        span: Span,
2743        pat: String,
2744    },
2745    #[diag(parse_mut_on_non_ident_pattern)]
2746    #[note(parse_note_mut_pattern_usage)]
2747    NonIdent {
2748        #[primary_span]
2749        #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
2750        span: Span,
2751    },
2752}
2753
2754#[derive(Diagnostic)]
2755#[diag(parse_repeated_mut_in_pattern)]
2756pub(crate) struct RepeatedMutInPattern {
2757    #[primary_span]
2758    pub span: Span,
2759    #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
2760    pub suggestion: Span,
2761}
2762
2763#[derive(Diagnostic)]
2764#[diag(parse_dot_dot_dot_range_to_pattern_not_allowed)]
2765pub(crate) struct DotDotDotRangeToPatternNotAllowed {
2766    #[primary_span]
2767    #[suggestion(style = "verbose", code = "..=", applicability = "machine-applicable")]
2768    pub span: Span,
2769}
2770
2771#[derive(Diagnostic)]
2772#[diag(parse_enum_pattern_instead_of_identifier)]
2773pub(crate) struct EnumPatternInsteadOfIdentifier {
2774    #[primary_span]
2775    pub span: Span,
2776}
2777
2778#[derive(Diagnostic)]
2779#[diag(parse_at_dot_dot_in_struct_pattern)]
2780pub(crate) struct AtDotDotInStructPattern {
2781    #[primary_span]
2782    pub span: Span,
2783    #[suggestion(code = "", style = "verbose", applicability = "machine-applicable")]
2784    pub remove: Span,
2785    pub ident: Ident,
2786}
2787
2788#[derive(Diagnostic)]
2789#[diag(parse_at_in_struct_pattern)]
2790#[note]
2791#[help]
2792pub(crate) struct AtInStructPattern {
2793    #[primary_span]
2794    pub span: Span,
2795}
2796
2797#[derive(Diagnostic)]
2798#[diag(parse_dot_dot_dot_for_remaining_fields)]
2799pub(crate) struct DotDotDotForRemainingFields {
2800    #[primary_span]
2801    #[suggestion(code = "..", style = "verbose", applicability = "machine-applicable")]
2802    pub span: Span,
2803    pub token_str: Cow<'static, str>,
2804}
2805
2806#[derive(Diagnostic)]
2807#[diag(parse_expected_comma_after_pattern_field)]
2808pub(crate) struct ExpectedCommaAfterPatternField {
2809    #[primary_span]
2810    pub span: Span,
2811}
2812
2813#[derive(Diagnostic)]
2814#[diag(parse_unexpected_expr_in_pat)]
2815#[note]
2816pub(crate) struct UnexpectedExpressionInPattern {
2817    /// The unexpected expr's span.
2818    #[primary_span]
2819    #[label]
2820    pub span: Span,
2821    /// Was a `RangePatternBound` expected?
2822    pub is_bound: bool,
2823    /// The unexpected expr's precedence (used in match arm guard suggestions).
2824    pub expr_precedence: ExprPrecedence,
2825}
2826
2827#[derive(Subdiagnostic)]
2828pub(crate) enum UnexpectedExpressionInPatternSugg {
2829    #[multipart_suggestion(
2830        parse_unexpected_expr_in_pat_create_guard_sugg,
2831        applicability = "maybe-incorrect"
2832    )]
2833    CreateGuard {
2834        /// Where to put the suggested identifier.
2835        #[suggestion_part(code = "{ident}")]
2836        ident_span: Span,
2837        /// Where to put the match arm.
2838        #[suggestion_part(code = " if {ident} == {expr}")]
2839        pat_hi: Span,
2840        /// The suggested identifier.
2841        ident: String,
2842        /// The unexpected expression.
2843        expr: String,
2844    },
2845
2846    #[multipart_suggestion(
2847        parse_unexpected_expr_in_pat_update_guard_sugg,
2848        applicability = "maybe-incorrect"
2849    )]
2850    UpdateGuard {
2851        /// Where to put the suggested identifier.
2852        #[suggestion_part(code = "{ident}")]
2853        ident_span: Span,
2854        /// The beginning of the match arm guard's expression (insert a `(` if `Some`).
2855        #[suggestion_part(code = "(")]
2856        guard_lo: Option<Span>,
2857        /// The end of the match arm guard's expression.
2858        #[suggestion_part(code = "{guard_hi_paren} && {ident} == {expr}")]
2859        guard_hi: Span,
2860        /// Either `")"` or `""`.
2861        guard_hi_paren: &'static str,
2862        /// The suggested identifier.
2863        ident: String,
2864        /// The unexpected expression.
2865        expr: String,
2866    },
2867
2868    #[multipart_suggestion(
2869        parse_unexpected_expr_in_pat_const_sugg,
2870        applicability = "has-placeholders"
2871    )]
2872    Const {
2873        /// Where to put the extracted constant declaration.
2874        #[suggestion_part(code = "{indentation}const {ident}: /* Type */ = {expr};\n")]
2875        stmt_lo: Span,
2876        /// Where to put the suggested identifier.
2877        #[suggestion_part(code = "{ident}")]
2878        ident_span: Span,
2879        /// The suggested identifier.
2880        ident: String,
2881        /// The unexpected expression.
2882        expr: String,
2883        /// The statement's block's indentation.
2884        indentation: String,
2885    },
2886}
2887
2888#[derive(Diagnostic)]
2889#[diag(parse_unexpected_paren_in_range_pat)]
2890pub(crate) struct UnexpectedParenInRangePat {
2891    #[primary_span]
2892    pub span: Vec<Span>,
2893    #[subdiagnostic]
2894    pub sugg: UnexpectedParenInRangePatSugg,
2895}
2896
2897#[derive(Subdiagnostic)]
2898#[multipart_suggestion(
2899    parse_unexpected_paren_in_range_pat_sugg,
2900    applicability = "machine-applicable"
2901)]
2902pub(crate) struct UnexpectedParenInRangePatSugg {
2903    #[suggestion_part(code = "")]
2904    pub start_span: Span,
2905    #[suggestion_part(code = "")]
2906    pub end_span: Span,
2907}
2908
2909#[derive(Diagnostic)]
2910#[diag(parse_return_types_use_thin_arrow)]
2911pub(crate) struct ReturnTypesUseThinArrow {
2912    #[primary_span]
2913    pub span: Span,
2914    #[suggestion(style = "verbose", code = " -> ", applicability = "machine-applicable")]
2915    pub suggestion: Span,
2916}
2917
2918#[derive(Diagnostic)]
2919#[diag(parse_need_plus_after_trait_object_lifetime)]
2920pub(crate) struct NeedPlusAfterTraitObjectLifetime {
2921    #[primary_span]
2922    pub span: Span,
2923    #[suggestion(code = " + /* Trait */", applicability = "has-placeholders")]
2924    pub suggestion: Span,
2925}
2926
2927#[derive(Diagnostic)]
2928#[diag(parse_expected_mut_or_const_in_raw_pointer_type)]
2929pub(crate) struct ExpectedMutOrConstInRawPointerType {
2930    #[primary_span]
2931    pub span: Span,
2932    #[suggestion(code("mut ", "const "), applicability = "has-placeholders", style = "verbose")]
2933    pub after_asterisk: Span,
2934}
2935
2936#[derive(Diagnostic)]
2937#[diag(parse_lifetime_after_mut)]
2938pub(crate) struct LifetimeAfterMut {
2939    #[primary_span]
2940    pub span: Span,
2941    #[suggestion(code = "&{snippet} mut", applicability = "maybe-incorrect", style = "verbose")]
2942    pub suggest_lifetime: Option<Span>,
2943    pub snippet: String,
2944}
2945
2946#[derive(Diagnostic)]
2947#[diag(parse_dyn_after_mut)]
2948pub(crate) struct DynAfterMut {
2949    #[primary_span]
2950    #[suggestion(code = "&mut dyn", applicability = "machine-applicable", style = "verbose")]
2951    pub span: Span,
2952}
2953
2954#[derive(Diagnostic)]
2955#[diag(parse_fn_pointer_cannot_be_const)]
2956#[note]
2957pub(crate) struct FnPointerCannotBeConst {
2958    #[primary_span]
2959    #[label]
2960    pub span: Span,
2961    #[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")]
2962    pub suggestion: Span,
2963}
2964
2965#[derive(Diagnostic)]
2966#[diag(parse_fn_pointer_cannot_be_async)]
2967#[note]
2968pub(crate) struct FnPointerCannotBeAsync {
2969    #[primary_span]
2970    #[label]
2971    pub span: Span,
2972    #[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")]
2973    pub suggestion: Span,
2974}
2975
2976#[derive(Diagnostic)]
2977#[diag(parse_nested_c_variadic_type, code = E0743)]
2978pub(crate) struct NestedCVariadicType {
2979    #[primary_span]
2980    pub span: Span,
2981}
2982
2983#[derive(Diagnostic)]
2984#[diag(parse_invalid_dyn_keyword)]
2985#[help]
2986pub(crate) struct InvalidDynKeyword {
2987    #[primary_span]
2988    pub span: Span,
2989    #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
2990    pub suggestion: Span,
2991}
2992
2993#[derive(Subdiagnostic)]
2994pub(crate) enum HelpUseLatestEdition {
2995    #[help(parse_help_set_edition_cargo)]
2996    #[note(parse_note_edition_guide)]
2997    Cargo { edition: Edition },
2998    #[help(parse_help_set_edition_standalone)]
2999    #[note(parse_note_edition_guide)]
3000    Standalone { edition: Edition },
3001}
3002
3003impl HelpUseLatestEdition {
3004    pub(crate) fn new() -> Self {
3005        let edition = LATEST_STABLE_EDITION;
3006        if rustc_session::utils::was_invoked_from_cargo() {
3007            Self::Cargo { edition }
3008        } else {
3009            Self::Standalone { edition }
3010        }
3011    }
3012}
3013
3014#[derive(Diagnostic)]
3015#[diag(parse_box_syntax_removed)]
3016pub(crate) struct BoxSyntaxRemoved {
3017    #[primary_span]
3018    pub span: Span,
3019    #[subdiagnostic]
3020    pub sugg: AddBoxNew,
3021}
3022
3023#[derive(Subdiagnostic)]
3024#[multipart_suggestion(
3025    parse_box_syntax_removed_suggestion,
3026    applicability = "machine-applicable",
3027    style = "verbose"
3028)]
3029pub(crate) struct AddBoxNew {
3030    #[suggestion_part(code = "Box::new(")]
3031    pub box_kw_and_lo: Span,
3032    #[suggestion_part(code = ")")]
3033    pub hi: Span,
3034}
3035
3036#[derive(Diagnostic)]
3037#[diag(parse_bad_return_type_notation_output)]
3038pub(crate) struct BadReturnTypeNotationOutput {
3039    #[primary_span]
3040    pub span: Span,
3041    #[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")]
3042    pub suggestion: Span,
3043}
3044
3045#[derive(Diagnostic)]
3046#[diag(parse_bad_assoc_type_bounds)]
3047pub(crate) struct BadAssocTypeBounds {
3048    #[primary_span]
3049    #[label]
3050    pub span: Span,
3051}
3052
3053#[derive(Diagnostic)]
3054#[diag(parse_attr_after_generic)]
3055pub(crate) struct AttrAfterGeneric {
3056    #[primary_span]
3057    #[label]
3058    pub span: Span,
3059}
3060
3061#[derive(Diagnostic)]
3062#[diag(parse_attr_without_generics)]
3063pub(crate) struct AttrWithoutGenerics {
3064    #[primary_span]
3065    #[label]
3066    pub span: Span,
3067}
3068
3069#[derive(Diagnostic)]
3070#[diag(parse_where_generics)]
3071pub(crate) struct WhereOnGenerics {
3072    #[primary_span]
3073    #[label]
3074    pub span: Span,
3075}
3076
3077#[derive(Diagnostic)]
3078#[diag(parse_generics_in_path)]
3079pub(crate) struct GenericsInPath {
3080    #[primary_span]
3081    pub span: Vec<Span>,
3082}
3083
3084#[derive(Diagnostic)]
3085#[diag(parse_lifetime_in_eq_constraint)]
3086#[help]
3087pub(crate) struct LifetimeInEqConstraint {
3088    #[primary_span]
3089    #[label]
3090    pub span: Span,
3091    pub lifetime: Ident,
3092    #[label(parse_context_label)]
3093    pub binding_label: Span,
3094    #[suggestion(
3095        parse_colon_sugg,
3096        style = "verbose",
3097        applicability = "maybe-incorrect",
3098        code = ": "
3099    )]
3100    pub colon_sugg: Span,
3101}
3102
3103#[derive(Diagnostic)]
3104#[diag(parse_modifier_lifetime)]
3105pub(crate) struct ModifierLifetime {
3106    #[primary_span]
3107    #[suggestion(style = "tool-only", applicability = "maybe-incorrect", code = "")]
3108    pub span: Span,
3109    pub modifier: &'static str,
3110}
3111
3112#[derive(Subdiagnostic)]
3113#[multipart_suggestion(
3114    parse_parenthesized_lifetime_suggestion,
3115    applicability = "machine-applicable"
3116)]
3117pub(crate) struct RemoveParens {
3118    #[suggestion_part(code = "")]
3119    pub lo: Span,
3120    #[suggestion_part(code = "")]
3121    pub hi: Span,
3122}
3123
3124#[derive(Diagnostic)]
3125#[diag(parse_parenthesized_lifetime)]
3126pub(crate) struct ParenthesizedLifetime {
3127    #[primary_span]
3128    pub span: Span,
3129    #[subdiagnostic]
3130    pub sugg: RemoveParens,
3131}
3132
3133#[derive(Diagnostic)]
3134#[diag(parse_underscore_literal_suffix)]
3135pub(crate) struct UnderscoreLiteralSuffix {
3136    #[primary_span]
3137    pub span: Span,
3138}
3139
3140#[derive(Diagnostic)]
3141#[diag(parse_expect_label_found_ident)]
3142pub(crate) struct ExpectedLabelFoundIdent {
3143    #[primary_span]
3144    pub span: Span,
3145    #[suggestion(code = "'", applicability = "machine-applicable", style = "verbose")]
3146    pub start: Span,
3147}
3148
3149#[derive(Diagnostic)]
3150#[diag(parse_inappropriate_default)]
3151#[note]
3152pub(crate) struct InappropriateDefault {
3153    #[primary_span]
3154    #[label]
3155    pub span: Span,
3156    pub article: &'static str,
3157    pub descr: &'static str,
3158}
3159
3160#[derive(Diagnostic)]
3161#[diag(parse_recover_import_as_use)]
3162pub(crate) struct RecoverImportAsUse {
3163    #[primary_span]
3164    #[suggestion(code = "use", applicability = "machine-applicable", style = "verbose")]
3165    pub span: Span,
3166    pub token_name: String,
3167}
3168
3169#[derive(Diagnostic)]
3170#[diag(parse_single_colon_import_path)]
3171#[note]
3172pub(crate) struct SingleColonImportPath {
3173    #[primary_span]
3174    #[suggestion(code = "::", applicability = "machine-applicable", style = "verbose")]
3175    pub span: Span,
3176}
3177
3178#[derive(Diagnostic)]
3179#[diag(parse_bad_item_kind)]
3180pub(crate) struct BadItemKind {
3181    #[primary_span]
3182    pub span: Span,
3183    pub descr: &'static str,
3184    pub ctx: &'static str,
3185    #[help]
3186    pub help: bool,
3187}
3188
3189#[derive(Diagnostic)]
3190#[diag(parse_macro_rules_missing_bang)]
3191pub(crate) struct MacroRulesMissingBang {
3192    #[primary_span]
3193    pub span: Span,
3194    #[suggestion(code = "!", applicability = "machine-applicable", style = "verbose")]
3195    pub hi: Span,
3196}
3197
3198#[derive(Diagnostic)]
3199#[diag(parse_macro_name_remove_bang)]
3200pub(crate) struct MacroNameRemoveBang {
3201    #[primary_span]
3202    #[suggestion(code = "", applicability = "machine-applicable", style = "short")]
3203    pub span: Span,
3204}
3205
3206#[derive(Diagnostic)]
3207#[diag(parse_macro_rules_visibility)]
3208pub(crate) struct MacroRulesVisibility<'a> {
3209    #[primary_span]
3210    #[suggestion(code = "#[macro_export]", applicability = "maybe-incorrect", style = "verbose")]
3211    pub span: Span,
3212    pub vis: &'a str,
3213}
3214
3215#[derive(Diagnostic)]
3216#[diag(parse_macro_invocation_visibility)]
3217#[help]
3218pub(crate) struct MacroInvocationVisibility<'a> {
3219    #[primary_span]
3220    #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
3221    pub span: Span,
3222    pub vis: &'a str,
3223}
3224
3225#[derive(Diagnostic)]
3226#[diag(parse_nested_adt)]
3227pub(crate) struct NestedAdt<'a> {
3228    #[primary_span]
3229    pub span: Span,
3230    #[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")]
3231    pub item: Span,
3232    pub keyword: &'a str,
3233    pub kw_str: Cow<'a, str>,
3234}
3235
3236#[derive(Diagnostic)]
3237#[diag(parse_function_body_equals_expr)]
3238pub(crate) struct FunctionBodyEqualsExpr {
3239    #[primary_span]
3240    pub span: Span,
3241    #[subdiagnostic]
3242    pub sugg: FunctionBodyEqualsExprSugg,
3243}
3244
3245#[derive(Subdiagnostic)]
3246#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
3247pub(crate) struct FunctionBodyEqualsExprSugg {
3248    #[suggestion_part(code = "{{")]
3249    pub eq: Span,
3250    #[suggestion_part(code = " }}")]
3251    pub semi: Span,
3252}
3253
3254#[derive(Diagnostic)]
3255#[diag(parse_box_not_pat)]
3256pub(crate) struct BoxNotPat {
3257    #[primary_span]
3258    pub span: Span,
3259    #[note]
3260    pub kw: Span,
3261    #[suggestion(code = "r#", applicability = "maybe-incorrect", style = "verbose")]
3262    pub lo: Span,
3263    pub descr: String,
3264}
3265
3266#[derive(Diagnostic)]
3267#[diag(parse_unmatched_angle)]
3268pub(crate) struct UnmatchedAngle {
3269    #[primary_span]
3270    #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
3271    pub span: Span,
3272    pub plural: bool,
3273}
3274
3275#[derive(Diagnostic)]
3276#[diag(parse_missing_plus_in_bounds)]
3277pub(crate) struct MissingPlusBounds {
3278    #[primary_span]
3279    pub span: Span,
3280    #[suggestion(code = " +", applicability = "maybe-incorrect", style = "verbose")]
3281    pub hi: Span,
3282    pub sym: Symbol,
3283}
3284
3285#[derive(Diagnostic)]
3286#[diag(parse_incorrect_parens_trait_bounds)]
3287pub(crate) struct IncorrectParensTraitBounds {
3288    #[primary_span]
3289    pub span: Vec<Span>,
3290    #[subdiagnostic]
3291    pub sugg: IncorrectParensTraitBoundsSugg,
3292}
3293
3294#[derive(Subdiagnostic)]
3295#[multipart_suggestion(
3296    parse_incorrect_parens_trait_bounds_sugg,
3297    applicability = "machine-applicable"
3298)]
3299pub(crate) struct IncorrectParensTraitBoundsSugg {
3300    #[suggestion_part(code = " ")]
3301    pub wrong_span: Span,
3302    #[suggestion_part(code = "(")]
3303    pub new_span: Span,
3304}
3305
3306#[derive(Diagnostic)]
3307#[diag(parse_kw_bad_case)]
3308pub(crate) struct KwBadCase<'a> {
3309    #[primary_span]
3310    #[suggestion(code = "{kw}", style = "verbose", applicability = "machine-applicable")]
3311    pub span: Span,
3312    pub kw: &'a str,
3313}
3314
3315#[derive(Diagnostic)]
3316#[diag(parse_meta_bad_delim)]
3317pub(crate) struct MetaBadDelim {
3318    #[primary_span]
3319    pub span: Span,
3320    #[subdiagnostic]
3321    pub sugg: MetaBadDelimSugg,
3322}
3323
3324#[derive(Diagnostic)]
3325#[diag(parse_cfg_attr_bad_delim)]
3326pub(crate) struct CfgAttrBadDelim {
3327    #[primary_span]
3328    pub span: Span,
3329    #[subdiagnostic]
3330    pub sugg: MetaBadDelimSugg,
3331}
3332
3333#[derive(Subdiagnostic)]
3334#[multipart_suggestion(parse_meta_bad_delim_suggestion, applicability = "machine-applicable")]
3335pub(crate) struct MetaBadDelimSugg {
3336    #[suggestion_part(code = "(")]
3337    pub open: Span,
3338    #[suggestion_part(code = ")")]
3339    pub close: Span,
3340}
3341
3342#[derive(Diagnostic)]
3343#[diag(parse_malformed_cfg_attr)]
3344#[note]
3345pub(crate) struct MalformedCfgAttr {
3346    #[primary_span]
3347    #[suggestion(style = "verbose", code = "{sugg}")]
3348    pub span: Span,
3349    pub sugg: &'static str,
3350}
3351
3352#[derive(Diagnostic)]
3353#[diag(parse_unknown_builtin_construct)]
3354pub(crate) struct UnknownBuiltinConstruct {
3355    #[primary_span]
3356    pub span: Span,
3357    pub name: Ident,
3358}
3359
3360#[derive(Diagnostic)]
3361#[diag(parse_expected_builtin_ident)]
3362pub(crate) struct ExpectedBuiltinIdent {
3363    #[primary_span]
3364    pub span: Span,
3365}
3366
3367#[derive(Diagnostic)]
3368#[diag(parse_static_with_generics)]
3369pub(crate) struct StaticWithGenerics {
3370    #[primary_span]
3371    pub span: Span,
3372}
3373
3374#[derive(Diagnostic)]
3375#[diag(parse_where_clause_before_const_body)]
3376pub(crate) struct WhereClauseBeforeConstBody {
3377    #[primary_span]
3378    #[label]
3379    pub span: Span,
3380    #[label(parse_name_label)]
3381    pub name: Span,
3382    #[label(parse_body_label)]
3383    pub body: Span,
3384    #[subdiagnostic]
3385    pub sugg: Option<WhereClauseBeforeConstBodySugg>,
3386}
3387
3388#[derive(Subdiagnostic)]
3389#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
3390pub(crate) struct WhereClauseBeforeConstBodySugg {
3391    #[suggestion_part(code = "= {snippet} ")]
3392    pub left: Span,
3393    pub snippet: String,
3394    #[suggestion_part(code = "")]
3395    pub right: Span,
3396}
3397
3398#[derive(Diagnostic)]
3399#[diag(parse_generic_args_in_pat_require_turbofish_syntax)]
3400pub(crate) struct GenericArgsInPatRequireTurbofishSyntax {
3401    #[primary_span]
3402    pub span: Span,
3403    #[suggestion(
3404        parse_sugg_turbofish_syntax,
3405        style = "verbose",
3406        code = "::",
3407        applicability = "maybe-incorrect"
3408    )]
3409    pub suggest_turbofish: Span,
3410}
3411
3412#[derive(Diagnostic)]
3413#[diag(parse_transpose_dyn_or_impl)]
3414pub(crate) struct TransposeDynOrImpl<'a> {
3415    #[primary_span]
3416    pub span: Span,
3417    pub kw: &'a str,
3418    #[subdiagnostic]
3419    pub sugg: TransposeDynOrImplSugg<'a>,
3420}
3421
3422#[derive(Subdiagnostic)]
3423#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
3424pub(crate) struct TransposeDynOrImplSugg<'a> {
3425    #[suggestion_part(code = "")]
3426    pub removal_span: Span,
3427    #[suggestion_part(code = "{kw} ")]
3428    pub insertion_span: Span,
3429    pub kw: &'a str,
3430}
3431
3432#[derive(Diagnostic)]
3433#[diag(parse_array_index_offset_of)]
3434pub(crate) struct ArrayIndexInOffsetOf(#[primary_span] pub Span);
3435
3436#[derive(Diagnostic)]
3437#[diag(parse_invalid_offset_of)]
3438pub(crate) struct InvalidOffsetOf(#[primary_span] pub Span);
3439
3440#[derive(Diagnostic)]
3441#[diag(parse_async_impl)]
3442pub(crate) struct AsyncImpl {
3443    #[primary_span]
3444    pub span: Span,
3445}
3446
3447#[derive(Diagnostic)]
3448#[diag(parse_expr_rarrow_call)]
3449#[help]
3450pub(crate) struct ExprRArrowCall {
3451    #[primary_span]
3452    #[suggestion(style = "verbose", applicability = "machine-applicable", code = ".")]
3453    pub span: Span,
3454}
3455
3456#[derive(Diagnostic)]
3457#[diag(parse_dot_dot_range_attribute)]
3458pub(crate) struct DotDotRangeAttribute {
3459    #[primary_span]
3460    pub span: Span,
3461}
3462
3463#[derive(Diagnostic)]
3464#[diag(parse_invalid_attr_unsafe)]
3465#[note]
3466pub(crate) struct InvalidAttrUnsafe {
3467    #[primary_span]
3468    #[label]
3469    pub span: Span,
3470    pub name: Path,
3471}
3472
3473#[derive(Diagnostic)]
3474#[diag(parse_unsafe_attr_outside_unsafe)]
3475pub(crate) struct UnsafeAttrOutsideUnsafe {
3476    #[primary_span]
3477    #[label]
3478    pub span: Span,
3479    #[subdiagnostic]
3480    pub suggestion: UnsafeAttrOutsideUnsafeSuggestion,
3481}
3482
3483#[derive(Subdiagnostic)]
3484#[multipart_suggestion(
3485    parse_unsafe_attr_outside_unsafe_suggestion,
3486    applicability = "machine-applicable"
3487)]
3488pub(crate) struct UnsafeAttrOutsideUnsafeSuggestion {
3489    #[suggestion_part(code = "unsafe(")]
3490    pub left: Span,
3491    #[suggestion_part(code = ")")]
3492    pub right: Span,
3493}
3494
3495#[derive(Diagnostic)]
3496#[diag(parse_binder_before_modifiers)]
3497pub(crate) struct BinderBeforeModifiers {
3498    #[primary_span]
3499    pub binder_span: Span,
3500    #[label]
3501    pub modifiers_span: Span,
3502}
3503
3504#[derive(Diagnostic)]
3505#[diag(parse_binder_and_polarity)]
3506pub(crate) struct BinderAndPolarity {
3507    #[primary_span]
3508    pub polarity_span: Span,
3509    #[label]
3510    pub binder_span: Span,
3511    pub polarity: &'static str,
3512}
3513
3514#[derive(Diagnostic)]
3515#[diag(parse_modifiers_and_polarity)]
3516pub(crate) struct PolarityAndModifiers {
3517    #[primary_span]
3518    pub polarity_span: Span,
3519    #[label]
3520    pub modifiers_span: Span,
3521    pub polarity: &'static str,
3522    pub modifiers_concatenated: String,
3523}
3524
3525#[derive(Diagnostic)]
3526#[diag(parse_incorrect_type_on_self)]
3527pub(crate) struct IncorrectTypeOnSelf {
3528    #[primary_span]
3529    pub span: Span,
3530    #[subdiagnostic]
3531    pub move_self_modifier: MoveSelfModifier,
3532}
3533
3534#[derive(Subdiagnostic)]
3535#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
3536pub(crate) struct MoveSelfModifier {
3537    #[suggestion_part(code = "")]
3538    pub removal_span: Span,
3539    #[suggestion_part(code = "{modifier}")]
3540    pub insertion_span: Span,
3541    pub modifier: String,
3542}
3543
3544#[derive(Diagnostic)]
3545#[diag(parse_asm_unsupported_operand)]
3546pub(crate) struct AsmUnsupportedOperand<'a> {
3547    #[primary_span]
3548    #[label]
3549    pub(crate) span: Span,
3550    pub(crate) symbol: &'a str,
3551    pub(crate) macro_name: &'static str,
3552}
3553
3554#[derive(Diagnostic)]
3555#[diag(parse_asm_underscore_input)]
3556pub(crate) struct AsmUnderscoreInput {
3557    #[primary_span]
3558    pub(crate) span: Span,
3559}
3560
3561#[derive(Diagnostic)]
3562#[diag(parse_asm_sym_no_path)]
3563pub(crate) struct AsmSymNoPath {
3564    #[primary_span]
3565    pub(crate) span: Span,
3566}
3567
3568#[derive(Diagnostic)]
3569#[diag(parse_asm_requires_template)]
3570pub(crate) struct AsmRequiresTemplate {
3571    #[primary_span]
3572    pub(crate) span: Span,
3573}
3574
3575#[derive(Diagnostic)]
3576#[diag(parse_asm_expected_comma)]
3577pub(crate) struct AsmExpectedComma {
3578    #[primary_span]
3579    #[label]
3580    pub(crate) span: Span,
3581}
3582
3583#[derive(Diagnostic)]
3584#[diag(parse_asm_expected_other)]
3585pub(crate) struct AsmExpectedOther {
3586    #[primary_span]
3587    #[label(parse_asm_expected_other)]
3588    pub(crate) span: Span,
3589    pub(crate) is_inline_asm: bool,
3590}
3591
3592#[derive(Diagnostic)]
3593#[diag(parse_asm_non_abi)]
3594pub(crate) struct NonABI {
3595    #[primary_span]
3596    pub(crate) span: Span,
3597}
3598
3599#[derive(Diagnostic)]
3600#[diag(parse_asm_expected_string_literal)]
3601pub(crate) struct AsmExpectedStringLiteral {
3602    #[primary_span]
3603    #[label]
3604    pub(crate) span: Span,
3605}
3606
3607#[derive(Diagnostic)]
3608#[diag(parse_asm_expected_register_class_or_explicit_register)]
3609pub(crate) struct ExpectedRegisterClassOrExplicitRegister {
3610    #[primary_span]
3611    pub(crate) span: Span,
3612}