3 use rustc_ast::token::Token;
4 use rustc_ast::{Path, Visibility};
5 use rustc_errors::{fluent, AddToDiagnostic, Applicability, EmissionGuarantee, IntoDiagnostic};
6 use rustc_macros::{Diagnostic, Subdiagnostic};
7 use rustc_session::errors::ExprParenthesesNeeded;
8 use rustc_span::edition::{Edition, LATEST_STABLE_EDITION};
9 use rustc_span::symbol::Ident;
10 use rustc_span::{Span, Symbol};
12 use crate::parser::TokenDescription;
15 #[diag(parse_maybe_report_ambiguous_plus)]
16 pub(crate) struct AmbiguousPlus {
19 #[suggestion(code = "({sum_ty})")]
24 #[diag(parse_maybe_recover_from_bad_type_plus, code = "E0178")]
25 pub(crate) struct BadTypePlus {
30 pub sub: BadTypePlusSub,
33 #[derive(Subdiagnostic)]
34 pub(crate) enum BadTypePlusSub {
37 code = "{sum_with_parens}",
38 applicability = "machine-applicable"
41 sum_with_parens: String,
45 #[label(parse_forgot_paren)]
50 #[label(parse_expect_path)]
58 #[diag(parse_maybe_recover_from_bad_qpath_stage_2)]
59 pub(crate) struct BadQPathStage2 {
61 #[suggestion(code = "", applicability = "maybe-incorrect")]
67 #[diag(parse_incorrect_semicolon)]
68 pub(crate) struct IncorrectSemicolon<'a> {
70 #[suggestion(style = "short", code = "", applicability = "machine-applicable")]
73 pub opt_help: Option<()>,
78 #[diag(parse_incorrect_use_of_await)]
79 pub(crate) struct IncorrectUseOfAwait {
81 #[suggestion(parentheses_suggestion, code = "", applicability = "machine-applicable")]
86 #[diag(parse_incorrect_use_of_await)]
87 pub(crate) struct IncorrectAwait {
90 #[suggestion(postfix_suggestion, code = "{expr}.await{question_mark}")]
91 pub sugg_span: (Span, Applicability),
93 pub question_mark: &'static str,
97 #[diag(parse_in_in_typo)]
98 pub(crate) struct InInTypo {
101 #[suggestion(code = "", applicability = "machine-applicable")]
105 #[derive(Diagnostic)]
106 #[diag(parse_invalid_variable_declaration)]
107 pub(crate) struct InvalidVariableDeclaration {
111 pub sub: InvalidVariableDeclarationSub,
114 #[derive(Subdiagnostic)]
115 pub(crate) enum InvalidVariableDeclarationSub {
116 #[suggestion(parse_switch_mut_let_order, applicability = "maybe-incorrect", code = "let mut")]
117 SwitchMutLetOrder(#[primary_span] Span),
119 parse_missing_let_before_mut,
120 applicability = "machine-applicable",
123 MissingLet(#[primary_span] Span),
124 #[suggestion(parse_use_let_not_auto, applicability = "machine-applicable", code = "let")]
125 UseLetNotAuto(#[primary_span] Span),
126 #[suggestion(parse_use_let_not_var, applicability = "machine-applicable", code = "let")]
127 UseLetNotVar(#[primary_span] Span),
130 #[derive(Diagnostic)]
131 #[diag(parse_invalid_comparison_operator)]
132 pub(crate) struct InvalidComparisonOperator {
137 pub sub: InvalidComparisonOperatorSub,
140 #[derive(Subdiagnostic)]
141 pub(crate) enum InvalidComparisonOperatorSub {
145 applicability = "machine-applicable",
154 #[label(spaceship_operator_invalid)]
155 Spaceship(#[primary_span] Span),
158 #[derive(Diagnostic)]
159 #[diag(parse_invalid_logical_operator)]
161 pub(crate) struct InvalidLogicalOperator {
164 pub incorrect: String,
166 pub sub: InvalidLogicalOperatorSub,
169 #[derive(Subdiagnostic)]
170 pub(crate) enum InvalidLogicalOperatorSub {
172 use_amp_amp_for_conjunction,
174 applicability = "machine-applicable",
177 Conjunction(#[primary_span] Span),
179 use_pipe_pipe_for_disjunction,
181 applicability = "machine-applicable",
184 Disjunction(#[primary_span] Span),
187 #[derive(Diagnostic)]
188 #[diag(parse_tilde_is_not_unary_operator)]
189 pub(crate) struct TildeAsUnaryOperator(
191 #[suggestion(style = "short", applicability = "machine-applicable", code = "!")]
195 #[derive(Diagnostic)]
196 #[diag(parse_unexpected_token_after_not)]
197 pub(crate) struct NotAsNegationOperator {
200 pub negated_desc: String,
202 pub sub: NotAsNegationOperatorSub,
205 #[derive(Subdiagnostic)]
206 pub enum NotAsNegationOperatorSub {
208 parse_unexpected_token_after_not_default,
210 applicability = "machine-applicable",
213 SuggestNotDefault(#[primary_span] Span),
216 parse_unexpected_token_after_not_bitwise,
218 applicability = "machine-applicable",
221 SuggestNotBitwise(#[primary_span] Span),
224 parse_unexpected_token_after_not_logical,
226 applicability = "machine-applicable",
229 SuggestNotLogical(#[primary_span] Span),
232 #[derive(Diagnostic)]
233 #[diag(parse_malformed_loop_label)]
234 pub(crate) struct MalformedLoopLabel {
236 #[suggestion(applicability = "machine-applicable", code = "{correct_label}")]
238 pub correct_label: Ident,
241 #[derive(Diagnostic)]
242 #[diag(parse_lifetime_in_borrow_expression)]
243 pub(crate) struct LifetimeInBorrowExpression {
246 #[suggestion(applicability = "machine-applicable", code = "")]
248 pub lifetime_span: Span,
251 #[derive(Diagnostic)]
252 #[diag(parse_field_expression_with_generic)]
253 pub(crate) struct FieldExpressionWithGeneric(#[primary_span] pub Span);
255 #[derive(Diagnostic)]
256 #[diag(parse_macro_invocation_with_qualified_path)]
257 pub(crate) struct MacroInvocationWithQualifiedPath(#[primary_span] pub Span);
259 #[derive(Diagnostic)]
260 #[diag(parse_unexpected_token_after_label)]
261 pub(crate) struct UnexpectedTokenAfterLabel {
263 #[label(parse_unexpected_token_after_label)]
265 #[suggestion(suggestion_remove_label, style = "verbose", code = "")]
266 pub remove_label: Option<Span>,
268 pub enclose_in_block: Option<UnexpectedTokenAfterLabelSugg>,
271 #[derive(Subdiagnostic)]
272 #[multipart_suggestion(suggestion_enclose_in_block, applicability = "machine-applicable")]
273 pub(crate) struct UnexpectedTokenAfterLabelSugg {
274 #[suggestion_part(code = "{{ ")]
276 #[suggestion_part(code = " }}")]
280 #[derive(Diagnostic)]
281 #[diag(parse_require_colon_after_labeled_expression)]
283 pub(crate) struct RequireColonAfterLabeledExpression {
288 #[suggestion(style = "short", applicability = "machine-applicable", code = ": ")]
292 #[derive(Diagnostic)]
293 #[diag(parse_do_catch_syntax_removed)]
295 pub(crate) struct DoCatchSyntaxRemoved {
297 #[suggestion(applicability = "machine-applicable", code = "try")]
301 #[derive(Diagnostic)]
302 #[diag(parse_float_literal_requires_integer_part)]
303 pub(crate) struct FloatLiteralRequiresIntegerPart {
305 #[suggestion(applicability = "machine-applicable", code = "{correct}")]
310 #[derive(Diagnostic)]
311 #[diag(parse_missing_semicolon_before_array)]
312 pub(crate) struct MissingSemicolonBeforeArray {
314 pub open_delim: Span,
315 #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = ";")]
319 #[derive(Diagnostic)]
320 #[diag(parse_expect_dotdot_not_dotdotdot)]
321 pub(crate) struct MissingDotDot {
323 pub token_span: Span,
324 #[suggestion(applicability = "maybe-incorrect", code = "..", style = "verbose")]
328 #[derive(Diagnostic)]
329 #[diag(parse_invalid_block_macro_segment)]
330 pub(crate) struct InvalidBlockMacroSegment {
337 #[derive(Diagnostic)]
338 #[diag(parse_if_expression_missing_then_block)]
339 pub(crate) struct IfExpressionMissingThenBlock {
343 pub missing_then_block_sub: IfExpressionMissingThenBlockSub,
345 pub let_else_sub: Option<IfExpressionLetSomeSub>,
348 #[derive(Subdiagnostic)]
349 pub(crate) enum IfExpressionMissingThenBlockSub {
350 #[help(condition_possibly_unfinished)]
351 UnfinishedCondition(#[primary_span] Span),
352 #[help(add_then_block)]
353 AddThenBlock(#[primary_span] Span),
356 #[derive(Subdiagnostic)]
357 #[suggestion(parse_extra_if_in_let_else, applicability = "maybe-incorrect", code = "")]
358 pub(crate) struct IfExpressionLetSomeSub {
363 #[derive(Diagnostic)]
364 #[diag(parse_if_expression_missing_condition)]
365 pub(crate) struct IfExpressionMissingCondition {
367 #[label(condition_label)]
369 #[label(block_label)]
370 pub block_span: Span,
373 #[derive(Diagnostic)]
374 #[diag(parse_expected_expression_found_let)]
375 pub(crate) struct ExpectedExpressionFoundLet {
380 #[derive(Diagnostic)]
381 #[diag(parse_expect_eq_instead_of_eqeq)]
382 pub(crate) struct ExpectedEqForLetExpr {
385 #[suggestion(applicability = "maybe-incorrect", code = "=", style = "verbose")]
389 #[derive(Diagnostic)]
390 #[diag(parse_expected_else_block)]
391 pub(crate) struct ExpectedElseBlock {
393 pub first_tok_span: Span,
394 pub first_tok: String,
397 #[suggestion(applicability = "maybe-incorrect", code = "if ")]
398 pub condition_start: Span,
401 #[derive(Diagnostic)]
402 #[diag(parse_outer_attribute_not_allowed_on_if_else)]
403 pub(crate) struct OuterAttributeNotAllowedOnIfElse {
407 #[label(branch_label)]
408 pub branch_span: Span,
414 #[suggestion(applicability = "machine-applicable", code = "")]
415 pub attributes: Span,
418 #[derive(Diagnostic)]
419 #[diag(parse_missing_in_in_for_loop)]
420 pub(crate) struct MissingInInForLoop {
424 pub sub: MissingInInForLoopSub,
427 #[derive(Subdiagnostic)]
428 pub(crate) enum MissingInInForLoopSub {
429 // Has been misleading, at least in the past (closed Issue #48492), thus maybe-incorrect
430 #[suggestion(use_in_not_of, style = "short", applicability = "maybe-incorrect", code = "in")]
431 InNotOf(#[primary_span] Span),
432 #[suggestion(add_in, style = "short", applicability = "maybe-incorrect", code = " in ")]
433 AddIn(#[primary_span] Span),
436 #[derive(Diagnostic)]
437 #[diag(parse_missing_comma_after_match_arm)]
438 pub(crate) struct MissingCommaAfterMatchArm {
440 #[suggestion(applicability = "machine-applicable", code = ",")]
444 #[derive(Diagnostic)]
445 #[diag(parse_catch_after_try)]
447 pub(crate) struct CatchAfterTry {
452 #[derive(Diagnostic)]
453 #[diag(parse_comma_after_base_struct)]
455 pub(crate) struct CommaAfterBaseStruct {
458 #[suggestion(style = "short", applicability = "machine-applicable", code = "")]
462 #[derive(Diagnostic)]
463 #[diag(parse_eq_field_init)]
464 pub(crate) struct EqFieldInit {
467 #[suggestion(applicability = "machine-applicable", code = ":")]
471 #[derive(Diagnostic)]
472 #[diag(parse_dotdotdot)]
473 pub(crate) struct DotDotDot {
475 #[suggestion(suggest_exclusive_range, applicability = "maybe-incorrect", code = "..")]
476 #[suggestion(suggest_inclusive_range, applicability = "maybe-incorrect", code = "..=")]
480 #[derive(Diagnostic)]
481 #[diag(parse_left_arrow_operator)]
482 pub(crate) struct LeftArrowOperator {
484 #[suggestion(applicability = "maybe-incorrect", code = "< -")]
488 #[derive(Diagnostic)]
489 #[diag(parse_remove_let)]
490 pub(crate) struct RemoveLet {
492 #[suggestion(applicability = "machine-applicable", code = "")]
496 #[derive(Diagnostic)]
497 #[diag(parse_use_eq_instead)]
498 pub(crate) struct UseEqInstead {
500 #[suggestion(style = "short", applicability = "machine-applicable", code = "=")]
504 #[derive(Diagnostic)]
505 #[diag(parse_use_empty_block_not_semi)]
506 pub(crate) struct UseEmptyBlockNotSemi {
508 #[suggestion(style = "hidden", applicability = "machine-applicable", code = "{{}}")]
512 #[derive(Diagnostic)]
513 #[diag(parse_comparison_interpreted_as_generic)]
514 pub(crate) struct ComparisonInterpretedAsGeneric {
516 #[label(label_comparison)]
517 pub comparison: Span,
522 pub suggestion: ComparisonOrShiftInterpretedAsGenericSugg,
525 #[derive(Diagnostic)]
526 #[diag(parse_shift_interpreted_as_generic)]
527 pub(crate) struct ShiftInterpretedAsGeneric {
529 #[label(label_comparison)]
535 pub suggestion: ComparisonOrShiftInterpretedAsGenericSugg,
538 #[derive(Subdiagnostic)]
539 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
540 pub(crate) struct ComparisonOrShiftInterpretedAsGenericSugg {
541 #[suggestion_part(code = "(")]
543 #[suggestion_part(code = ")")]
547 #[derive(Diagnostic)]
548 #[diag(parse_found_expr_would_be_stmt)]
549 pub(crate) struct FoundExprWouldBeStmt {
555 pub suggestion: ExprParenthesesNeeded,
558 #[derive(Diagnostic)]
559 #[diag(parse_leading_plus_not_supported)]
560 pub(crate) struct LeadingPlusNotSupported {
565 suggestion_remove_plus,
568 applicability = "machine-applicable"
570 pub remove_plus: Option<Span>,
572 pub add_parentheses: Option<ExprParenthesesNeeded>,
575 #[derive(Diagnostic)]
576 #[diag(parse_parentheses_with_struct_fields)]
577 pub(crate) struct ParenthesesWithStructFields {
582 pub braces_for_struct: BracesForStructLiteral,
584 pub no_fields_for_fn: NoFieldsForFnCall,
587 #[derive(Subdiagnostic)]
588 #[multipart_suggestion(suggestion_braces_for_struct, applicability = "maybe-incorrect")]
589 pub(crate) struct BracesForStructLiteral {
590 #[suggestion_part(code = " {{ ")]
592 #[suggestion_part(code = " }}")]
596 #[derive(Subdiagnostic)]
597 #[multipart_suggestion(suggestion_no_fields_for_fn, applicability = "maybe-incorrect")]
598 pub(crate) struct NoFieldsForFnCall {
599 #[suggestion_part(code = "")]
600 pub fields: Vec<Span>,
603 #[derive(Diagnostic)]
604 #[diag(parse_labeled_loop_in_break)]
605 pub(crate) struct LabeledLoopInBreak {
609 pub sub: WrapExpressionInParentheses,
612 #[derive(Subdiagnostic)]
613 #[multipart_suggestion(
614 parse_sugg_wrap_expression_in_parentheses,
615 applicability = "machine-applicable"
617 pub(crate) struct WrapExpressionInParentheses {
618 #[suggestion_part(code = "(")]
620 #[suggestion_part(code = ")")]
624 #[derive(Diagnostic)]
625 #[diag(parse_array_brackets_instead_of_braces)]
626 pub(crate) struct ArrayBracketsInsteadOfSpaces {
630 pub sub: ArrayBracketsInsteadOfSpacesSugg,
633 #[derive(Subdiagnostic)]
634 #[multipart_suggestion(suggestion, applicability = "maybe-incorrect")]
635 pub(crate) struct ArrayBracketsInsteadOfSpacesSugg {
636 #[suggestion_part(code = "[")]
638 #[suggestion_part(code = "]")]
642 #[derive(Diagnostic)]
643 #[diag(parse_match_arm_body_without_braces)]
644 pub(crate) struct MatchArmBodyWithoutBraces {
646 #[label(label_statements)]
647 pub statements: Span,
648 #[label(label_arrow)]
650 pub num_statements: usize,
652 pub sub: MatchArmBodyWithoutBracesSugg,
655 #[derive(Diagnostic)]
656 #[diag(parse_inclusive_range_extra_equals)]
658 pub(crate) struct InclusiveRangeExtraEquals {
661 suggestion_remove_eq,
664 applicability = "maybe-incorrect"
669 #[derive(Diagnostic)]
670 #[diag(parse_inclusive_range_match_arrow)]
671 pub(crate) struct InclusiveRangeMatchArrow {
676 #[suggestion(style = "verbose", code = " ", applicability = "machine-applicable")]
680 #[derive(Diagnostic)]
681 #[diag(parse_inclusive_range_no_end, code = "E0586")]
683 pub(crate) struct InclusiveRangeNoEnd {
686 suggestion_open_range,
688 applicability = "machine-applicable",
694 #[derive(Subdiagnostic)]
695 pub(crate) enum MatchArmBodyWithoutBracesSugg {
696 #[multipart_suggestion(suggestion_add_braces, applicability = "machine-applicable")]
698 #[suggestion_part(code = "{{ ")]
700 #[suggestion_part(code = " }}")]
704 suggestion_use_comma_not_semicolon,
706 applicability = "machine-applicable"
714 #[derive(Diagnostic)]
715 #[diag(parse_struct_literal_not_allowed_here)]
716 pub(crate) struct StructLiteralNotAllowedHere {
720 pub sub: StructLiteralNotAllowedHereSugg,
723 #[derive(Subdiagnostic)]
724 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
725 pub(crate) struct StructLiteralNotAllowedHereSugg {
726 #[suggestion_part(code = "(")]
728 #[suggestion_part(code = ")")]
732 #[derive(Diagnostic)]
733 #[diag(parse_invalid_interpolated_expression)]
734 pub(crate) struct InvalidInterpolatedExpression {
739 #[derive(Diagnostic)]
740 #[diag(parse_invalid_literal_suffix_on_tuple_index)]
741 pub(crate) struct InvalidLiteralSuffixOnTupleIndex {
746 #[help(tuple_exception_line_1)]
747 #[help(tuple_exception_line_2)]
748 #[help(tuple_exception_line_3)]
749 pub exception: Option<()>,
752 #[derive(Diagnostic)]
753 #[diag(parse_non_string_abi_literal)]
754 pub(crate) struct NonStringAbiLiteral {
756 #[suggestion(code = "\"C\"", applicability = "maybe-incorrect")]
760 #[derive(Diagnostic)]
761 #[diag(parse_mismatched_closing_delimiter)]
762 pub(crate) struct MismatchedClosingDelimiter {
764 pub spans: Vec<Span>,
765 pub delimiter: String,
766 #[label(label_unmatched)]
768 #[label(label_opening_candidate)]
769 pub opening_candidate: Option<Span>,
770 #[label(label_unclosed)]
771 pub unclosed: Option<Span>,
774 #[derive(Diagnostic)]
775 #[diag(parse_incorrect_visibility_restriction, code = "E0704")]
777 pub(crate) struct IncorrectVisibilityRestriction {
779 #[suggestion(code = "in {inner_str}", applicability = "machine-applicable")]
781 pub inner_str: String,
784 #[derive(Diagnostic)]
785 #[diag(parse_assignment_else_not_allowed)]
786 pub(crate) struct AssignmentElseNotAllowed {
791 #[derive(Diagnostic)]
792 #[diag(parse_expected_statement_after_outer_attr)]
793 pub(crate) struct ExpectedStatementAfterOuterAttr {
798 #[derive(Diagnostic)]
799 #[diag(parse_doc_comment_does_not_document_anything, code = "E0585")]
801 pub(crate) struct DocCommentDoesNotDocumentAnything {
804 #[suggestion(code = ",", applicability = "machine-applicable")]
805 pub missing_comma: Option<Span>,
808 #[derive(Diagnostic)]
809 #[diag(parse_const_let_mutually_exclusive)]
810 pub(crate) struct ConstLetMutuallyExclusive {
812 #[suggestion(code = "const", applicability = "maybe-incorrect")]
816 #[derive(Diagnostic)]
817 #[diag(parse_invalid_expression_in_let_else)]
818 pub(crate) struct InvalidExpressionInLetElse {
821 pub operator: &'static str,
823 pub sugg: WrapExpressionInParentheses,
826 #[derive(Diagnostic)]
827 #[diag(parse_invalid_curly_in_let_else)]
828 pub(crate) struct InvalidCurlyInLetElse {
832 pub sugg: WrapExpressionInParentheses,
835 #[derive(Diagnostic)]
836 #[diag(parse_compound_assignment_expression_in_let)]
838 pub(crate) struct CompoundAssignmentExpressionInLet {
840 #[suggestion(style = "short", code = "=", applicability = "maybe-incorrect")]
844 #[derive(Diagnostic)]
845 #[diag(parse_suffixed_literal_in_attribute)]
847 pub(crate) struct SuffixedLiteralInAttribute {
852 #[derive(Diagnostic)]
853 #[diag(parse_invalid_meta_item)]
854 pub(crate) struct InvalidMetaItem {
860 #[derive(Subdiagnostic)]
862 parse_sugg_escape_to_use_as_identifier,
864 applicability = "maybe-incorrect",
867 pub(crate) struct SuggEscapeToUseAsIdentifier {
870 pub ident_name: String,
873 #[derive(Subdiagnostic)]
874 #[suggestion(parse_sugg_remove_comma, applicability = "machine-applicable", code = "")]
875 pub(crate) struct SuggRemoveComma {
880 #[derive(Subdiagnostic)]
881 pub(crate) enum ExpectedIdentifierFound {
882 #[label(parse_expected_identifier_found_reserved_identifier)]
883 ReservedIdentifier(#[primary_span] Span),
884 #[label(parse_expected_identifier_found_keyword)]
885 Keyword(#[primary_span] Span),
886 #[label(parse_expected_identifier_found_reserved_keyword)]
887 ReservedKeyword(#[primary_span] Span),
888 #[label(parse_expected_identifier_found_doc_comment)]
889 DocComment(#[primary_span] Span),
890 #[label(parse_expected_identifier)]
891 Other(#[primary_span] Span),
894 impl ExpectedIdentifierFound {
895 pub fn new(token_descr: Option<TokenDescription>, span: Span) -> Self {
897 Some(TokenDescription::ReservedIdentifier) => {
898 ExpectedIdentifierFound::ReservedIdentifier
900 Some(TokenDescription::Keyword) => ExpectedIdentifierFound::Keyword,
901 Some(TokenDescription::ReservedKeyword) => ExpectedIdentifierFound::ReservedKeyword,
902 Some(TokenDescription::DocComment) => ExpectedIdentifierFound::DocComment,
903 None => ExpectedIdentifierFound::Other,
908 pub(crate) struct ExpectedIdentifier {
911 pub suggest_raw: Option<SuggEscapeToUseAsIdentifier>,
912 pub suggest_remove_comma: Option<SuggRemoveComma>,
915 impl<'a, G: EmissionGuarantee> IntoDiagnostic<'a, G> for ExpectedIdentifier {
919 handler: &'a rustc_errors::Handler,
920 ) -> rustc_errors::DiagnosticBuilder<'a, G> {
921 let token_descr = super::parser::TokenDescription::from_token(&self.token);
923 let mut diag = handler.struct_diagnostic(match token_descr {
924 Some(TokenDescription::ReservedIdentifier) => {
925 fluent::parse_expected_identifier_found_reserved_identifier_str
927 Some(TokenDescription::Keyword) => fluent::parse_expected_identifier_found_keyword_str,
928 Some(TokenDescription::ReservedKeyword) => {
929 fluent::parse_expected_identifier_found_reserved_keyword_str
931 Some(TokenDescription::DocComment) => {
932 fluent::parse_expected_identifier_found_doc_comment_str
934 None => fluent::parse_expected_identifier_found_str,
936 diag.set_span(self.span);
937 diag.set_arg("token", self.token);
939 if let Some(sugg) = self.suggest_raw {
940 sugg.add_to_diagnostic(&mut diag);
943 ExpectedIdentifierFound::new(token_descr, self.span).add_to_diagnostic(&mut diag);
945 if let Some(sugg) = self.suggest_remove_comma {
946 sugg.add_to_diagnostic(&mut diag);
953 pub(crate) struct ExpectedSemi {
957 pub unexpected_token_label: Option<Span>,
958 pub sugg: ExpectedSemiSugg,
961 impl<'a, G: EmissionGuarantee> IntoDiagnostic<'a, G> for ExpectedSemi {
965 handler: &'a rustc_errors::Handler,
966 ) -> rustc_errors::DiagnosticBuilder<'a, G> {
967 let token_descr = super::parser::TokenDescription::from_token(&self.token);
969 let mut diag = handler.struct_diagnostic(match token_descr {
970 Some(TokenDescription::ReservedIdentifier) => {
971 fluent::parse_expected_semi_found_reserved_identifier_str
973 Some(TokenDescription::Keyword) => fluent::parse_expected_semi_found_keyword_str,
974 Some(TokenDescription::ReservedKeyword) => {
975 fluent::parse_expected_semi_found_reserved_keyword_str
977 Some(TokenDescription::DocComment) => fluent::parse_expected_semi_found_doc_comment_str,
978 None => fluent::parse_expected_semi_found_str,
980 diag.set_span(self.span);
981 diag.set_arg("token", self.token);
983 if let Some(unexpected_token_label) = self.unexpected_token_label {
984 diag.span_label(unexpected_token_label, fluent::parse_label_unexpected_token);
987 self.sugg.add_to_diagnostic(&mut diag);
993 #[derive(Subdiagnostic)]
994 pub(crate) enum ExpectedSemiSugg {
995 #[suggestion(parse_sugg_change_this_to_semi, code = ";", applicability = "machine-applicable")]
996 ChangeToSemi(#[primary_span] Span),
1001 applicability = "machine-applicable"
1003 AddSemi(#[primary_span] Span),
1006 #[derive(Diagnostic)]
1007 #[diag(parse_struct_literal_body_without_path)]
1008 pub(crate) struct StructLiteralBodyWithoutPath {
1012 pub sugg: StructLiteralBodyWithoutPathSugg,
1015 #[derive(Subdiagnostic)]
1016 #[multipart_suggestion(suggestion, applicability = "has-placeholders")]
1017 pub(crate) struct StructLiteralBodyWithoutPathSugg {
1018 #[suggestion_part(code = "{{ SomeStruct ")]
1020 #[suggestion_part(code = " }}")]
1024 #[derive(Diagnostic)]
1025 #[diag(parse_struct_literal_needing_parens)]
1026 pub(crate) struct StructLiteralNeedingParens {
1030 pub sugg: StructLiteralNeedingParensSugg,
1033 #[derive(Subdiagnostic)]
1034 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1035 pub(crate) struct StructLiteralNeedingParensSugg {
1036 #[suggestion_part(code = "(")]
1038 #[suggestion_part(code = ")")]
1042 #[derive(Diagnostic)]
1043 #[diag(parse_unmatched_angle_brackets)]
1044 pub(crate) struct UnmatchedAngleBrackets {
1046 #[suggestion(code = "", applicability = "machine-applicable")]
1048 pub num_extra_brackets: usize,
1051 #[derive(Diagnostic)]
1052 #[diag(parse_generic_parameters_without_angle_brackets)]
1053 pub(crate) struct GenericParamsWithoutAngleBrackets {
1057 pub sugg: GenericParamsWithoutAngleBracketsSugg,
1060 #[derive(Subdiagnostic)]
1061 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1062 pub(crate) struct GenericParamsWithoutAngleBracketsSugg {
1063 #[suggestion_part(code = "<")]
1065 #[suggestion_part(code = ">")]
1069 #[derive(Diagnostic)]
1070 #[diag(parse_comparison_operators_cannot_be_chained)]
1071 pub(crate) struct ComparisonOperatorsCannotBeChained {
1073 pub span: Vec<Span>,
1075 parse_sugg_turbofish_syntax,
1078 applicability = "maybe-incorrect"
1080 pub suggest_turbofish: Option<Span>,
1081 #[help(parse_sugg_turbofish_syntax)]
1082 #[help(sugg_parentheses_for_function_args)]
1083 pub help_turbofish: Option<()>,
1085 pub chaining_sugg: Option<ComparisonOperatorsCannotBeChainedSugg>,
1088 #[derive(Subdiagnostic)]
1089 pub(crate) enum ComparisonOperatorsCannotBeChainedSugg {
1091 sugg_split_comparison,
1093 code = " && {middle_term}",
1094 applicability = "maybe-incorrect"
1099 middle_term: String,
1101 #[multipart_suggestion(sugg_parenthesize, applicability = "maybe-incorrect")]
1103 #[suggestion_part(code = "(")]
1105 #[suggestion_part(code = ")")]
1110 #[derive(Diagnostic)]
1111 #[diag(parse_question_mark_in_type)]
1112 pub(crate) struct QuestionMarkInType {
1117 pub sugg: QuestionMarkInTypeSugg,
1120 #[derive(Subdiagnostic)]
1121 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1122 pub(crate) struct QuestionMarkInTypeSugg {
1123 #[suggestion_part(code = "Option<")]
1125 #[suggestion_part(code = ">")]
1129 #[derive(Diagnostic)]
1130 #[diag(parse_unexpected_parentheses_in_for_head)]
1131 pub(crate) struct ParenthesesInForHead {
1133 pub span: Vec<Span>,
1135 pub sugg: ParenthesesInForHeadSugg,
1138 #[derive(Subdiagnostic)]
1139 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1140 pub(crate) struct ParenthesesInForHeadSugg {
1141 #[suggestion_part(code = "{left_snippet}")]
1143 pub left_snippet: String,
1144 #[suggestion_part(code = "{right_snippet}")]
1146 pub right_snippet: String,
1149 #[derive(Diagnostic)]
1150 #[diag(parse_doc_comment_on_param_type)]
1151 pub(crate) struct DocCommentOnParamType {
1157 #[derive(Diagnostic)]
1158 #[diag(parse_attribute_on_param_type)]
1159 pub(crate) struct AttributeOnParamType {
1165 #[derive(Diagnostic)]
1166 #[diag(parse_pattern_method_param_without_body, code = "E0642")]
1167 pub(crate) struct PatternMethodParamWithoutBody {
1169 #[suggestion(code = "_", applicability = "machine-applicable")]
1173 #[derive(Diagnostic)]
1174 #[diag(parse_self_param_not_first)]
1175 pub(crate) struct SelfParamNotFirst {
1181 #[derive(Diagnostic)]
1182 #[diag(parse_invalid_identifier_with_leading_number)]
1183 pub(crate) struct InvalidIdentiferStartsWithNumber {
1189 #[derive(Diagnostic)]
1190 #[diag(parse_const_generic_without_braces)]
1191 pub(crate) struct ConstGenericWithoutBraces {
1195 pub sugg: ConstGenericWithoutBracesSugg,
1198 #[derive(Subdiagnostic)]
1199 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1200 pub(crate) struct ConstGenericWithoutBracesSugg {
1201 #[suggestion_part(code = "{{ ")]
1203 #[suggestion_part(code = " }}")]
1207 #[derive(Diagnostic)]
1208 #[diag(parse_unexpected_const_param_declaration)]
1209 pub(crate) struct UnexpectedConstParamDeclaration {
1214 pub sugg: Option<UnexpectedConstParamDeclarationSugg>,
1217 #[derive(Subdiagnostic)]
1218 pub(crate) enum UnexpectedConstParamDeclarationSugg {
1219 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1221 #[suggestion_part(code = "<{snippet}>")]
1222 impl_generics: Span,
1223 #[suggestion_part(code = "{ident}")]
1224 incorrect_decl: Span,
1228 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1230 #[suggestion_part(code = ", {snippet}")]
1231 impl_generics_end: Span,
1232 #[suggestion_part(code = "{ident}")]
1233 incorrect_decl: Span,
1239 #[derive(Diagnostic)]
1240 #[diag(parse_unexpected_const_in_generic_param)]
1241 pub(crate) struct UnexpectedConstInGenericParam {
1244 #[suggestion(style = "verbose", code = "", applicability = "maybe-incorrect")]
1245 pub to_remove: Option<Span>,
1248 #[derive(Diagnostic)]
1249 #[diag(parse_async_move_order_incorrect)]
1250 pub(crate) struct AsyncMoveOrderIncorrect {
1252 #[suggestion(style = "verbose", code = "async move", applicability = "maybe-incorrect")]
1256 #[derive(Diagnostic)]
1257 #[diag(parse_double_colon_in_bound)]
1258 pub(crate) struct DoubleColonInBound {
1261 #[suggestion(code = ": ", applicability = "machine-applicable")]
1265 #[derive(Diagnostic)]
1266 #[diag(parse_fn_ptr_with_generics)]
1267 pub(crate) struct FnPtrWithGenerics {
1271 pub sugg: Option<FnPtrWithGenericsSugg>,
1274 #[derive(Subdiagnostic)]
1275 #[multipart_suggestion(suggestion, applicability = "maybe-incorrect")]
1276 pub(crate) struct FnPtrWithGenericsSugg {
1277 #[suggestion_part(code = "{snippet}")]
1279 pub snippet: String,
1280 #[suggestion_part(code = "")]
1283 pub for_param_list_exists: bool,
1286 #[derive(Diagnostic)]
1287 #[diag(parse_unexpected_if_with_if)]
1288 pub(crate) struct UnexpectedIfWithIf(
1290 #[suggestion(applicability = "machine-applicable", code = " ", style = "verbose")]
1294 #[derive(Diagnostic)]
1295 #[diag(parse_maybe_fn_typo_with_impl)]
1296 pub(crate) struct FnTypoWithImpl {
1298 #[suggestion(applicability = "maybe-incorrect", code = "impl", style = "verbose")]
1302 #[derive(Diagnostic)]
1303 #[diag(parse_expected_fn_path_found_fn_keyword)]
1304 pub(crate) struct ExpectedFnPathFoundFnKeyword {
1306 #[suggestion(applicability = "machine-applicable", code = "Fn", style = "verbose")]
1307 pub fn_token_span: Span,
1310 #[derive(Diagnostic)]
1311 #[diag(parse_where_clause_before_tuple_struct_body)]
1312 pub(crate) struct WhereClauseBeforeTupleStructBody {
1316 #[label(name_label)]
1318 #[label(body_label)]
1321 pub sugg: Option<WhereClauseBeforeTupleStructBodySugg>,
1324 #[derive(Subdiagnostic)]
1325 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1326 pub(crate) struct WhereClauseBeforeTupleStructBodySugg {
1327 #[suggestion_part(code = "{snippet}")]
1329 pub snippet: String,
1330 #[suggestion_part(code = "")]
1334 #[derive(Diagnostic)]
1335 #[diag(parse_async_fn_in_2015, code = "E0670")]
1336 pub(crate) struct AsyncFnIn2015 {
1341 pub help: HelpUseLatestEdition,
1344 #[derive(Subdiagnostic)]
1345 #[label(parse_async_block_in_2015)]
1346 pub(crate) struct AsyncBlockIn2015 {
1351 #[derive(Diagnostic)]
1352 #[diag(parse_self_argument_pointer)]
1353 pub(crate) struct SelfArgumentPointer {
1359 #[derive(Diagnostic)]
1360 #[diag(parse_visibility_not_followed_by_item)]
1362 pub(crate) struct VisibilityNotFollowedByItem {
1366 pub vis: Visibility,
1369 #[derive(Diagnostic)]
1370 #[diag(parse_default_not_followed_by_item)]
1372 pub(crate) struct DefaultNotFollowedByItem {
1378 #[derive(Diagnostic)]
1379 pub(crate) enum MissingKeywordForItemDefinition {
1380 #[diag(parse_missing_struct_for_struct_definition)]
1383 #[suggestion(style = "short", applicability = "maybe-incorrect", code = " struct ")]
1387 #[diag(parse_missing_fn_for_function_definition)]
1390 #[suggestion(style = "short", applicability = "maybe-incorrect", code = " fn ")]
1394 #[diag(parse_missing_fn_for_method_definition)]
1397 #[suggestion(style = "short", applicability = "maybe-incorrect", code = " fn ")]
1401 #[diag(parse_ambiguous_missing_keyword_for_item_definition)]
1406 subdiag: Option<AmbiguousMissingKwForItemSub>,
1410 #[derive(Subdiagnostic)]
1411 pub(crate) enum AmbiguousMissingKwForItemSub {
1412 #[suggestion(suggestion, applicability = "maybe-incorrect", code = "{snippet}!")]
1422 #[derive(Diagnostic)]
1423 #[diag(parse_missing_trait_in_trait_impl)]
1424 pub(crate) struct MissingTraitInTraitImpl {
1426 #[suggestion(suggestion_add_trait, code = " Trait ", applicability = "has-placeholders")]
1428 #[suggestion(suggestion_remove_for, code = "", applicability = "maybe-incorrect")]
1432 #[derive(Diagnostic)]
1433 #[diag(parse_missing_for_in_trait_impl)]
1434 pub(crate) struct MissingForInTraitImpl {
1436 #[suggestion(style = "short", code = " for ", applicability = "machine-applicable")]
1440 #[derive(Diagnostic)]
1441 #[diag(parse_expected_trait_in_trait_impl_found_type)]
1442 pub(crate) struct ExpectedTraitInTraitImplFoundType {
1447 #[derive(Diagnostic)]
1448 #[diag(parse_bounds_not_allowed_on_trait_aliases)]
1449 pub(crate) struct BoundsNotAllowedOnTraitAliases {
1454 #[derive(Diagnostic)]
1455 #[diag(parse_trait_alias_cannot_be_auto)]
1456 pub(crate) struct TraitAliasCannotBeAuto {
1458 #[label(parse_trait_alias_cannot_be_auto)]
1462 #[derive(Diagnostic)]
1463 #[diag(parse_trait_alias_cannot_be_unsafe)]
1464 pub(crate) struct TraitAliasCannotBeUnsafe {
1466 #[label(parse_trait_alias_cannot_be_unsafe)]
1470 #[derive(Diagnostic)]
1471 #[diag(parse_associated_static_item_not_allowed)]
1472 pub(crate) struct AssociatedStaticItemNotAllowed {
1477 #[derive(Diagnostic)]
1478 #[diag(parse_extern_crate_name_with_dashes)]
1479 pub(crate) struct ExternCrateNameWithDashes {
1484 pub sugg: ExternCrateNameWithDashesSugg,
1487 #[derive(Subdiagnostic)]
1488 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1489 pub(crate) struct ExternCrateNameWithDashesSugg {
1490 #[suggestion_part(code = "_")]
1491 pub dashes: Vec<Span>,
1494 #[derive(Diagnostic)]
1495 #[diag(parse_extern_item_cannot_be_const)]
1497 pub(crate) struct ExternItemCannotBeConst {
1499 pub ident_span: Span,
1500 #[suggestion(code = "static ", applicability = "machine-applicable")]
1501 pub const_span: Span,
1504 #[derive(Diagnostic)]
1505 #[diag(parse_const_global_cannot_be_mutable)]
1506 pub(crate) struct ConstGlobalCannotBeMutable {
1509 pub ident_span: Span,
1510 #[suggestion(code = "static", applicability = "maybe-incorrect")]
1511 pub const_span: Span,
1514 #[derive(Diagnostic)]
1515 #[diag(parse_missing_const_type)]
1516 pub(crate) struct MissingConstType {
1518 #[suggestion(code = "{colon} <type>", applicability = "has-placeholders")]
1521 pub kind: &'static str,
1522 pub colon: &'static str,
1525 #[derive(Diagnostic)]
1526 #[diag(parse_enum_struct_mutually_exclusive)]
1527 pub(crate) struct EnumStructMutuallyExclusive {
1529 #[suggestion(code = "enum", applicability = "machine-applicable")]
1533 #[derive(Diagnostic)]
1534 pub(crate) enum UnexpectedTokenAfterStructName {
1535 #[diag(parse_unexpected_token_after_struct_name_found_reserved_identifier)]
1536 ReservedIdentifier {
1538 #[label(parse_unexpected_token_after_struct_name)]
1542 #[diag(parse_unexpected_token_after_struct_name_found_keyword)]
1545 #[label(parse_unexpected_token_after_struct_name)]
1549 #[diag(parse_unexpected_token_after_struct_name_found_reserved_keyword)]
1552 #[label(parse_unexpected_token_after_struct_name)]
1556 #[diag(parse_unexpected_token_after_struct_name_found_doc_comment)]
1559 #[label(parse_unexpected_token_after_struct_name)]
1563 #[diag(parse_unexpected_token_after_struct_name_found_other)]
1566 #[label(parse_unexpected_token_after_struct_name)]
1572 impl UnexpectedTokenAfterStructName {
1573 pub fn new(span: Span, token: Token) -> Self {
1574 match TokenDescription::from_token(&token) {
1575 Some(TokenDescription::ReservedIdentifier) => Self::ReservedIdentifier { span, token },
1576 Some(TokenDescription::Keyword) => Self::Keyword { span, token },
1577 Some(TokenDescription::ReservedKeyword) => Self::ReservedKeyword { span, token },
1578 Some(TokenDescription::DocComment) => Self::DocComment { span, token },
1579 None => Self::Other { span, token },
1584 #[derive(Diagnostic)]
1585 #[diag(parse_unexpected_self_in_generic_parameters)]
1587 pub(crate) struct UnexpectedSelfInGenericParameters {
1592 #[derive(Diagnostic)]
1593 #[diag(parse_multiple_where_clauses)]
1594 pub(crate) struct MultipleWhereClauses {
1599 #[suggestion(style = "verbose", code = ",", applicability = "maybe-incorrect")]
1603 #[derive(Diagnostic)]
1604 pub(crate) enum UnexpectedNonterminal {
1605 #[diag(parse_nonterminal_expected_item_keyword)]
1606 Item(#[primary_span] Span),
1607 #[diag(parse_nonterminal_expected_statement)]
1608 Statement(#[primary_span] Span),
1609 #[diag(parse_nonterminal_expected_ident)]
1615 #[diag(parse_nonterminal_expected_lifetime)]
1623 #[derive(Diagnostic)]
1624 pub(crate) enum TopLevelOrPatternNotAllowed {
1625 #[diag(parse_or_pattern_not_allowed_in_let_binding)]
1630 sub: Option<TopLevelOrPatternNotAllowedSugg>,
1632 #[diag(parse_or_pattern_not_allowed_in_fn_parameters)]
1637 sub: Option<TopLevelOrPatternNotAllowedSugg>,
1641 #[derive(Subdiagnostic)]
1642 pub(crate) enum TopLevelOrPatternNotAllowedSugg {
1644 parse_sugg_remove_leading_vert_in_pattern,
1646 applicability = "machine-applicable"
1654 parse_sugg_wrap_pattern_in_parens,
1656 applicability = "machine-applicable"
1665 #[derive(Diagnostic)]
1666 #[diag(parse_unexpected_vert_vert_before_function_parameter)]
1667 #[note(parse_note_pattern_alternatives_use_single_vert)]
1668 pub(crate) struct UnexpectedVertVertBeforeFunctionParam {
1670 #[suggestion(code = "", applicability = "machine-applicable")]
1674 #[derive(Diagnostic)]
1675 #[diag(parse_unexpected_vert_vert_in_pattern)]
1676 pub(crate) struct UnexpectedVertVertInPattern {
1678 #[suggestion(code = "|", applicability = "machine-applicable")]
1680 #[label(parse_label_while_parsing_or_pattern_here)]
1681 pub start: Option<Span>,
1684 #[derive(Diagnostic)]
1685 #[diag(parse_trailing_vert_not_allowed)]
1686 pub(crate) struct TrailingVertNotAllowed {
1688 #[suggestion(code = "", applicability = "machine-applicable")]
1690 #[label(parse_label_while_parsing_or_pattern_here)]
1691 pub start: Option<Span>,
1693 #[note(parse_note_pattern_alternatives_use_single_vert)]
1694 pub note_double_vert: Option<()>,
1697 #[derive(Diagnostic)]
1698 #[diag(parse_dotdotdot_rest_pattern)]
1699 pub(crate) struct DotDotDotRestPattern {
1701 #[suggestion(style = "short", code = "..", applicability = "machine-applicable")]
1706 #[derive(Diagnostic)]
1707 #[diag(parse_pattern_on_wrong_side_of_at)]
1708 pub(crate) struct PatternOnWrongSideOfAt {
1710 #[suggestion(code = "{whole_pat}", applicability = "machine-applicable")]
1711 pub whole_span: Span,
1712 pub whole_pat: String,
1713 #[label(label_pattern)]
1715 #[label(label_binding)]
1719 #[derive(Diagnostic)]
1720 #[diag(parse_expected_binding_left_of_at)]
1722 pub(crate) struct ExpectedBindingLeftOfAt {
1724 pub whole_span: Span,
1731 #[derive(Diagnostic)]
1732 #[diag(parse_ambiguous_range_pattern)]
1733 pub(crate) struct AmbiguousRangePattern {
1735 #[suggestion(code = "({pat})", applicability = "maybe-incorrect")]
1740 #[derive(Diagnostic)]
1741 #[diag(parse_unexpected_lifetime_in_pattern)]
1742 pub(crate) struct UnexpectedLifetimeInPattern {
1744 #[suggestion(code = "", applicability = "machine-applicable")]
1749 #[derive(Diagnostic)]
1750 #[diag(parse_ref_mut_order_incorrect)]
1751 pub(crate) struct RefMutOrderIncorrect {
1753 #[suggestion(code = "ref mut", applicability = "machine-applicable")]
1757 #[derive(Diagnostic)]
1758 pub(crate) enum InvalidMutInPattern {
1759 #[diag(parse_mut_on_nested_ident_pattern)]
1760 #[note(parse_note_mut_pattern_usage)]
1763 #[suggestion(code = "{pat}", applicability = "machine-applicable")]
1767 #[diag(parse_mut_on_non_ident_pattern)]
1768 #[note(parse_note_mut_pattern_usage)]
1771 #[suggestion(code = "{pat}", applicability = "machine-applicable")]
1777 #[derive(Diagnostic)]
1778 #[diag(parse_repeated_mut_in_pattern)]
1779 pub(crate) struct RepeatedMutInPattern {
1781 #[suggestion(code = "", applicability = "machine-applicable")]
1785 #[derive(Diagnostic)]
1786 #[diag(parse_dot_dot_dot_range_to_pattern_not_allowed)]
1787 pub(crate) struct DotDotDotRangeToPatternNotAllowed {
1789 #[suggestion(style = "short", code = "..=", applicability = "machine-applicable")]
1793 #[derive(Diagnostic)]
1794 #[diag(parse_enum_pattern_instead_of_identifier)]
1795 pub(crate) struct EnumPatternInsteadOfIdentifier {
1800 #[derive(Diagnostic)]
1801 #[diag(parse_dot_dot_dot_for_remaining_fields)]
1802 pub(crate) struct DotDotDotForRemainingFields {
1804 #[suggestion(code = "..", style = "verbose", applicability = "machine-applicable")]
1806 pub token_str: Cow<'static, str>,
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 }