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