about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2018-04-06 14:20:22 -0700
committerAlex Crichton <alex@alexcrichton.com>2018-04-13 07:04:24 -0700
commit2bb5b5c07c5cd015c567ce86eae07e92db07bb8a (patch)
treef3e7610018b5e4b9085c42d62fe374b175f4e878 /src/libcore
parent66c5e3ffb2b7a0804ceb989b9dc9138a7758bfd6 (diff)
downloadrust-2bb5b5c07c5cd015c567ce86eae07e92db07bb8a.tar.gz
rust-2bb5b5c07c5cd015c567ce86eae07e92db07bb8a.zip
core: Remove an implicit panic from Formatter::pad
The expression `&s[..i]` in general can panic if `i` is out of bounds or not on
a character boundary for a string, and this caused the codegen for
`Formatter::pad` to be a bit larger than it otherwise needed to be. This commit
replaces this with `s.get(..i).unwrap_or(&s)` which while having different
behavior if `i` is out of bounds has a much smaller code footprint and otherwise
avoids the need for `unsafe` code.
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/fmt/mod.rs6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/libcore/fmt/mod.rs b/src/libcore/fmt/mod.rs
index d55219d7226..277bef2bf66 100644
--- a/src/libcore/fmt/mod.rs
+++ b/src/libcore/fmt/mod.rs
@@ -1212,7 +1212,11 @@ impl<'a> Formatter<'a> {
             // truncation. However other flags like `fill`, `width` and `align`
             // must act as always.
             if let Some((i, _)) = s.char_indices().skip(max).next() {
-                &s[..i]
+                // LLVM here can't prove that `..i` won't panic `&s[..i]`, but
+                // we know that it can't panic. Use `get` + `unwrap_or` to avoid
+                // `unsafe` and otherwise don't emit any panic-related code
+                // here.
+                s.get(..i).unwrap_or(&s)
             } else {
                 &s
             }