From 9125dd74bdbd0c41d6f8341366992db514e56246 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Thu, 25 Nov 2021 18:27:36 -0800 Subject: [PATCH] Eliminate an unreachable codepath from String::from_utf8_lossy Utf8Lossy's Iterator implementation ensures that only the final chunk has an empty slice for broken. Thus the only way the first chunk could have an empty broken is if it is the final chunk, i.e. there is only one chunk total. And the only way that there could be one chunk total is if the whole input is valid utf8 and non-empty. That condition has already been handled by an early return, so at the point that the first REPLACEMENT is being pushed, it's impossible for first_broken to be empty. --- library/alloc/src/string.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/library/alloc/src/string.rs b/library/alloc/src/string.rs index 906b0187f7bab..4f926d99c6dbc 100644 --- a/library/alloc/src/string.rs +++ b/library/alloc/src/string.rs @@ -558,13 +558,13 @@ impl String { pub fn from_utf8_lossy(v: &[u8]) -> Cow<'_, str> { let mut iter = lossy::Utf8Lossy::from_bytes(v).chunks(); - let (first_valid, first_broken) = if let Some(chunk) = iter.next() { + let first_valid = if let Some(chunk) = iter.next() { let lossy::Utf8LossyChunk { valid, broken } = chunk; - if valid.len() == v.len() { - debug_assert!(broken.is_empty()); + if broken.is_empty() { + debug_assert_eq!(valid.len(), v.len()); return Cow::Borrowed(valid); } - (valid, broken) + valid } else { return Cow::Borrowed(""); }; @@ -573,9 +573,7 @@ impl String { let mut res = String::with_capacity(v.len()); res.push_str(first_valid); - if !first_broken.is_empty() { - res.push_str(REPLACEMENT); - } + res.push_str(REPLACEMENT); for lossy::Utf8LossyChunk { valid, broken } in iter { res.push_str(valid);