@@ -673,7 +673,7 @@ impl<'a> Parser<'a> {
673
673
let expected = expected. unwrap_or ( "pattern" ) ;
674
674
let msg = format ! ( "expected {}, found {}" , expected, super :: token_descr( & self . token) ) ;
675
675
676
- let mut err = self . fatal ( & msg) ;
676
+ let mut err = self . struct_span_err ( self . token . span , & msg) ;
677
677
err. span_label ( self . token . span , format ! ( "expected {}" , expected) ) ;
678
678
679
679
let sp = self . sess . source_map ( ) . start_point ( self . token . span ) ;
@@ -807,12 +807,8 @@ impl<'a> Parser<'a> {
807
807
/// Parse a struct ("record") pattern (e.g. `Foo { ... }` or `Foo::Bar { ... }`).
808
808
fn parse_pat_struct ( & mut self , qself : Option < QSelf > , path : Path ) -> PResult < ' a , PatKind > {
809
809
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, "{" ) ;
814
811
}
815
-
816
812
self . bump ( ) ;
817
813
let ( fields, etc) = self . parse_pat_fields ( ) . unwrap_or_else ( |mut e| {
818
814
e. emit ( ) ;
@@ -826,15 +822,22 @@ impl<'a> Parser<'a> {
826
822
/// Parse tuple struct or tuple variant pattern (e.g. `Foo(...)` or `Foo::Bar(...)`).
827
823
fn parse_pat_tuple_struct ( & mut self , qself : Option < QSelf > , path : Path ) -> PResult < ' a , PatKind > {
828
824
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, "(" ) ;
833
826
}
834
827
let ( fields, _) = self . parse_paren_comma_seq ( |p| p. parse_pat_with_or_inner ( ) ) ?;
835
828
Ok ( PatKind :: TupleStruct ( path, fields) )
836
829
}
837
830
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
+
838
841
/// Parses the fields of a struct-like pattern.
839
842
fn parse_pat_fields ( & mut self ) -> PResult < ' a , ( Vec < FieldPat > , bool ) > {
840
843
let mut fields = Vec :: new ( ) ;
@@ -877,7 +880,8 @@ impl<'a> Parser<'a> {
877
880
break ;
878
881
}
879
882
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) ;
881
885
882
886
err. span_label ( self . token . span , "expected `}`" ) ;
883
887
let mut comma_sp = None ;
0 commit comments