@@ -33,7 +33,7 @@ pub mod attr;
3333pub mod classify;
3434
3535pub ( 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} ;
3737
3838pub ( crate ) mod unescape_error_reporting;
3939
@@ -355,16 +355,14 @@ crate fn lit_token(lit: token::Lit, suf: Option<Symbol>, diag: Option<(Span, &Ha
355355 token:: Byte ( i) => {
356356 let lit_kind = match unescape_byte ( & i. as_str ( ) ) {
357357 Ok ( c) => LitKind :: Byte ( c) ,
358- Err ( ( _, EscapeError :: MoreThanOneChar ) ) => LitKind :: Err ( i) ,
359- Err ( _) => LitKind :: Byte ( 0 ) ,
358+ Err ( _) => LitKind :: Err ( i) ,
360359 } ;
361360 ( true , Some ( lit_kind) )
362361 } ,
363362 token:: Char ( i) => {
364363 let lit_kind = match unescape_char ( & i. as_str ( ) ) {
365364 Ok ( c) => LitKind :: Char ( c) ,
366- Err ( ( _, EscapeError :: MoreThanOneChar ) ) => LitKind :: Err ( i) ,
367- Err ( _) => LitKind :: Char ( '\u{FFFD}' ) ,
365+ Err ( _) => LitKind :: Err ( i) ,
368366 } ;
369367 ( true , Some ( lit_kind) )
370368 } ,
@@ -380,17 +378,22 @@ crate fn lit_token(lit: token::Lit, suf: Option<Symbol>, diag: Option<(Span, &Ha
380378 // reuse the symbol from the Token. Otherwise, we must generate a
381379 // new symbol because the string in the LitKind is different to the
382380 // string in the Token.
381+ let mut has_error = false ;
383382 let s = & sym. as_str ( ) ;
384383 if s. as_bytes ( ) . iter ( ) . any ( |& c| c == b'\\' || c == b'\r' ) {
385384 let mut buf = String :: with_capacity ( s. len ( ) ) ;
386385 unescape_str ( s, & mut |_, unescaped_char| {
387386 match unescaped_char {
388387 Ok ( c) => buf. push ( c) ,
389- Err ( _) => buf . push ( '\u{FFFD}' ) ,
388+ Err ( _) => has_error = true ,
390389 }
391390 } ) ;
391+ if has_error {
392+ return ( true , Some ( LitKind :: Err ( sym) ) ) ;
393+ }
392394 sym = Symbol :: intern ( & buf)
393395 }
396+
394397 ( true , Some ( LitKind :: Str ( sym, ast:: StrStyle :: Cooked ) ) )
395398 }
396399 token:: StrRaw ( mut sym, n) => {
@@ -404,12 +407,16 @@ crate fn lit_token(lit: token::Lit, suf: Option<Symbol>, diag: Option<(Span, &Ha
404407 token:: ByteStr ( i) => {
405408 let s = & i. as_str ( ) ;
406409 let mut buf = Vec :: with_capacity ( s. len ( ) ) ;
410+ let mut has_error = false ;
407411 unescape_byte_str ( s, & mut |_, unescaped_byte| {
408412 match unescaped_byte {
409413 Ok ( c) => buf. push ( c) ,
410- Err ( _) => buf . push ( 0 ) ,
414+ Err ( _) => has_error = true ,
411415 }
412416 } ) ;
417+ if has_error {
418+ return ( true , Some ( LitKind :: Err ( i) ) ) ;
419+ }
413420 buf. shrink_to_fit ( ) ;
414421 ( true , Some ( LitKind :: ByteStr ( Lrc :: new ( buf) ) ) )
415422 }
0 commit comments