rustc_parse/
errors.rs

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

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

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


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy