rustc_parse/
errors.rs

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