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}
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy