about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorSimon Sapin <simon.sapin@exyr.org>2017-02-26 19:42:11 +0100
committerSimon Sapin <simon.sapin@exyr.org>2017-03-01 23:47:59 +0100
commitf2017f4561852bf65c39fc498cf035a5f385a065 (patch)
tree41b700ec62f2195ddeabc08b9d717131e8377aeb /src
parent44e9e0a6cf2188c404b9420d49de05fa29f3ea19 (diff)
downloadrust-f2017f4561852bf65c39fc498cf035a5f385a065.tar.gz
rust-f2017f4561852bf65c39fc498cf035a5f385a065.zip
Panic on errors in `format!` or `<T: Display>::to_string`
… instead of silently ignoring a result.

`fmt::Write for String` never returns `Err`,
so implementations of `Display` (or other traits of that family)
never should either.

Fixes #40103
Diffstat (limited to 'src')
-rw-r--r--src/libcollections/fmt.rs3
-rw-r--r--src/libcollections/macros.rs6
-rw-r--r--src/libcollections/string.rs9
3 files changed, 16 insertions, 2 deletions
diff --git a/src/libcollections/fmt.rs b/src/libcollections/fmt.rs
index 079541235a2..dfd292176d2 100644
--- a/src/libcollections/fmt.rs
+++ b/src/libcollections/fmt.rs
@@ -524,6 +524,7 @@ use string;
 pub fn format(args: Arguments) -> string::String {
     let capacity = args.estimated_capacity();
     let mut output = string::String::with_capacity(capacity);
-    let _ = output.write_fmt(args);
+    output.write_fmt(args)
+          .expect("a formatting trait implementation returned an error");
     output
 }
diff --git a/src/libcollections/macros.rs b/src/libcollections/macros.rs
index 3115be00a4d..396a917dfde 100644
--- a/src/libcollections/macros.rs
+++ b/src/libcollections/macros.rs
@@ -72,6 +72,12 @@ macro_rules! vec {
 ///
 /// [fmt]: ../std/fmt/index.html
 ///
+/// # Panics
+///
+/// `format!` panics if a formatting trait implementation returns an error.
+/// This indicates an incorrect implementation
+/// since `fmt::Write for String` never returns an error itself.
+///
 /// # Examples
 ///
 /// ```
diff --git a/src/libcollections/string.rs b/src/libcollections/string.rs
index 10bc5ab88c9..a8942619cea 100644
--- a/src/libcollections/string.rs
+++ b/src/libcollections/string.rs
@@ -1888,13 +1888,20 @@ pub trait ToString {
     fn to_string(&self) -> String;
 }
 
+/// # Panics
+///
+/// In this implementation, the `to_string` method panics
+/// if the `Display` implementation returns an error.
+/// This indicates an incorrect `Display` implementation
+/// since `fmt::Write for String` never returns an error itself.
 #[stable(feature = "rust1", since = "1.0.0")]
 impl<T: fmt::Display + ?Sized> ToString for T {
     #[inline]
     default fn to_string(&self) -> String {
         use core::fmt::Write;
         let mut buf = String::new();
-        let _ = buf.write_fmt(format_args!("{}", self));
+        buf.write_fmt(format_args!("{}", self))
+           .expect("a Display implementation return an error unexpectedly");
         buf.shrink_to_fit();
         buf
     }