about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--library/core/benches/fmt.rs14
-rw-r--r--tests/codegen/fmt_int_no_panic.rs24
2 files changed, 38 insertions, 0 deletions
diff --git a/library/core/benches/fmt.rs b/library/core/benches/fmt.rs
index d1cdb12e50f..a02bd606542 100644
--- a/library/core/benches/fmt.rs
+++ b/library/core/benches/fmt.rs
@@ -148,3 +148,17 @@ fn write_u64_min(bh: &mut Bencher) {
         test::black_box(format!("{}", 0u64));
     });
 }
+
+#[bench]
+fn write_u8_max(bh: &mut Bencher) {
+    bh.iter(|| {
+        test::black_box(format!("{}", u8::MAX));
+    });
+}
+
+#[bench]
+fn write_u8_min(bh: &mut Bencher) {
+    bh.iter(|| {
+        test::black_box(format!("{}", 0u8));
+    });
+}
diff --git a/tests/codegen/fmt_int_no_panic.rs b/tests/codegen/fmt_int_no_panic.rs
new file mode 100644
index 00000000000..efd0530bc88
--- /dev/null
+++ b/tests/codegen/fmt_int_no_panic.rs
@@ -0,0 +1,24 @@
+// Trying to check that formatting u8/u32/u64/etc do not panic.
+//
+// This test does not correctly do so yet.
+
+//@ compile-flags: -O
+
+#![crate_type = "lib"]
+
+// expected to need to write some kind of `impl core::fmt::Write` on a struct like this to avoid
+// unrelated panics if `String::write_str` can't make space..
+// struct CanAlwaysBeWrittenTo;
+
+use std::fmt::Write;
+
+// CHECK-LABEL: @format_int_doesnt_panic
+#[no_mangle]
+pub fn format_int_doesnt_panic(s: &mut String) -> std::fmt::Result {
+    // CHECK-NOT: panic
+    // ... but wait! this will definitely panic if `s.vec.reserve_for_push()` cannot alloc! this
+    // shouldn't pass!
+    write!(s, "{:x}", 0u8)?;
+    write!(s, "{:x}", u8::MAX)?;
+    Ok(())
+}