@@ -742,6 +742,7 @@ impl<'a> StringReader<'a> {
742
742
let start_bpos = self . last_pos ;
743
743
let mut accum_int = 0 ;
744
744
745
+ let mut valid = true ;
745
746
for _ in 0 ..n_digits {
746
747
if self . is_eof ( ) {
747
748
let last_bpos = self . last_pos ;
@@ -750,13 +751,16 @@ impl<'a> StringReader<'a> {
750
751
if self . curr_is ( delim) {
751
752
let last_bpos = self . last_pos ;
752
753
self . err_span_ ( start_bpos, last_bpos, "numeric character escape is too short" ) ;
754
+ valid = false ;
753
755
break ;
754
756
}
755
757
let c = self . curr . unwrap_or ( '\x00' ) ;
756
758
accum_int *= 16 ;
757
759
accum_int += c. to_digit ( 16 ) . unwrap_or_else ( || {
758
760
self . err_span_char ( self . last_pos , self . pos ,
759
761
"illegal character in numeric character escape" , c) ;
762
+
763
+ valid = false ;
760
764
0
761
765
} ) ;
762
766
self . bump ( ) ;
@@ -767,10 +771,11 @@ impl<'a> StringReader<'a> {
767
771
self . last_pos ,
768
772
"this form of character escape may only be used \
769
773
with characters in the range [\\ x00-\\ x7f]") ;
774
+ valid = false ;
770
775
}
771
776
772
777
match char:: from_u32 ( accum_int) {
773
- Some ( _) => true ,
778
+ Some ( _) => valid ,
774
779
None => {
775
780
let last_bpos = self . last_pos ;
776
781
self . err_span_ ( start_bpos, last_bpos, "illegal numeric character escape" ) ;
@@ -799,7 +804,18 @@ impl<'a> StringReader<'a> {
799
804
'n' | 'r' | 't' | '\\' | '\'' | '"' | '0' => true ,
800
805
'x' => self . scan_byte_escape ( delim, !ascii_only) ,
801
806
'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 a byte or in \
813
+ a byte string"
814
+ ) ;
815
+ false
816
+ } else {
817
+ valid
818
+ }
803
819
}
804
820
'\n' if delim == '"' => {
805
821
self . consume_whitespace ( ) ;
@@ -869,6 +885,7 @@ impl<'a> StringReader<'a> {
869
885
let start_bpos = self . last_pos ;
870
886
let mut count = 0 ;
871
887
let mut accum_int = 0 ;
888
+ let mut valid = true ;
872
889
873
890
while !self . curr_is ( '}' ) && count <= 6 {
874
891
let c = match self . curr {
@@ -884,29 +901,30 @@ impl<'a> StringReader<'a> {
884
901
self . fatal_span_ ( self . last_pos , self . pos ,
885
902
"unterminated unicode escape (needed a `}`)" ) ;
886
903
} else {
887
- self . fatal_span_char ( self . last_pos , self . pos ,
904
+ self . err_span_char ( self . last_pos , self . pos ,
888
905
"illegal character in unicode escape" , c) ;
889
906
}
907
+ valid = false ;
908
+ 0
890
909
} ) ;
891
910
self . bump ( ) ;
892
911
count += 1 ;
893
912
}
894
913
895
914
if count > 6 {
896
- self . fatal_span_ ( start_bpos, self . last_pos ,
915
+ self . err_span_ ( start_bpos, self . last_pos ,
897
916
"overlong unicode escape (can have at most 6 hex digits)" ) ;
917
+ valid = false ;
898
918
}
899
919
900
920
self . bump ( ) ; // past the ending }
901
921
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 ;
905
925
}
906
926
907
- if !valid {
908
- self . fatal_span_ ( start_bpos, self . last_pos , "illegal unicode character escape" ) ;
909
- }
927
+
910
928
valid
911
929
}
912
930
@@ -1330,7 +1348,7 @@ impl<'a> StringReader<'a> {
1330
1348
"unterminated byte constant" . to_string ( ) ) ;
1331
1349
}
1332
1350
1333
- let id = if valid { self . name_from ( start) } else { token:: intern ( "?? " ) } ;
1351
+ let id = if valid { self . name_from ( start) } else { token:: intern ( "?" ) } ;
1334
1352
self . bump ( ) ; // advance curr past token
1335
1353
return token:: Byte ( id) ;
1336
1354
}
0 commit comments