@@ -1086,10 +1086,12 @@ impl<'a> StringReader<'a> {
1086
1086
Ok ( TokenKind :: lit ( token:: Str , symbol, suffix) )
1087
1087
}
1088
1088
'r' => {
1089
- let ( kind, symbol) = self . scan_raw_string ( ) ;
1089
+ let ( start, end, hash_count) = self . scan_raw_string ( ) ;
1090
+ let symbol = self . name_from_to ( start, end) ;
1091
+ self . validate_raw_str_escape ( start, end) ;
1090
1092
let suffix = self . scan_optional_raw_name ( ) ;
1091
1093
1092
- Ok ( TokenKind :: lit ( kind , symbol, suffix) )
1094
+ Ok ( TokenKind :: lit ( token :: StrRaw ( hash_count ) , symbol, suffix) )
1093
1095
}
1094
1096
'-' => {
1095
1097
if self . nextch_is ( '>' ) {
@@ -1243,7 +1245,7 @@ impl<'a> StringReader<'a> {
1243
1245
id
1244
1246
}
1245
1247
1246
- fn scan_raw_string ( & mut self ) -> ( token :: LitKind , Symbol ) {
1248
+ fn scan_raw_string ( & mut self ) -> ( BytePos , BytePos , u16 ) {
1247
1249
let start_bpos = self . pos ;
1248
1250
self . bump ( ) ;
1249
1251
let mut hash_count: u16 = 0 ;
@@ -1273,7 +1275,6 @@ impl<'a> StringReader<'a> {
1273
1275
self . bump ( ) ;
1274
1276
let content_start_bpos = self . pos ;
1275
1277
let mut content_end_bpos;
1276
- let mut valid = true ;
1277
1278
' outer: loop {
1278
1279
match self . ch {
1279
1280
None => {
@@ -1289,29 +1290,14 @@ impl<'a> StringReader<'a> {
1289
1290
}
1290
1291
break ;
1291
1292
}
1292
- Some ( c) => {
1293
- if c == '\r' && !self . nextch_is ( '\n' ) {
1294
- let last_bpos = self . pos ;
1295
- self . err_span_ ( start_bpos,
1296
- last_bpos,
1297
- "bare CR not allowed in raw string, use \\ r \
1298
- instead") ;
1299
- valid = false ;
1300
- }
1301
- }
1293
+ _ => ( ) ,
1302
1294
}
1303
1295
self . bump ( ) ;
1304
1296
}
1305
1297
1306
1298
self . bump ( ) ;
1307
1299
1308
- let symbol = if valid {
1309
- self . name_from_to ( content_start_bpos, content_end_bpos)
1310
- } else {
1311
- Symbol :: intern ( "??" )
1312
- } ;
1313
-
1314
- ( token:: StrRaw ( hash_count) , symbol)
1300
+ ( content_start_bpos, content_end_bpos, hash_count)
1315
1301
}
1316
1302
1317
1303
fn scan_raw_byte_string ( & mut self ) -> ( token:: LitKind , Symbol ) {
@@ -1421,6 +1407,23 @@ impl<'a> StringReader<'a> {
1421
1407
} ) ;
1422
1408
}
1423
1409
1410
+ fn validate_raw_str_escape ( & self , content_start : BytePos , content_end : BytePos ) {
1411
+ self . with_str_from_to ( content_start, content_end, |lit : & str | {
1412
+ unescape:: unescape_raw_str ( lit, & mut |range, c| {
1413
+ if let Err ( err) = c {
1414
+ emit_unescape_error (
1415
+ & self . sess . span_diagnostic ,
1416
+ lit,
1417
+ self . mk_sp ( content_start - BytePos ( 1 ) , content_end + BytePos ( 1 ) ) ,
1418
+ unescape:: Mode :: Str ,
1419
+ range,
1420
+ err,
1421
+ )
1422
+ }
1423
+ } )
1424
+ } ) ;
1425
+ }
1426
+
1424
1427
fn validate_byte_str_escape ( & self , start_with_quote : BytePos ) {
1425
1428
self . with_str_from_to ( start_with_quote + BytePos ( 1 ) , self . pos - BytePos ( 1 ) , |lit| {
1426
1429
unescape:: unescape_byte_str ( lit, & mut |range, c| {
0 commit comments