about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Tolnay <dtolnay@gmail.com>2021-11-25 18:27:36 -0800
committerDavid Tolnay <dtolnay@gmail.com>2021-11-25 18:27:40 -0800
commit9125dd74bdbd0c41d6f8341366992db514e56246 (patch)
tree08f4cca7edcdc579ee9c59ba1af5706a1966d5a9
parentdd549dcab404ec4c7d07b5a83aca5bdd7171138f (diff)
downloadrust-9125dd74bdbd0c41d6f8341366992db514e56246.tar.gz
rust-9125dd74bdbd0c41d6f8341366992db514e56246.zip
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.
-rw-r--r--library/alloc/src/string.rs12
1 files changed, 5 insertions, 7 deletions
diff --git a/library/alloc/src/string.rs b/library/alloc/src/string.rs
index 906b0187f7b..4f926d99c6d 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);