@@ -33,7 +33,7 @@ pub mod attr;
33
33
pub mod classify;
34
34
35
35
pub ( crate ) mod unescape;
36
- use unescape:: { unescape_str, unescape_char, unescape_byte_str, unescape_byte, EscapeError } ;
36
+ use unescape:: { unescape_str, unescape_char, unescape_byte_str, unescape_byte} ;
37
37
38
38
pub ( crate ) mod unescape_error_reporting;
39
39
@@ -355,16 +355,14 @@ crate fn lit_token(lit: token::Lit, suf: Option<Symbol>, diag: Option<(Span, &Ha
355
355
token:: Byte ( i) => {
356
356
let lit_kind = match unescape_byte ( & i. as_str ( ) ) {
357
357
Ok ( c) => LitKind :: Byte ( c) ,
358
- Err ( ( _, EscapeError :: MoreThanOneChar ) ) => LitKind :: Err ( i) ,
359
- Err ( _) => LitKind :: Byte ( 0 ) ,
358
+ Err ( _) => LitKind :: Err ( i) ,
360
359
} ;
361
360
( true , Some ( lit_kind) )
362
361
} ,
363
362
token:: Char ( i) => {
364
363
let lit_kind = match unescape_char ( & i. as_str ( ) ) {
365
364
Ok ( c) => LitKind :: Char ( c) ,
366
- Err ( ( _, EscapeError :: MoreThanOneChar ) ) => LitKind :: Err ( i) ,
367
- Err ( _) => LitKind :: Char ( '\u{FFFD}' ) ,
365
+ Err ( _) => LitKind :: Err ( i) ,
368
366
} ;
369
367
( true , Some ( lit_kind) )
370
368
} ,
@@ -380,17 +378,22 @@ crate fn lit_token(lit: token::Lit, suf: Option<Symbol>, diag: Option<(Span, &Ha
380
378
// reuse the symbol from the Token. Otherwise, we must generate a
381
379
// new symbol because the string in the LitKind is different to the
382
380
// string in the Token.
381
+ let mut has_error = false ;
383
382
let s = & sym. as_str ( ) ;
384
383
if s. as_bytes ( ) . iter ( ) . any ( |& c| c == b'\\' || c == b'\r' ) {
385
384
let mut buf = String :: with_capacity ( s. len ( ) ) ;
386
385
unescape_str ( s, & mut |_, unescaped_char| {
387
386
match unescaped_char {
388
387
Ok ( c) => buf. push ( c) ,
389
- Err ( _) => buf . push ( '\u{FFFD}' ) ,
388
+ Err ( _) => has_error = true ,
390
389
}
391
390
} ) ;
391
+ if has_error {
392
+ return ( true , Some ( LitKind :: Err ( sym) ) ) ;
393
+ }
392
394
sym = Symbol :: intern ( & buf)
393
395
}
396
+
394
397
( true , Some ( LitKind :: Str ( sym, ast:: StrStyle :: Cooked ) ) )
395
398
}
396
399
token:: StrRaw ( mut sym, n) => {
@@ -404,12 +407,16 @@ crate fn lit_token(lit: token::Lit, suf: Option<Symbol>, diag: Option<(Span, &Ha
404
407
token:: ByteStr ( i) => {
405
408
let s = & i. as_str ( ) ;
406
409
let mut buf = Vec :: with_capacity ( s. len ( ) ) ;
410
+ let mut has_error = false ;
407
411
unescape_byte_str ( s, & mut |_, unescaped_byte| {
408
412
match unescaped_byte {
409
413
Ok ( c) => buf. push ( c) ,
410
- Err ( _) => buf . push ( 0 ) ,
414
+ Err ( _) => has_error = true ,
411
415
}
412
416
} ) ;
417
+ if has_error {
418
+ return ( true , Some ( LitKind :: Err ( i) ) ) ;
419
+ }
413
420
buf. shrink_to_fit ( ) ;
414
421
( true , Some ( LitKind :: ByteStr ( Lrc :: new ( buf) ) ) )
415
422
}
0 commit comments