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