@@ -673,7 +673,7 @@ impl<'a> Parser<'a> {
673673 let expected = expected. unwrap_or ( "pattern" ) ;
674674 let msg = format ! ( "expected {}, found {}" , expected, super :: token_descr( & self . token) ) ;
675675
676- let mut err = self . fatal ( & msg) ;
676+ let mut err = self . struct_span_err ( self . token . span , & msg) ;
677677 err. span_label ( self . token . span , format ! ( "expected {}" , expected) ) ;
678678
679679 let sp = self . sess . source_map ( ) . start_point ( self . token . span ) ;
@@ -807,12 +807,8 @@ impl<'a> Parser<'a> {
807807 /// Parse a struct ("record") pattern (e.g. `Foo { ... }` or `Foo::Bar { ... }`).
808808 fn parse_pat_struct ( & mut self , qself : Option < QSelf > , path : Path ) -> PResult < ' a , PatKind > {
809809 if qself. is_some ( ) {
810- let msg = "unexpected `{` after qualified path" ;
811- let mut err = self . fatal ( msg) ;
812- err. span_label ( self . token . span , msg) ;
813- return Err ( err) ;
810+ return self . error_qpath_before_pat ( & path, "{" ) ;
814811 }
815-
816812 self . bump ( ) ;
817813 let ( fields, etc) = self . parse_pat_fields ( ) . unwrap_or_else ( |mut e| {
818814 e. emit ( ) ;
@@ -826,15 +822,22 @@ impl<'a> Parser<'a> {
826822 /// Parse tuple struct or tuple variant pattern (e.g. `Foo(...)` or `Foo::Bar(...)`).
827823 fn parse_pat_tuple_struct ( & mut self , qself : Option < QSelf > , path : Path ) -> PResult < ' a , PatKind > {
828824 if qself. is_some ( ) {
829- let msg = "unexpected `(` after qualified path" ;
830- let mut err = self . fatal ( msg) ;
831- err. span_label ( self . token . span , msg) ;
832- return Err ( err) ;
825+ return self . error_qpath_before_pat ( & path, "(" ) ;
833826 }
834827 let ( fields, _) = self . parse_paren_comma_seq ( |p| p. parse_pat_with_or_inner ( ) ) ?;
835828 Ok ( PatKind :: TupleStruct ( path, fields) )
836829 }
837830
831+ /// Error when there's a qualified path, e.g. `<Foo as Bar>::Baz`
832+ /// as the path of e.g., a tuple or record struct pattern.
833+ fn error_qpath_before_pat ( & mut self , path : & Path , token : & str ) -> PResult < ' a , PatKind > {
834+ let msg = & format ! ( "unexpected `{}` after qualified path" , token) ;
835+ let mut err = self . struct_span_err ( self . token . span , msg) ;
836+ err. span_label ( self . token . span , msg) ;
837+ err. span_label ( path. span , "the qualified path" ) ;
838+ Err ( err)
839+ }
840+
838841 /// Parses the fields of a struct-like pattern.
839842 fn parse_pat_fields ( & mut self ) -> PResult < ' a , ( Vec < FieldPat > , bool ) > {
840843 let mut fields = Vec :: new ( ) ;
@@ -877,7 +880,8 @@ impl<'a> Parser<'a> {
877880 break ;
878881 }
879882 let token_str = super :: token_descr ( & self . token ) ;
880- let mut err = self . fatal ( & format ! ( "expected `}}`, found {}" , token_str) ) ;
883+ let msg = & format ! ( "expected `}}`, found {}" , token_str) ;
884+ let mut err = self . struct_span_err ( self . token . span , msg) ;
881885
882886 err. span_label ( self . token . span , "expected `}`" ) ;
883887 let mut comma_sp = None ;
0 commit comments