1 use rustc_ast::token::Token;
2 use rustc_ast::{Path, Visibility};
3 use rustc_errors::{fluent, AddToDiagnostic, Applicability, EmissionGuarantee, IntoDiagnostic};
4 use rustc_macros::{Diagnostic, Subdiagnostic};
5 use rustc_session::errors::ExprParenthesesNeeded;
6 use rustc_span::edition::{Edition, LATEST_STABLE_EDITION};
7 use rustc_span::symbol::Ident;
8 use rustc_span::{Span, Symbol};
10 use crate::parser::TokenDescription;
13 #[diag(parse_maybe_report_ambiguous_plus)]
14 pub(crate) struct AmbiguousPlus {
17 #[suggestion(code = "({sum_ty})")]
22 #[diag(parse_maybe_recover_from_bad_type_plus, code = "E0178")]
23 pub(crate) struct BadTypePlus {
28 pub sub: BadTypePlusSub,
31 #[derive(Subdiagnostic)]
32 pub(crate) enum BadTypePlusSub {
35 code = "{sum_with_parens}",
36 applicability = "machine-applicable"
39 sum_with_parens: String,
43 #[label(parse_forgot_paren)]
48 #[label(parse_expect_path)]
56 #[diag(parse_maybe_recover_from_bad_qpath_stage_2)]
57 pub(crate) struct BadQPathStage2 {
59 #[suggestion(code = "", applicability = "maybe-incorrect")]
65 #[diag(parse_incorrect_semicolon)]
66 pub(crate) struct IncorrectSemicolon<'a> {
68 #[suggestion(style = "short", code = "", applicability = "machine-applicable")]
71 pub opt_help: Option<()>,
76 #[diag(parse_incorrect_use_of_await)]
77 pub(crate) struct IncorrectUseOfAwait {
79 #[suggestion(parentheses_suggestion, code = "", applicability = "machine-applicable")]
84 #[diag(parse_incorrect_use_of_await)]
85 pub(crate) struct IncorrectAwait {
88 #[suggestion(postfix_suggestion, code = "{expr}.await{question_mark}")]
89 pub sugg_span: (Span, Applicability),
91 pub question_mark: &'static str,
95 #[diag(parse_in_in_typo)]
96 pub(crate) struct InInTypo {
99 #[suggestion(code = "", applicability = "machine-applicable")]
103 #[derive(Diagnostic)]
104 #[diag(parse_invalid_variable_declaration)]
105 pub(crate) struct InvalidVariableDeclaration {
109 pub sub: InvalidVariableDeclarationSub,
112 #[derive(Subdiagnostic)]
113 pub(crate) enum InvalidVariableDeclarationSub {
114 #[suggestion(parse_switch_mut_let_order, applicability = "maybe-incorrect", code = "let mut")]
115 SwitchMutLetOrder(#[primary_span] Span),
117 parse_missing_let_before_mut,
118 applicability = "machine-applicable",
121 MissingLet(#[primary_span] Span),
122 #[suggestion(parse_use_let_not_auto, applicability = "machine-applicable", code = "let")]
123 UseLetNotAuto(#[primary_span] Span),
124 #[suggestion(parse_use_let_not_var, applicability = "machine-applicable", code = "let")]
125 UseLetNotVar(#[primary_span] Span),
128 #[derive(Diagnostic)]
129 #[diag(parse_invalid_comparison_operator)]
130 pub(crate) struct InvalidComparisonOperator {
135 pub sub: InvalidComparisonOperatorSub,
138 #[derive(Subdiagnostic)]
139 pub(crate) enum InvalidComparisonOperatorSub {
143 applicability = "machine-applicable",
152 #[label(spaceship_operator_invalid)]
153 Spaceship(#[primary_span] Span),
156 #[derive(Diagnostic)]
157 #[diag(parse_invalid_logical_operator)]
159 pub(crate) struct InvalidLogicalOperator {
162 pub incorrect: String,
164 pub sub: InvalidLogicalOperatorSub,
167 #[derive(Subdiagnostic)]
168 pub(crate) enum InvalidLogicalOperatorSub {
170 use_amp_amp_for_conjunction,
172 applicability = "machine-applicable",
175 Conjunction(#[primary_span] Span),
177 use_pipe_pipe_for_disjunction,
179 applicability = "machine-applicable",
182 Disjunction(#[primary_span] Span),
185 #[derive(Diagnostic)]
186 #[diag(parse_tilde_is_not_unary_operator)]
187 pub(crate) struct TildeAsUnaryOperator(
189 #[suggestion(style = "short", applicability = "machine-applicable", code = "!")]
193 #[derive(Diagnostic)]
194 #[diag(parse_unexpected_token_after_not)]
195 pub(crate) struct NotAsNegationOperator {
198 pub negated_desc: String,
200 pub sub: NotAsNegationOperatorSub,
203 #[derive(Subdiagnostic)]
204 pub enum NotAsNegationOperatorSub {
206 parse_unexpected_token_after_not_default,
208 applicability = "machine-applicable",
211 SuggestNotDefault(#[primary_span] Span),
214 parse_unexpected_token_after_not_bitwise,
216 applicability = "machine-applicable",
219 SuggestNotBitwise(#[primary_span] Span),
222 parse_unexpected_token_after_not_logical,
224 applicability = "machine-applicable",
227 SuggestNotLogical(#[primary_span] Span),
230 #[derive(Diagnostic)]
231 #[diag(parse_malformed_loop_label)]
232 pub(crate) struct MalformedLoopLabel {
234 #[suggestion(applicability = "machine-applicable", code = "{correct_label}")]
236 pub correct_label: Ident,
239 #[derive(Diagnostic)]
240 #[diag(parse_lifetime_in_borrow_expression)]
241 pub(crate) struct LifetimeInBorrowExpression {
244 #[suggestion(applicability = "machine-applicable", code = "")]
246 pub lifetime_span: Span,
249 #[derive(Diagnostic)]
250 #[diag(parse_field_expression_with_generic)]
251 pub(crate) struct FieldExpressionWithGeneric(#[primary_span] pub Span);
253 #[derive(Diagnostic)]
254 #[diag(parse_macro_invocation_with_qualified_path)]
255 pub(crate) struct MacroInvocationWithQualifiedPath(#[primary_span] pub Span);
257 #[derive(Diagnostic)]
258 #[diag(parse_unexpected_token_after_label)]
259 pub(crate) struct UnexpectedTokenAfterLabel {
261 #[label(parse_unexpected_token_after_label)]
263 #[suggestion(suggestion_remove_label, style = "verbose", code = "")]
264 pub remove_label: Option<Span>,
266 pub enclose_in_block: Option<UnexpectedTokenAfterLabelSugg>,
269 #[derive(Subdiagnostic)]
270 #[multipart_suggestion(suggestion_enclose_in_block, applicability = "machine-applicable")]
271 pub(crate) struct UnexpectedTokenAfterLabelSugg {
272 #[suggestion_part(code = "{{ ")]
274 #[suggestion_part(code = " }}")]
278 #[derive(Diagnostic)]
279 #[diag(parse_require_colon_after_labeled_expression)]
281 pub(crate) struct RequireColonAfterLabeledExpression {
286 #[suggestion(style = "short", applicability = "machine-applicable", code = ": ")]
290 #[derive(Diagnostic)]
291 #[diag(parse_do_catch_syntax_removed)]
293 pub(crate) struct DoCatchSyntaxRemoved {
295 #[suggestion(applicability = "machine-applicable", code = "try")]
299 #[derive(Diagnostic)]
300 #[diag(parse_float_literal_requires_integer_part)]
301 pub(crate) struct FloatLiteralRequiresIntegerPart {
303 #[suggestion(applicability = "machine-applicable", code = "{correct}")]
308 #[derive(Diagnostic)]
309 #[diag(parse_missing_semicolon_before_array)]
310 pub(crate) struct MissingSemicolonBeforeArray {
312 pub open_delim: Span,
313 #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = ";")]
317 #[derive(Diagnostic)]
318 #[diag(parse_expect_dotdot_not_dotdotdot)]
319 pub(crate) struct MissingDotDot {
321 pub token_span: Span,
322 #[suggestion(applicability = "maybe-incorrect", code = "..", style = "verbose")]
326 #[derive(Diagnostic)]
327 #[diag(parse_invalid_block_macro_segment)]
328 pub(crate) struct InvalidBlockMacroSegment {
335 #[derive(Diagnostic)]
336 #[diag(parse_if_expression_missing_then_block)]
337 pub(crate) struct IfExpressionMissingThenBlock {
341 pub missing_then_block_sub: IfExpressionMissingThenBlockSub,
343 pub let_else_sub: Option<IfExpressionLetSomeSub>,
346 #[derive(Subdiagnostic)]
347 pub(crate) enum IfExpressionMissingThenBlockSub {
348 #[help(condition_possibly_unfinished)]
349 UnfinishedCondition(#[primary_span] Span),
350 #[help(add_then_block)]
351 AddThenBlock(#[primary_span] Span),
354 #[derive(Subdiagnostic)]
355 #[suggestion(parse_extra_if_in_let_else, applicability = "maybe-incorrect", code = "")]
356 pub(crate) struct IfExpressionLetSomeSub {
361 #[derive(Diagnostic)]
362 #[diag(parse_if_expression_missing_condition)]
363 pub(crate) struct IfExpressionMissingCondition {
365 #[label(condition_label)]
367 #[label(block_label)]
368 pub block_span: Span,
371 #[derive(Diagnostic)]
372 #[diag(parse_expected_expression_found_let)]
373 pub(crate) struct ExpectedExpressionFoundLet {
378 #[derive(Diagnostic)]
379 #[diag(parse_expect_eq_instead_of_eqeq)]
380 pub(crate) struct ExpectedEqForLetExpr {
383 #[suggestion(applicability = "maybe-incorrect", code = "=", style = "verbose")]
387 #[derive(Diagnostic)]
388 #[diag(parse_expected_else_block)]
389 pub(crate) struct ExpectedElseBlock {
391 pub first_tok_span: Span,
392 pub first_tok: String,
395 #[suggestion(applicability = "maybe-incorrect", code = "if ")]
396 pub condition_start: Span,
399 #[derive(Diagnostic)]
400 #[diag(parse_outer_attribute_not_allowed_on_if_else)]
401 pub(crate) struct OuterAttributeNotAllowedOnIfElse {
405 #[label(branch_label)]
406 pub branch_span: Span,
412 #[suggestion(applicability = "machine-applicable", code = "")]
413 pub attributes: Span,
416 #[derive(Diagnostic)]
417 #[diag(parse_missing_in_in_for_loop)]
418 pub(crate) struct MissingInInForLoop {
422 pub sub: MissingInInForLoopSub,
425 #[derive(Subdiagnostic)]
426 pub(crate) enum MissingInInForLoopSub {
427 // Has been misleading, at least in the past (closed Issue #48492), thus maybe-incorrect
428 #[suggestion(use_in_not_of, style = "short", applicability = "maybe-incorrect", code = "in")]
429 InNotOf(#[primary_span] Span),
430 #[suggestion(add_in, style = "short", applicability = "maybe-incorrect", code = " in ")]
431 AddIn(#[primary_span] Span),
434 #[derive(Diagnostic)]
435 #[diag(parse_missing_comma_after_match_arm)]
436 pub(crate) struct MissingCommaAfterMatchArm {
438 #[suggestion(applicability = "machine-applicable", code = ",")]
442 #[derive(Diagnostic)]
443 #[diag(parse_catch_after_try)]
445 pub(crate) struct CatchAfterTry {
450 #[derive(Diagnostic)]
451 #[diag(parse_comma_after_base_struct)]
453 pub(crate) struct CommaAfterBaseStruct {
456 #[suggestion(style = "short", applicability = "machine-applicable", code = "")]
460 #[derive(Diagnostic)]
461 #[diag(parse_eq_field_init)]
462 pub(crate) struct EqFieldInit {
465 #[suggestion(applicability = "machine-applicable", code = ":")]
469 #[derive(Diagnostic)]
470 #[diag(parse_dotdotdot)]
471 pub(crate) struct DotDotDot {
473 #[suggestion(suggest_exclusive_range, applicability = "maybe-incorrect", code = "..")]
474 #[suggestion(suggest_inclusive_range, applicability = "maybe-incorrect", code = "..=")]
478 #[derive(Diagnostic)]
479 #[diag(parse_left_arrow_operator)]
480 pub(crate) struct LeftArrowOperator {
482 #[suggestion(applicability = "maybe-incorrect", code = "< -")]
486 #[derive(Diagnostic)]
487 #[diag(parse_remove_let)]
488 pub(crate) struct RemoveLet {
490 #[suggestion(applicability = "machine-applicable", code = "")]
494 #[derive(Diagnostic)]
495 #[diag(parse_use_eq_instead)]
496 pub(crate) struct UseEqInstead {
498 #[suggestion(style = "short", applicability = "machine-applicable", code = "=")]
502 #[derive(Diagnostic)]
503 #[diag(parse_use_empty_block_not_semi)]
504 pub(crate) struct UseEmptyBlockNotSemi {
506 #[suggestion(style = "hidden", applicability = "machine-applicable", code = "{{}}")]
510 #[derive(Diagnostic)]
511 #[diag(parse_comparison_interpreted_as_generic)]
512 pub(crate) struct ComparisonInterpretedAsGeneric {
514 #[label(label_comparison)]
515 pub comparison: Span,
520 pub suggestion: ComparisonOrShiftInterpretedAsGenericSugg,
523 #[derive(Diagnostic)]
524 #[diag(parse_shift_interpreted_as_generic)]
525 pub(crate) struct ShiftInterpretedAsGeneric {
527 #[label(label_comparison)]
533 pub suggestion: ComparisonOrShiftInterpretedAsGenericSugg,
536 #[derive(Subdiagnostic)]
537 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
538 pub(crate) struct ComparisonOrShiftInterpretedAsGenericSugg {
539 #[suggestion_part(code = "(")]
541 #[suggestion_part(code = ")")]
545 #[derive(Diagnostic)]
546 #[diag(parse_found_expr_would_be_stmt)]
547 pub(crate) struct FoundExprWouldBeStmt {
553 pub suggestion: ExprParenthesesNeeded,
556 #[derive(Diagnostic)]
557 #[diag(parse_leading_plus_not_supported)]
558 pub(crate) struct LeadingPlusNotSupported {
563 suggestion_remove_plus,
566 applicability = "machine-applicable"
568 pub remove_plus: Option<Span>,
570 pub add_parentheses: Option<ExprParenthesesNeeded>,
573 #[derive(Diagnostic)]
574 #[diag(parse_parentheses_with_struct_fields)]
575 pub(crate) struct ParenthesesWithStructFields {
580 pub braces_for_struct: BracesForStructLiteral,
582 pub no_fields_for_fn: NoFieldsForFnCall,
585 #[derive(Subdiagnostic)]
586 #[multipart_suggestion(suggestion_braces_for_struct, applicability = "maybe-incorrect")]
587 pub(crate) struct BracesForStructLiteral {
588 #[suggestion_part(code = " {{ ")]
590 #[suggestion_part(code = " }}")]
594 #[derive(Subdiagnostic)]
595 #[multipart_suggestion(suggestion_no_fields_for_fn, applicability = "maybe-incorrect")]
596 pub(crate) struct NoFieldsForFnCall {
597 #[suggestion_part(code = "")]
598 pub fields: Vec<Span>,
601 #[derive(Diagnostic)]
602 #[diag(parse_labeled_loop_in_break)]
603 pub(crate) struct LabeledLoopInBreak {
607 pub sub: WrapExpressionInParentheses,
610 #[derive(Subdiagnostic)]
611 #[multipart_suggestion(
612 parse_sugg_wrap_expression_in_parentheses,
613 applicability = "machine-applicable"
615 pub(crate) struct WrapExpressionInParentheses {
616 #[suggestion_part(code = "(")]
618 #[suggestion_part(code = ")")]
622 #[derive(Diagnostic)]
623 #[diag(parse_array_brackets_instead_of_braces)]
624 pub(crate) struct ArrayBracketsInsteadOfSpaces {
628 pub sub: ArrayBracketsInsteadOfSpacesSugg,
631 #[derive(Subdiagnostic)]
632 #[multipart_suggestion(suggestion, applicability = "maybe-incorrect")]
633 pub(crate) struct ArrayBracketsInsteadOfSpacesSugg {
634 #[suggestion_part(code = "[")]
636 #[suggestion_part(code = "]")]
640 #[derive(Diagnostic)]
641 #[diag(parse_match_arm_body_without_braces)]
642 pub(crate) struct MatchArmBodyWithoutBraces {
644 #[label(label_statements)]
645 pub statements: Span,
646 #[label(label_arrow)]
648 pub num_statements: usize,
650 pub sub: MatchArmBodyWithoutBracesSugg,
653 #[derive(Diagnostic)]
654 #[diag(parse_inclusive_range_extra_equals)]
656 pub(crate) struct InclusiveRangeExtraEquals {
659 suggestion_remove_eq,
662 applicability = "maybe-incorrect"
667 #[derive(Diagnostic)]
668 #[diag(parse_inclusive_range_match_arrow)]
669 pub(crate) struct InclusiveRangeMatchArrow {
673 suggestion_add_space,
676 applicability = "machine-applicable"
681 #[derive(Diagnostic)]
682 #[diag(parse_inclusive_range_no_end, code = "E0586")]
684 pub(crate) struct InclusiveRangeNoEnd {
687 suggestion_open_range,
689 applicability = "machine-applicable",
695 #[derive(Subdiagnostic)]
696 pub(crate) enum MatchArmBodyWithoutBracesSugg {
697 #[multipart_suggestion(suggestion_add_braces, applicability = "machine-applicable")]
699 #[suggestion_part(code = "{{ ")]
701 #[suggestion_part(code = " }}")]
705 suggestion_use_comma_not_semicolon,
707 applicability = "machine-applicable"
715 #[derive(Diagnostic)]
716 #[diag(parse_struct_literal_not_allowed_here)]
717 pub(crate) struct StructLiteralNotAllowedHere {
721 pub sub: StructLiteralNotAllowedHereSugg,
724 #[derive(Subdiagnostic)]
725 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
726 pub(crate) struct StructLiteralNotAllowedHereSugg {
727 #[suggestion_part(code = "(")]
729 #[suggestion_part(code = ")")]
733 #[derive(Diagnostic)]
734 #[diag(parse_invalid_interpolated_expression)]
735 pub(crate) struct InvalidInterpolatedExpression {
740 #[derive(Diagnostic)]
741 #[diag(parse_invalid_literal_suffix_on_tuple_index)]
742 pub(crate) struct InvalidLiteralSuffixOnTupleIndex {
747 #[help(tuple_exception_line_1)]
748 #[help(tuple_exception_line_2)]
749 #[help(tuple_exception_line_3)]
750 pub exception: Option<()>,
753 #[derive(Diagnostic)]
754 #[diag(parse_non_string_abi_literal)]
755 pub(crate) struct NonStringAbiLiteral {
757 #[suggestion(code = "\"C\"", applicability = "maybe-incorrect")]
761 #[derive(Diagnostic)]
762 #[diag(parse_mismatched_closing_delimiter)]
763 pub(crate) struct MismatchedClosingDelimiter {
765 pub spans: Vec<Span>,
766 pub delimiter: String,
767 #[label(label_unmatched)]
769 #[label(label_opening_candidate)]
770 pub opening_candidate: Option<Span>,
771 #[label(label_unclosed)]
772 pub unclosed: Option<Span>,
775 #[derive(Diagnostic)]
776 #[diag(parse_incorrect_visibility_restriction, code = "E0704")]
778 pub(crate) struct IncorrectVisibilityRestriction {
780 #[suggestion(code = "in {inner_str}", applicability = "machine-applicable")]
782 pub inner_str: String,
785 #[derive(Diagnostic)]
786 #[diag(parse_assignment_else_not_allowed)]
787 pub(crate) struct AssignmentElseNotAllowed {
792 #[derive(Diagnostic)]
793 #[diag(parse_expected_statement_after_outer_attr)]
794 pub(crate) struct ExpectedStatementAfterOuterAttr {
799 #[derive(Diagnostic)]
800 #[diag(parse_doc_comment_does_not_document_anything, code = "E0585")]
802 pub(crate) struct DocCommentDoesNotDocumentAnything {
805 #[suggestion(code = ",", applicability = "machine-applicable")]
806 pub missing_comma: Option<Span>,
809 #[derive(Diagnostic)]
810 #[diag(parse_const_let_mutually_exclusive)]
811 pub(crate) struct ConstLetMutuallyExclusive {
813 #[suggestion(code = "const", applicability = "maybe-incorrect")]
817 #[derive(Diagnostic)]
818 #[diag(parse_invalid_expression_in_let_else)]
819 pub(crate) struct InvalidExpressionInLetElse {
822 pub operator: &'static str,
824 pub sugg: WrapExpressionInParentheses,
827 #[derive(Diagnostic)]
828 #[diag(parse_invalid_curly_in_let_else)]
829 pub(crate) struct InvalidCurlyInLetElse {
833 pub sugg: WrapExpressionInParentheses,
836 #[derive(Diagnostic)]
837 #[diag(parse_compound_assignment_expression_in_let)]
839 pub(crate) struct CompoundAssignmentExpressionInLet {
841 #[suggestion(style = "short", code = "=", applicability = "maybe-incorrect")]
845 #[derive(Diagnostic)]
846 #[diag(parse_suffixed_literal_in_attribute)]
848 pub(crate) struct SuffixedLiteralInAttribute {
853 #[derive(Diagnostic)]
854 #[diag(parse_invalid_meta_item)]
855 pub(crate) struct InvalidMetaItem {
861 #[derive(Subdiagnostic)]
863 parse_sugg_escape_to_use_as_identifier,
865 applicability = "maybe-incorrect",
868 pub(crate) struct SuggEscapeToUseAsIdentifier {
871 pub ident_name: String,
874 #[derive(Subdiagnostic)]
875 #[suggestion(parse_sugg_remove_comma, applicability = "machine-applicable", code = "")]
876 pub(crate) struct SuggRemoveComma {
881 #[derive(Subdiagnostic)]
882 pub(crate) enum ExpectedIdentifierFound {
883 #[label(parse_expected_identifier_found_reserved_identifier)]
884 ReservedIdentifier(#[primary_span] Span),
885 #[label(parse_expected_identifier_found_keyword)]
886 Keyword(#[primary_span] Span),
887 #[label(parse_expected_identifier_found_reserved_keyword)]
888 ReservedKeyword(#[primary_span] Span),
889 #[label(parse_expected_identifier_found_doc_comment)]
890 DocComment(#[primary_span] Span),
891 #[label(parse_expected_identifier)]
892 Other(#[primary_span] Span),
895 impl ExpectedIdentifierFound {
896 pub fn new(token_descr: Option<TokenDescription>, span: Span) -> Self {
898 Some(TokenDescription::ReservedIdentifier) => {
899 ExpectedIdentifierFound::ReservedIdentifier
901 Some(TokenDescription::Keyword) => ExpectedIdentifierFound::Keyword,
902 Some(TokenDescription::ReservedKeyword) => ExpectedIdentifierFound::ReservedKeyword,
903 Some(TokenDescription::DocComment) => ExpectedIdentifierFound::DocComment,
904 None => ExpectedIdentifierFound::Other,
909 pub(crate) struct ExpectedIdentifier {
912 pub suggest_raw: Option<SuggEscapeToUseAsIdentifier>,
913 pub suggest_remove_comma: Option<SuggRemoveComma>,
916 impl<'a, G: EmissionGuarantee> IntoDiagnostic<'a, G> for ExpectedIdentifier {
920 handler: &'a rustc_errors::Handler,
921 ) -> rustc_errors::DiagnosticBuilder<'a, G> {
922 let token_descr = super::parser::TokenDescription::from_token(&self.token);
924 let mut diag = handler.struct_diagnostic(match token_descr {
925 Some(TokenDescription::ReservedIdentifier) => {
926 fluent::parse_expected_identifier_found_reserved_identifier_str
928 Some(TokenDescription::Keyword) => fluent::parse_expected_identifier_found_keyword_str,
929 Some(TokenDescription::ReservedKeyword) => {
930 fluent::parse_expected_identifier_found_reserved_keyword_str
932 Some(TokenDescription::DocComment) => {
933 fluent::parse_expected_identifier_found_doc_comment_str
935 None => fluent::parse_expected_identifier_found_str,
937 diag.set_span(self.span);
938 diag.set_arg("token", self.token);
940 if let Some(sugg) = self.suggest_raw {
941 sugg.add_to_diagnostic(&mut diag);
944 ExpectedIdentifierFound::new(token_descr, self.span).add_to_diagnostic(&mut diag);
946 if let Some(sugg) = self.suggest_remove_comma {
947 sugg.add_to_diagnostic(&mut diag);
954 pub(crate) struct ExpectedSemi {
958 pub unexpected_token_label: Option<Span>,
959 pub sugg: ExpectedSemiSugg,
962 impl<'a, G: EmissionGuarantee> IntoDiagnostic<'a, G> for ExpectedSemi {
966 handler: &'a rustc_errors::Handler,
967 ) -> rustc_errors::DiagnosticBuilder<'a, G> {
968 let token_descr = super::parser::TokenDescription::from_token(&self.token);
970 let mut diag = handler.struct_diagnostic(match token_descr {
971 Some(TokenDescription::ReservedIdentifier) => {
972 fluent::parse_expected_semi_found_reserved_identifier_str
974 Some(TokenDescription::Keyword) => fluent::parse_expected_semi_found_keyword_str,
975 Some(TokenDescription::ReservedKeyword) => {
976 fluent::parse_expected_semi_found_reserved_keyword_str
978 Some(TokenDescription::DocComment) => fluent::parse_expected_semi_found_doc_comment_str,
979 None => fluent::parse_expected_semi_found_str,
981 diag.set_span(self.span);
982 diag.set_arg("token", self.token);
984 if let Some(unexpected_token_label) = self.unexpected_token_label {
985 diag.span_label(unexpected_token_label, fluent::parse_label_unexpected_token);
988 self.sugg.add_to_diagnostic(&mut diag);
994 #[derive(Subdiagnostic)]
995 pub(crate) enum ExpectedSemiSugg {
996 #[suggestion(parse_sugg_change_this_to_semi, code = ";", applicability = "machine-applicable")]
997 ChangeToSemi(#[primary_span] Span),
1002 applicability = "machine-applicable"
1004 AddSemi(#[primary_span] Span),
1007 #[derive(Diagnostic)]
1008 #[diag(parse_struct_literal_body_without_path)]
1009 pub(crate) struct StructLiteralBodyWithoutPath {
1013 pub sugg: StructLiteralBodyWithoutPathSugg,
1016 #[derive(Subdiagnostic)]
1017 #[multipart_suggestion(suggestion, applicability = "has-placeholders")]
1018 pub(crate) struct StructLiteralBodyWithoutPathSugg {
1019 #[suggestion_part(code = "{{ SomeStruct ")]
1021 #[suggestion_part(code = " }}")]
1025 #[derive(Diagnostic)]
1026 #[diag(parse_struct_literal_needing_parens)]
1027 pub(crate) struct StructLiteralNeedingParens {
1031 pub sugg: StructLiteralNeedingParensSugg,
1034 #[derive(Subdiagnostic)]
1035 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1036 pub(crate) struct StructLiteralNeedingParensSugg {
1037 #[suggestion_part(code = "(")]
1039 #[suggestion_part(code = ")")]
1043 #[derive(Diagnostic)]
1044 #[diag(parse_unmatched_angle_brackets)]
1045 pub(crate) struct UnmatchedAngleBrackets {
1047 #[suggestion(code = "", applicability = "machine-applicable")]
1049 pub num_extra_brackets: usize,
1052 #[derive(Diagnostic)]
1053 #[diag(parse_generic_parameters_without_angle_brackets)]
1054 pub(crate) struct GenericParamsWithoutAngleBrackets {
1058 pub sugg: GenericParamsWithoutAngleBracketsSugg,
1061 #[derive(Subdiagnostic)]
1062 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1063 pub(crate) struct GenericParamsWithoutAngleBracketsSugg {
1064 #[suggestion_part(code = "<")]
1066 #[suggestion_part(code = ">")]
1070 #[derive(Diagnostic)]
1071 #[diag(parse_comparison_operators_cannot_be_chained)]
1072 pub(crate) struct ComparisonOperatorsCannotBeChained {
1074 pub span: Vec<Span>,
1076 parse_sugg_turbofish_syntax,
1079 applicability = "maybe-incorrect"
1081 pub suggest_turbofish: Option<Span>,
1082 #[help(parse_sugg_turbofish_syntax)]
1083 #[help(sugg_parentheses_for_function_args)]
1084 pub help_turbofish: Option<()>,
1086 pub chaining_sugg: Option<ComparisonOperatorsCannotBeChainedSugg>,
1089 #[derive(Subdiagnostic)]
1090 pub(crate) enum ComparisonOperatorsCannotBeChainedSugg {
1092 sugg_split_comparison,
1094 code = " && {middle_term}",
1095 applicability = "maybe-incorrect"
1100 middle_term: String,
1102 #[multipart_suggestion(sugg_parenthesize, applicability = "maybe-incorrect")]
1104 #[suggestion_part(code = "(")]
1106 #[suggestion_part(code = ")")]
1111 #[derive(Diagnostic)]
1112 #[diag(parse_question_mark_in_type)]
1113 pub(crate) struct QuestionMarkInType {
1118 pub sugg: QuestionMarkInTypeSugg,
1121 #[derive(Subdiagnostic)]
1122 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1123 pub(crate) struct QuestionMarkInTypeSugg {
1124 #[suggestion_part(code = "Option<")]
1126 #[suggestion_part(code = ">")]
1130 #[derive(Diagnostic)]
1131 #[diag(parse_unexpected_parentheses_in_for_head)]
1132 pub(crate) struct ParenthesesInForHead {
1134 pub span: Vec<Span>,
1136 pub sugg: ParenthesesInForHeadSugg,
1139 #[derive(Subdiagnostic)]
1140 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1141 pub(crate) struct ParenthesesInForHeadSugg {
1142 #[suggestion_part(code = "{left_snippet}")]
1144 pub left_snippet: String,
1145 #[suggestion_part(code = "{right_snippet}")]
1147 pub right_snippet: String,
1150 #[derive(Diagnostic)]
1151 #[diag(parse_doc_comment_on_param_type)]
1152 pub(crate) struct DocCommentOnParamType {
1158 #[derive(Diagnostic)]
1159 #[diag(parse_attribute_on_param_type)]
1160 pub(crate) struct AttributeOnParamType {
1166 #[derive(Diagnostic)]
1167 #[diag(parse_pattern_method_param_without_body, code = "E0642")]
1168 pub(crate) struct PatternMethodParamWithoutBody {
1170 #[suggestion(code = "_", applicability = "machine-applicable")]
1174 #[derive(Diagnostic)]
1175 #[diag(parse_self_param_not_first)]
1176 pub(crate) struct SelfParamNotFirst {
1182 #[derive(Diagnostic)]
1183 #[diag(parse_invalid_identifier_with_leading_number)]
1184 pub(crate) struct InvalidIdentiferStartsWithNumber {
1190 #[derive(Diagnostic)]
1191 #[diag(parse_const_generic_without_braces)]
1192 pub(crate) struct ConstGenericWithoutBraces {
1196 pub sugg: ConstGenericWithoutBracesSugg,
1199 #[derive(Subdiagnostic)]
1200 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1201 pub(crate) struct ConstGenericWithoutBracesSugg {
1202 #[suggestion_part(code = "{{ ")]
1204 #[suggestion_part(code = " }}")]
1208 #[derive(Diagnostic)]
1209 #[diag(parse_unexpected_const_param_declaration)]
1210 pub(crate) struct UnexpectedConstParamDeclaration {
1215 pub sugg: Option<UnexpectedConstParamDeclarationSugg>,
1218 #[derive(Subdiagnostic)]
1219 pub(crate) enum UnexpectedConstParamDeclarationSugg {
1220 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1222 #[suggestion_part(code = "<{snippet}>")]
1223 impl_generics: Span,
1224 #[suggestion_part(code = "{ident}")]
1225 incorrect_decl: Span,
1229 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1231 #[suggestion_part(code = ", {snippet}")]
1232 impl_generics_end: Span,
1233 #[suggestion_part(code = "{ident}")]
1234 incorrect_decl: Span,
1240 #[derive(Diagnostic)]
1241 #[diag(parse_unexpected_const_in_generic_param)]
1242 pub(crate) struct UnexpectedConstInGenericParam {
1245 #[suggestion(style = "verbose", code = "", applicability = "maybe-incorrect")]
1246 pub to_remove: Option<Span>,
1249 #[derive(Diagnostic)]
1250 #[diag(parse_async_move_order_incorrect)]
1251 pub(crate) struct AsyncMoveOrderIncorrect {
1253 #[suggestion(style = "verbose", code = "async move", applicability = "maybe-incorrect")]
1257 #[derive(Diagnostic)]
1258 #[diag(parse_double_colon_in_bound)]
1259 pub(crate) struct DoubleColonInBound {
1262 #[suggestion(code = ": ", applicability = "machine-applicable")]
1266 #[derive(Diagnostic)]
1267 #[diag(parse_fn_ptr_with_generics)]
1268 pub(crate) struct FnPtrWithGenerics {
1272 pub sugg: Option<FnPtrWithGenericsSugg>,
1275 #[derive(Subdiagnostic)]
1276 #[multipart_suggestion(suggestion, applicability = "maybe-incorrect")]
1277 pub(crate) struct FnPtrWithGenericsSugg {
1278 #[suggestion_part(code = "{snippet}")]
1280 pub snippet: String,
1281 #[suggestion_part(code = "")]
1284 pub for_param_list_exists: bool,
1287 #[derive(Diagnostic)]
1288 #[diag(parse_unexpected_if_with_if)]
1289 pub(crate) struct UnexpectedIfWithIf(
1291 #[suggestion(applicability = "machine-applicable", code = " ", style = "verbose")]
1295 #[derive(Diagnostic)]
1296 #[diag(parse_maybe_fn_typo_with_impl)]
1297 pub(crate) struct FnTypoWithImpl {
1299 #[suggestion(applicability = "maybe-incorrect", code = "impl", style = "verbose")]
1303 #[derive(Diagnostic)]
1304 #[diag(parse_expected_fn_path_found_fn_keyword)]
1305 pub(crate) struct ExpectedFnPathFoundFnKeyword {
1307 #[suggestion(applicability = "machine-applicable", code = "Fn", style = "verbose")]
1308 pub fn_token_span: Span,
1311 #[derive(Diagnostic)]
1312 #[diag(parse_where_clause_before_tuple_struct_body)]
1313 pub(crate) struct WhereClauseBeforeTupleStructBody {
1317 #[label(name_label)]
1319 #[label(body_label)]
1322 pub sugg: Option<WhereClauseBeforeTupleStructBodySugg>,
1325 #[derive(Subdiagnostic)]
1326 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1327 pub(crate) struct WhereClauseBeforeTupleStructBodySugg {
1328 #[suggestion_part(code = "{snippet}")]
1330 pub snippet: String,
1331 #[suggestion_part(code = "")]
1335 #[derive(Diagnostic)]
1336 #[diag(parse_async_fn_in_2015, code = "E0670")]
1337 pub(crate) struct AsyncFnIn2015 {
1342 pub help: HelpUseLatestEdition,
1345 #[derive(Subdiagnostic)]
1346 #[label(parse_async_block_in_2015)]
1347 pub(crate) struct AsyncBlockIn2015 {
1352 #[derive(Diagnostic)]
1353 #[diag(parse_self_argument_pointer)]
1354 pub(crate) struct SelfArgumentPointer {
1360 #[derive(Diagnostic)]
1361 #[diag(parse_visibility_not_followed_by_item)]
1363 pub(crate) struct VisibilityNotFollowedByItem {
1367 pub vis: Visibility,
1370 #[derive(Diagnostic)]
1371 #[diag(parse_default_not_followed_by_item)]
1373 pub(crate) struct DefaultNotFollowedByItem {
1379 #[derive(Diagnostic)]
1380 pub(crate) enum MissingKeywordForItemDefinition {
1381 #[diag(parse_missing_struct_for_struct_definition)]
1384 #[suggestion(style = "short", applicability = "maybe-incorrect", code = " struct ")]
1388 #[diag(parse_missing_fn_for_function_definition)]
1391 #[suggestion(style = "short", applicability = "maybe-incorrect", code = " fn ")]
1395 #[diag(parse_missing_fn_for_method_definition)]
1398 #[suggestion(style = "short", applicability = "maybe-incorrect", code = " fn ")]
1402 #[diag(parse_ambiguous_missing_keyword_for_item_definition)]
1407 subdiag: Option<AmbiguousMissingKwForItemSub>,
1411 #[derive(Subdiagnostic)]
1412 pub(crate) enum AmbiguousMissingKwForItemSub {
1413 #[suggestion(suggestion, applicability = "maybe-incorrect", code = "{snippet}!")]
1423 #[derive(Diagnostic)]
1424 #[diag(parse_missing_trait_in_trait_impl)]
1425 pub(crate) struct MissingTraitInTraitImpl {
1427 #[suggestion(suggestion_add_trait, code = " Trait ", applicability = "has-placeholders")]
1429 #[suggestion(suggestion_remove_for, code = "", applicability = "maybe-incorrect")]
1433 #[derive(Diagnostic)]
1434 #[diag(parse_missing_for_in_trait_impl)]
1435 pub(crate) struct MissingForInTraitImpl {
1437 #[suggestion(style = "short", code = " for ", applicability = "machine-applicable")]
1441 #[derive(Diagnostic)]
1442 #[diag(parse_expected_trait_in_trait_impl_found_type)]
1443 pub(crate) struct ExpectedTraitInTraitImplFoundType {
1448 #[derive(Diagnostic)]
1449 #[diag(parse_bounds_not_allowed_on_trait_aliases)]
1450 pub(crate) struct BoundsNotAllowedOnTraitAliases {
1455 #[derive(Diagnostic)]
1456 #[diag(parse_trait_alias_cannot_be_auto)]
1457 pub(crate) struct TraitAliasCannotBeAuto {
1459 #[label(parse_trait_alias_cannot_be_auto)]
1463 #[derive(Diagnostic)]
1464 #[diag(parse_trait_alias_cannot_be_unsafe)]
1465 pub(crate) struct TraitAliasCannotBeUnsafe {
1467 #[label(parse_trait_alias_cannot_be_unsafe)]
1471 #[derive(Diagnostic)]
1472 #[diag(parse_associated_static_item_not_allowed)]
1473 pub(crate) struct AssociatedStaticItemNotAllowed {
1478 #[derive(Diagnostic)]
1479 #[diag(parse_extern_crate_name_with_dashes)]
1480 pub(crate) struct ExternCrateNameWithDashes {
1485 pub sugg: ExternCrateNameWithDashesSugg,
1488 #[derive(Subdiagnostic)]
1489 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1490 pub(crate) struct ExternCrateNameWithDashesSugg {
1491 #[suggestion_part(code = "_")]
1492 pub dashes: Vec<Span>,
1495 #[derive(Diagnostic)]
1496 #[diag(parse_extern_item_cannot_be_const)]
1498 pub(crate) struct ExternItemCannotBeConst {
1500 pub ident_span: Span,
1501 #[suggestion(code = "static ", applicability = "machine-applicable")]
1502 pub const_span: Span,
1505 #[derive(Diagnostic)]
1506 #[diag(parse_const_global_cannot_be_mutable)]
1507 pub(crate) struct ConstGlobalCannotBeMutable {
1510 pub ident_span: Span,
1511 #[suggestion(code = "static", applicability = "maybe-incorrect")]
1512 pub const_span: Span,
1515 #[derive(Diagnostic)]
1516 #[diag(parse_missing_const_type)]
1517 pub(crate) struct MissingConstType {
1519 #[suggestion(code = "{colon} <type>", applicability = "has-placeholders")]
1522 pub kind: &'static str,
1523 pub colon: &'static str,
1526 #[derive(Diagnostic)]
1527 #[diag(parse_enum_struct_mutually_exclusive)]
1528 pub(crate) struct EnumStructMutuallyExclusive {
1530 #[suggestion(code = "enum", applicability = "machine-applicable")]
1534 #[derive(Diagnostic)]
1535 pub(crate) enum UnexpectedTokenAfterStructName {
1536 #[diag(parse_unexpected_token_after_struct_name_found_reserved_identifier)]
1537 ReservedIdentifier {
1539 #[label(parse_unexpected_token_after_struct_name)]
1543 #[diag(parse_unexpected_token_after_struct_name_found_keyword)]
1546 #[label(parse_unexpected_token_after_struct_name)]
1550 #[diag(parse_unexpected_token_after_struct_name_found_reserved_keyword)]
1553 #[label(parse_unexpected_token_after_struct_name)]
1557 #[diag(parse_unexpected_token_after_struct_name_found_doc_comment)]
1560 #[label(parse_unexpected_token_after_struct_name)]
1564 #[diag(parse_unexpected_token_after_struct_name_found_other)]
1567 #[label(parse_unexpected_token_after_struct_name)]
1573 impl UnexpectedTokenAfterStructName {
1574 pub fn new(span: Span, token: Token) -> Self {
1575 match TokenDescription::from_token(&token) {
1576 Some(TokenDescription::ReservedIdentifier) => Self::ReservedIdentifier { span, token },
1577 Some(TokenDescription::Keyword) => Self::Keyword { span, token },
1578 Some(TokenDescription::ReservedKeyword) => Self::ReservedKeyword { span, token },
1579 Some(TokenDescription::DocComment) => Self::DocComment { span, token },
1580 None => Self::Other { span, token },
1585 #[derive(Diagnostic)]
1586 #[diag(parse_unexpected_self_in_generic_parameters)]
1588 pub(crate) struct UnexpectedSelfInGenericParameters {
1593 #[derive(Diagnostic)]
1594 #[diag(parse_multiple_where_clauses)]
1595 pub(crate) struct MultipleWhereClauses {
1600 #[suggestion(style = "verbose", code = ",", applicability = "maybe-incorrect")]
1604 #[derive(Diagnostic)]
1605 pub(crate) enum UnexpectedNonterminal {
1606 #[diag(parse_nonterminal_expected_item_keyword)]
1607 Item(#[primary_span] Span),
1608 #[diag(parse_nonterminal_expected_statement)]
1609 Statement(#[primary_span] Span),
1610 #[diag(parse_nonterminal_expected_ident)]
1616 #[diag(parse_nonterminal_expected_lifetime)]
1624 #[derive(Diagnostic)]
1625 pub(crate) enum TopLevelOrPatternNotAllowed {
1626 #[diag(parse_or_pattern_not_allowed_in_let_binding)]
1631 sub: Option<TopLevelOrPatternNotAllowedSugg>,
1633 #[diag(parse_or_pattern_not_allowed_in_fn_parameters)]
1638 sub: Option<TopLevelOrPatternNotAllowedSugg>,
1642 #[derive(Subdiagnostic)]
1643 pub(crate) enum TopLevelOrPatternNotAllowedSugg {
1645 parse_sugg_remove_leading_vert_in_pattern,
1647 applicability = "machine-applicable"
1655 parse_sugg_wrap_pattern_in_parens,
1657 applicability = "machine-applicable"
1666 #[derive(Diagnostic)]
1667 #[diag(parse_unexpected_vert_vert_before_function_parameter)]
1668 #[note(parse_note_pattern_alternatives_use_single_vert)]
1669 pub(crate) struct UnexpectedVertVertBeforeFunctionParam {
1671 #[suggestion(code = "", applicability = "machine-applicable")]
1675 #[derive(Diagnostic)]
1676 #[diag(parse_unexpected_vert_vert_in_pattern)]
1677 pub(crate) struct UnexpectedVertVertInPattern {
1679 #[suggestion(code = "|", applicability = "machine-applicable")]
1681 #[label(parse_label_while_parsing_or_pattern_here)]
1682 pub start: Option<Span>,
1685 #[derive(Diagnostic)]
1686 #[diag(parse_trailing_vert_not_allowed)]
1687 pub(crate) struct TrailingVertNotAllowed {
1689 #[suggestion(code = "", applicability = "machine-applicable")]
1691 #[label(parse_label_while_parsing_or_pattern_here)]
1692 pub start: Option<Span>,
1694 #[note(parse_note_pattern_alternatives_use_single_vert)]
1695 pub note_double_vert: Option<()>,
1698 #[derive(Diagnostic)]
1699 #[diag(parse_dotdotdot_rest_pattern)]
1700 pub(crate) struct DotDotDotRestPattern {
1702 #[suggestion(style = "short", code = "..", applicability = "machine-applicable")]
1707 #[derive(Diagnostic)]
1708 #[diag(parse_pattern_on_wrong_side_of_at)]
1709 pub(crate) struct PatternOnWrongSideOfAt {
1711 #[suggestion(code = "{whole_pat}", applicability = "machine-applicable")]
1712 pub whole_span: Span,
1713 pub whole_pat: String,
1714 #[label(label_pattern)]
1716 #[label(label_binding)]
1720 #[derive(Diagnostic)]
1721 #[diag(parse_expected_binding_left_of_at)]
1723 pub(crate) struct ExpectedBindingLeftOfAt {
1725 pub whole_span: Span,
1732 #[derive(Diagnostic)]
1733 #[diag(parse_ambiguous_range_pattern)]
1734 pub(crate) struct AmbiguousRangePattern {
1736 #[suggestion(code = "({pat})", applicability = "maybe-incorrect")]
1741 #[derive(Diagnostic)]
1742 #[diag(parse_unexpected_lifetime_in_pattern)]
1743 pub(crate) struct UnexpectedLifetimeInPattern {
1745 #[suggestion(code = "", applicability = "machine-applicable")]
1750 #[derive(Diagnostic)]
1751 #[diag(parse_ref_mut_order_incorrect)]
1752 pub(crate) struct RefMutOrderIncorrect {
1754 #[suggestion(code = "ref mut", applicability = "machine-applicable")]
1758 #[derive(Diagnostic)]
1759 pub(crate) enum InvalidMutInPattern {
1760 #[diag(parse_mut_on_nested_ident_pattern)]
1761 #[note(parse_note_mut_pattern_usage)]
1764 #[suggestion(code = "{pat}", applicability = "machine-applicable")]
1768 #[diag(parse_mut_on_non_ident_pattern)]
1769 #[note(parse_note_mut_pattern_usage)]
1772 #[suggestion(code = "{pat}", applicability = "machine-applicable")]
1778 #[derive(Diagnostic)]
1779 #[diag(parse_repeated_mut_in_pattern)]
1780 pub(crate) struct RepeatedMutInPattern {
1782 #[suggestion(code = "", applicability = "machine-applicable")]
1786 #[derive(Diagnostic)]
1787 #[diag(parse_dot_dot_dot_range_to_pattern_not_allowed)]
1788 pub(crate) struct DotDotDotRangeToPatternNotAllowed {
1790 #[suggestion(style = "short", code = "..=", applicability = "machine-applicable")]
1794 #[derive(Diagnostic)]
1795 #[diag(parse_enum_pattern_instead_of_identifier)]
1796 pub(crate) struct EnumPatternInsteadOfIdentifier {
1801 #[derive(Diagnostic)]
1802 #[diag(parse_dot_dot_dot_for_remaining_fields)]
1803 pub(crate) struct DotDotDotForRemainingFields {
1805 #[suggestion(code = "..", applicability = "machine-applicable")]
1809 #[derive(Diagnostic)]
1810 #[diag(parse_expected_comma_after_pattern_field)]
1811 pub(crate) struct ExpectedCommaAfterPatternField {
1816 #[derive(Diagnostic)]
1817 #[diag(parse_return_types_use_thin_arrow)]
1818 pub(crate) struct ReturnTypesUseThinArrow {
1820 #[suggestion(style = "short", code = "->", applicability = "machine-applicable")]
1824 #[derive(Diagnostic)]
1825 #[diag(parse_need_plus_after_trait_object_lifetime)]
1826 pub(crate) struct NeedPlusAfterTraitObjectLifetime {
1831 #[derive(Diagnostic)]
1832 #[diag(parse_expected_mut_or_const_in_raw_pointer_type)]
1833 pub(crate) struct ExpectedMutOrConstInRawPointerType {
1836 #[suggestion(code("mut ", "const "), applicability = "has-placeholders")]
1837 pub after_asterisk: Span,
1840 #[derive(Diagnostic)]
1841 #[diag(parse_lifetime_after_mut)]
1842 pub(crate) struct LifetimeAfterMut {
1845 #[suggestion(code = "&{snippet} mut", applicability = "maybe-incorrect")]
1846 pub suggest_lifetime: Option<Span>,
1847 pub snippet: String,
1850 #[derive(Diagnostic)]
1851 #[diag(parse_dyn_after_mut)]
1852 pub(crate) struct DynAfterMut {
1854 #[suggestion(code = "&mut dyn", applicability = "machine-applicable")]
1858 #[derive(Diagnostic)]
1859 #[diag(parse_fn_pointer_cannot_be_const)]
1860 pub(crate) struct FnPointerCannotBeConst {
1863 #[suggestion(code = "", applicability = "maybe-incorrect")]
1865 pub qualifier: Span,
1868 #[derive(Diagnostic)]
1869 #[diag(parse_fn_pointer_cannot_be_async)]
1870 pub(crate) struct FnPointerCannotBeAsync {
1873 #[suggestion(code = "", applicability = "maybe-incorrect")]
1875 pub qualifier: Span,
1878 #[derive(Diagnostic)]
1879 #[diag(parse_nested_c_variadic_type, code = "E0743")]
1880 pub(crate) struct NestedCVariadicType {
1885 #[derive(Diagnostic)]
1886 #[diag(parse_invalid_dyn_keyword)]
1888 pub(crate) struct InvalidDynKeyword {
1890 #[suggestion(code = "", applicability = "machine-applicable")]
1894 #[derive(Diagnostic)]
1895 #[diag(parse_negative_bounds_not_supported)]
1896 pub(crate) struct NegativeBoundsNotSupported {
1898 pub negative_bounds: Vec<Span>,
1900 pub last_span: Span,
1902 pub sub: Option<NegativeBoundsNotSupportedSugg>,
1905 #[derive(Subdiagnostic)]
1908 style = "tool-only",
1910 applicability = "machine-applicable"
1912 pub(crate) struct NegativeBoundsNotSupportedSugg {
1914 pub bound_list: Span,
1915 pub num_bounds: usize,
1919 #[derive(Subdiagnostic)]
1920 pub enum HelpUseLatestEdition {
1921 #[help(parse_help_set_edition_cargo)]
1922 #[note(parse_note_edition_guide)]
1923 Cargo { edition: Edition },
1924 #[help(parse_help_set_edition_standalone)]
1925 #[note(parse_note_edition_guide)]
1926 Standalone { edition: Edition },
1929 impl HelpUseLatestEdition {
1930 pub fn new() -> Self {
1931 let edition = LATEST_STABLE_EDITION;
1932 if std::env::var_os("CARGO").is_some() {
1933 Self::Cargo { edition }
1935 Self::Standalone { edition }