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