@@ -21,6 +21,7 @@ use rustc_errors::{
2121} ;
2222use rustc_errors:: { pluralize, struct_span_err, Diagnostic , ErrorGuaranteed } ;
2323use rustc_macros:: { Diagnostic , Subdiagnostic } ;
24+ use rustc_session:: errors:: ExprParenthesesNeeded ;
2425use rustc_span:: source_map:: Spanned ;
2526use rustc_span:: symbol:: { kw, sym, Ident } ;
2627use rustc_span:: { Span , SpanSnippetError , DUMMY_SP } ;
@@ -487,11 +488,24 @@ pub(crate) struct MacroInvocationWithQualifiedPath(#[primary_span] pub Span);
487488
488489#[ derive( Diagnostic ) ]
489490#[ diag( parser:: unexpected_token_after_label) ]
490- pub ( crate ) struct UnexpectedTokenAfterLabel (
491+ pub ( crate ) struct UnexpectedTokenAfterLabel {
491492 #[ primary_span]
492493 #[ label( parser:: unexpected_token_after_label) ]
493- pub Span ,
494- ) ;
494+ pub span : Span ,
495+ #[ suggestion_verbose( parser:: suggestion_remove_label, code = "" ) ]
496+ pub remove_label : Option < Span > ,
497+ #[ subdiagnostic]
498+ pub enclose_in_block : Option < UnexpectedTokenAfterLabelSugg > ,
499+ }
500+
501+ #[ derive( Subdiagnostic ) ]
502+ #[ multipart_suggestion( parser:: suggestion_enclose_in_block, applicability = "machine-applicable" ) ]
503+ pub ( crate ) struct UnexpectedTokenAfterLabelSugg {
504+ #[ suggestion_part( code = "{{ " ) ]
505+ pub left : Span ,
506+ #[ suggestion_part( code = " }}" ) ]
507+ pub right : Span ,
508+ }
495509
496510#[ derive( Diagnostic ) ]
497511#[ diag( parser:: require_colon_after_labeled_expression) ]
@@ -753,6 +767,236 @@ pub(crate) struct UseEmptyBlockNotSemi {
753767 pub span : Span ,
754768}
755769
770+ #[ derive( Diagnostic ) ]
771+ #[ diag( parser:: comparison_interpreted_as_generic) ]
772+ pub ( crate ) struct ComparisonInterpretedAsGeneric {
773+ #[ primary_span]
774+ #[ label( parser:: label_comparison) ]
775+ pub comparison : Span ,
776+ pub typename : String ,
777+ #[ label( parser:: label_args) ]
778+ pub args : Span ,
779+ #[ subdiagnostic]
780+ pub suggestion : ComparisonOrShiftInterpretedAsGenericSugg ,
781+ }
782+
783+ #[ derive( Diagnostic ) ]
784+ #[ diag( parser:: shift_interpreted_as_generic) ]
785+ pub ( crate ) struct ShiftInterpretedAsGeneric {
786+ #[ primary_span]
787+ #[ label( parser:: label_comparison) ]
788+ pub shift : Span ,
789+ pub typename : String ,
790+ #[ label( parser:: label_args) ]
791+ pub args : Span ,
792+ #[ subdiagnostic]
793+ pub suggestion : ComparisonOrShiftInterpretedAsGenericSugg ,
794+ }
795+
796+ #[ derive( Subdiagnostic ) ]
797+ #[ multipart_suggestion( parser:: suggestion, applicability = "machine-applicable" ) ]
798+ pub ( crate ) struct ComparisonOrShiftInterpretedAsGenericSugg {
799+ #[ suggestion_part( code = "(" ) ]
800+ pub left : Span ,
801+ #[ suggestion_part( code = ")" ) ]
802+ pub right : Span ,
803+ }
804+
805+ #[ derive( Diagnostic ) ]
806+ #[ diag( parser:: found_expr_would_be_stmt) ]
807+ pub ( crate ) struct FoundExprWouldBeStmt {
808+ #[ primary_span]
809+ #[ label]
810+ pub span : Span ,
811+ pub token : String ,
812+ #[ subdiagnostic]
813+ pub suggestion : ExprParenthesesNeeded ,
814+ }
815+
816+ #[ derive( Diagnostic ) ]
817+ #[ diag( parser:: leading_plus_not_supported) ]
818+ pub ( crate ) struct LeadingPlusNotSupported {
819+ #[ primary_span]
820+ #[ label]
821+ pub span : Span ,
822+ #[ suggestion_verbose(
823+ parser:: suggestion_remove_plus,
824+ code = "" ,
825+ applicability = "machine-applicable"
826+ ) ]
827+ pub remove_plus : Option < Span > ,
828+ #[ subdiagnostic]
829+ pub add_parentheses : Option < ExprParenthesesNeeded > ,
830+ }
831+
832+ #[ derive( Diagnostic ) ]
833+ #[ diag( parser:: parentheses_with_struct_fields) ]
834+ pub ( crate ) struct ParenthesesWithStructFields {
835+ #[ primary_span]
836+ pub span : Span ,
837+ pub name : String ,
838+ #[ subdiagnostic]
839+ pub braces_for_struct : BracesForStructLiteral ,
840+ #[ subdiagnostic]
841+ pub no_fields_for_fn : NoFieldsForFnCall ,
842+ }
843+
844+ #[ derive( Subdiagnostic ) ]
845+ #[ multipart_suggestion( parser:: suggestion_braces_for_struct, applicability = "maybe-incorrect" ) ]
846+ pub ( crate ) struct BracesForStructLiteral {
847+ #[ suggestion_part( code = " {{ " ) ]
848+ pub first : Span ,
849+ #[ suggestion_part( code = " }}" ) ]
850+ pub second : Span ,
851+ }
852+
853+ #[ derive( Subdiagnostic ) ]
854+ #[ multipart_suggestion( parser:: suggestion_no_fields_for_fn, applicability = "maybe-incorrect" ) ]
855+ pub ( crate ) struct NoFieldsForFnCall {
856+ #[ suggestion_part( code = "" ) ]
857+ pub fields : Vec < Span > ,
858+ }
859+
860+ #[ derive( Diagnostic ) ]
861+ #[ diag( parser:: labeled_loop_in_break) ]
862+ pub ( crate ) struct LabeledLoopInBreak {
863+ #[ primary_span]
864+ pub span : Span ,
865+ #[ subdiagnostic]
866+ pub sub : LabeledLoopInBreakSub ,
867+ }
868+
869+ #[ derive( Subdiagnostic ) ]
870+ #[ multipart_suggestion( parser:: suggestion, applicability = "machine-applicable" ) ]
871+ pub ( crate ) struct LabeledLoopInBreakSub {
872+ #[ suggestion_part( code = "(" ) ]
873+ pub first : Span ,
874+ #[ suggestion_part( code = ")" ) ]
875+ pub second : Span ,
876+ }
877+
878+ #[ derive( Diagnostic ) ]
879+ #[ diag( parser:: array_brackets_instead_of_braces) ]
880+ pub ( crate ) struct ArrayBracketsInsteadOfSpaces {
881+ #[ primary_span]
882+ pub span : Span ,
883+ #[ subdiagnostic]
884+ pub sub : ArrayBracketsInsteadOfSpacesSugg ,
885+ }
886+
887+ #[ derive( Subdiagnostic ) ]
888+ #[ multipart_suggestion( parser:: suggestion, applicability = "maybe-incorrect" ) ]
889+ pub ( crate ) struct ArrayBracketsInsteadOfSpacesSugg {
890+ #[ suggestion_part( code = "[" ) ]
891+ pub left : Span ,
892+ #[ suggestion_part( code = "]" ) ]
893+ pub right : Span ,
894+ }
895+
896+ #[ derive( Diagnostic ) ]
897+ #[ diag( parser:: match_arm_body_without_braces) ]
898+ pub ( crate ) struct MatchArmBodyWithoutBraces {
899+ #[ primary_span]
900+ #[ label( parser:: label_statements) ]
901+ pub statements : Span ,
902+ #[ label( parser:: label_arrow) ]
903+ pub arrow : Span ,
904+ pub num_statements : usize ,
905+ #[ subdiagnostic]
906+ pub sub : MatchArmBodyWithoutBracesSugg ,
907+ }
908+
909+ #[ derive( Subdiagnostic ) ]
910+ pub ( crate ) enum MatchArmBodyWithoutBracesSugg {
911+ #[ multipart_suggestion( parser:: suggestion_add_braces, applicability = "machine-applicable" ) ]
912+ AddBraces {
913+ #[ suggestion_part( code = "{{ " ) ]
914+ left : Span ,
915+ #[ suggestion_part( code = " }}" ) ]
916+ right : Span ,
917+ } ,
918+ #[ suggestion(
919+ parser:: suggestion_use_comma_not_semicolon,
920+ code = "," ,
921+ applicability = "machine-applicable"
922+ ) ]
923+ UseComma {
924+ #[ primary_span]
925+ semicolon : Span ,
926+ } ,
927+ }
928+
929+ #[ derive( Diagnostic ) ]
930+ #[ diag( parser:: struct_literal_not_allowed_here) ]
931+ pub ( crate ) struct StructLiteralNotAllowedHere {
932+ #[ primary_span]
933+ pub span : Span ,
934+ #[ subdiagnostic]
935+ pub sub : StructLiteralNotAllowedHereSugg ,
936+ }
937+
938+ #[ derive( Subdiagnostic ) ]
939+ #[ multipart_suggestion( parser:: suggestion, applicability = "machine-applicable" ) ]
940+ pub ( crate ) struct StructLiteralNotAllowedHereSugg {
941+ #[ suggestion_part( code = "(" ) ]
942+ pub left : Span ,
943+ #[ suggestion_part( code = ")" ) ]
944+ pub right : Span ,
945+ }
946+
947+ #[ derive( Diagnostic ) ]
948+ #[ diag( parser:: invalid_interpolated_expression) ]
949+ pub ( crate ) struct InvalidInterpolatedExpression {
950+ #[ primary_span]
951+ pub span : Span ,
952+ }
953+
954+ #[ derive( Diagnostic ) ]
955+ #[ diag( parser:: hexadecimal_float_literal_not_supported) ]
956+ pub ( crate ) struct HexadecimalFloatLiteralNotSupported {
957+ #[ primary_span]
958+ #[ label( parser:: not_supported) ]
959+ pub span : Span ,
960+ }
961+
962+ #[ derive( Diagnostic ) ]
963+ #[ diag( parser:: octal_float_literal_not_supported) ]
964+ pub ( crate ) struct OctalFloatLiteralNotSupported {
965+ #[ primary_span]
966+ #[ label( parser:: not_supported) ]
967+ pub span : Span ,
968+ }
969+
970+ #[ derive( Diagnostic ) ]
971+ #[ diag( parser:: binary_float_literal_not_supported) ]
972+ pub ( crate ) struct BinaryFloatLiteralNotSupported {
973+ #[ primary_span]
974+ #[ label( parser:: not_supported) ]
975+ pub span : Span ,
976+ }
977+
978+ #[ derive( Diagnostic ) ]
979+ #[ diag( parser:: non_string_abi_literal) ]
980+ pub ( crate ) struct NonStringAbiLiteral {
981+ #[ primary_span]
982+ #[ suggestion( code = "\" C\" " , applicability = "maybe-incorrect" ) ]
983+ pub span : Span ,
984+ }
985+
986+ #[ derive( Diagnostic ) ]
987+ #[ diag( parser:: mismatched_closing_delimiter) ]
988+ pub ( crate ) struct MismatchedClosingDelimiter {
989+ #[ primary_span]
990+ pub spans : Vec < Span > ,
991+ pub delimiter : String ,
992+ #[ label( parser:: label_unmatched) ]
993+ pub unmatched : Span ,
994+ #[ label( parser:: label_opening_candidate) ]
995+ pub opening_candidate : Option < Span > ,
996+ #[ label( parser:: label_unclosed) ]
997+ pub unclosed : Option < Span > ,
998+ }
999+
7561000// SnapshotParser is used to create a snapshot of the parser
7571001// without causing duplicate errors being emitted when the `Parser`
7581002// is dropped.
0 commit comments