@@ -742,6 +742,7 @@ impl<'a> StringReader<'a> {
742742 let start_bpos = self . last_pos ;
743743 let mut accum_int = 0 ;
744744
745+ let mut valid = true ;
745746 for _ in 0 ..n_digits {
746747 if self . is_eof ( ) {
747748 let last_bpos = self . last_pos ;
@@ -750,13 +751,16 @@ impl<'a> StringReader<'a> {
750751 if self . curr_is ( delim) {
751752 let last_bpos = self . last_pos ;
752753 self . err_span_ ( start_bpos, last_bpos, "numeric character escape is too short" ) ;
754+ valid = false ;
753755 break ;
754756 }
755757 let c = self . curr . unwrap_or ( '\x00' ) ;
756758 accum_int *= 16 ;
757759 accum_int += c. to_digit ( 16 ) . unwrap_or_else ( || {
758760 self . err_span_char ( self . last_pos , self . pos ,
759761 "illegal character in numeric character escape" , c) ;
762+
763+ valid = false ;
760764 0
761765 } ) ;
762766 self . bump ( ) ;
@@ -767,10 +771,11 @@ impl<'a> StringReader<'a> {
767771 self . last_pos ,
768772 "this form of character escape may only be used \
769773 with characters in the range [\\ x00-\\ x7f]") ;
774+ valid = false ;
770775 }
771776
772777 match char:: from_u32 ( accum_int) {
773- Some ( _) => true ,
778+ Some ( _) => valid ,
774779 None => {
775780 let last_bpos = self . last_pos ;
776781 self . err_span_ ( start_bpos, last_bpos, "illegal numeric character escape" ) ;
@@ -799,7 +804,18 @@ impl<'a> StringReader<'a> {
799804 'n' | 'r' | 't' | '\\' | '\'' | '"' | '0' => true ,
800805 'x' => self . scan_byte_escape ( delim, !ascii_only) ,
801806 'u' if self . curr_is ( '{' ) => {
802- self . scan_unicode_escape ( delim)
807+ let valid = self . scan_unicode_escape ( delim) ;
808+ if valid && ascii_only {
809+ self . err_span_ (
810+ escaped_pos,
811+ self . last_pos ,
812+ "Unicode escape sequences cannot be used as byte or in \
813+ byte string."
814+ ) ;
815+ false
816+ } else {
817+ valid
818+ }
803819 }
804820 '\n' if delim == '"' => {
805821 self . consume_whitespace ( ) ;
@@ -869,6 +885,7 @@ impl<'a> StringReader<'a> {
869885 let start_bpos = self . last_pos ;
870886 let mut count = 0 ;
871887 let mut accum_int = 0 ;
888+ let mut valid = true ;
872889
873890 while !self . curr_is ( '}' ) && count <= 6 {
874891 let c = match self . curr {
@@ -884,29 +901,30 @@ impl<'a> StringReader<'a> {
884901 self . fatal_span_ ( self . last_pos , self . pos ,
885902 "unterminated unicode escape (needed a `}`)" ) ;
886903 } else {
887- self . fatal_span_char ( self . last_pos , self . pos ,
904+ self . err_span_char ( self . last_pos , self . pos ,
888905 "illegal character in unicode escape" , c) ;
889906 }
907+ valid = false ;
908+ 0
890909 } ) ;
891910 self . bump ( ) ;
892911 count += 1 ;
893912 }
894913
895914 if count > 6 {
896- self . fatal_span_ ( start_bpos, self . last_pos ,
915+ self . err_span_ ( start_bpos, self . last_pos ,
897916 "overlong unicode escape (can have at most 6 hex digits)" ) ;
917+ valid = false ;
898918 }
899919
900920 self . bump ( ) ; // past the ending }
901921
902- let mut valid = count >= 1 && count <= 6 ;
903- if char :: from_u32 ( accum_int ) . is_none ( ) {
904- valid = false ;
922+ if valid && ( char :: from_u32 ( accum_int ) . is_none ( ) || count == 0 ) {
923+ self . err_span_ ( start_bpos , self . last_pos , "illegal unicode character escape" ) ;
924+ valid= false ;
905925 }
906926
907- if !valid {
908- self . fatal_span_ ( start_bpos, self . last_pos , "illegal unicode character escape" ) ;
909- }
927+
910928 valid
911929 }
912930
@@ -1330,7 +1348,7 @@ impl<'a> StringReader<'a> {
13301348 "unterminated byte constant" . to_string ( ) ) ;
13311349 }
13321350
1333- let id = if valid { self . name_from ( start) } else { token:: intern ( "?? " ) } ;
1351+ let id = if valid { self . name_from ( start) } else { token:: intern ( "?" ) } ;
13341352 self . bump ( ) ; // advance curr past token
13351353 return token:: Byte ( id) ;
13361354 }
0 commit comments