diff options
| author | David Tolnay <dtolnay@gmail.com> | 2017-09-21 21:52:59 -0700 |
|---|---|---|
| committer | David Tolnay <dtolnay@gmail.com> | 2017-09-21 21:53:04 -0700 |
| commit | f9d92d219d266c3161367cc694743e9c0e6d55c7 (patch) | |
| tree | 3107941ae2fa191845c08bf1eebf6c84e5a03bd4 | |
| parent | 17600c1ea77ad8709ea072ad1b258bf9398b9d38 (diff) | |
| download | rust-f9d92d219d266c3161367cc694743e9c0e6d55c7.tar.gz rust-f9d92d219d266c3161367cc694743e9c0e6d55c7.zip | |
Less confusing placeholder when RefCell is exclusively borrowed
Based on ExpHP's comment in
https://users.rust-lang.org/t/refcell-borrow-mut-get-strange-result/12994
> it would perhaps be nicer if it didn't put something that could be
> misinterpreted as a valid string value
The previous Debug implementation would show:
RefCell { value: "<borrowed>" }
The new one is:
RefCell { value: <borrowed> }
| -rw-r--r-- | src/libcore/fmt/mod.rs | 12 | ||||
| -rw-r--r-- | src/test/run-pass/ifmt.rs | 12 |
2 files changed, 23 insertions, 1 deletions
diff --git a/src/libcore/fmt/mod.rs b/src/libcore/fmt/mod.rs index cf6262bda97..b84a1deb611 100644 --- a/src/libcore/fmt/mod.rs +++ b/src/libcore/fmt/mod.rs @@ -1700,8 +1700,18 @@ impl<T: ?Sized + Debug> Debug for RefCell<T> { .finish() } Err(_) => { + // The RefCell is mutably borrowed so we can't look at its value + // here. Show a placeholder instead. + struct BorrowedPlaceholder; + + impl Debug for BorrowedPlaceholder { + fn fmt(&self, f: &mut Formatter) -> Result { + f.write_str("<borrowed>") + } + } + f.debug_struct("RefCell") - .field("value", &"<borrowed>") + .field("value", &BorrowedPlaceholder) .finish() } } diff --git a/src/test/run-pass/ifmt.rs b/src/test/run-pass/ifmt.rs index cef2f879f9c..08e9990511f 100644 --- a/src/test/run-pass/ifmt.rs +++ b/src/test/run-pass/ifmt.rs @@ -13,6 +13,7 @@ #![allow(unused_features)] #![feature(box_syntax)] +use std::cell::RefCell; use std::fmt::{self, Write}; use std::usize; @@ -240,6 +241,8 @@ pub fn main() { // test that trailing commas are acceptable format!("{}", "test",); format!("{foo}", foo="test",); + + test_refcell(); } // Basic test to make sure that we can invoke the `write!` macro with an @@ -319,3 +322,12 @@ fn test_once() { assert_eq!(format!("{0} {0} {0} {a} {a} {a}", foo(), a=foo()), "1 1 1 2 2 2".to_string()); } + +fn test_refcell() { + let refcell = RefCell::new(5); + assert_eq!(format!("{:?}", refcell), "RefCell { value: 5 }"); + let borrow = refcell.borrow_mut(); + assert_eq!(format!("{:?}", refcell), "RefCell { value: <borrowed> }"); + drop(borrow); + assert_eq!(format!("{:?}", refcell), "RefCell { value: 5 }"); +} |
