Rollup merge of #44770 - dtolnay:borrowed, r=sfackler

Less confusing placeholder when RefCell is exclusively borrowed

Based on ExpHP's comment in [*RefCell.borrow_mut get strange result*](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> }
This commit is contained in:
Corey Farwell 2017-09-23 00:29:20 -04:00 committed by GitHub
commit 21c0dfce97
2 changed files with 23 additions and 1 deletions

View File

@ -1700,8 +1700,18 @@ impl<T: ?Sized + Debug> Debug for RefCell<T> {
.finish() .finish()
} }
Err(_) => { 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") f.debug_struct("RefCell")
.field("value", &"<borrowed>") .field("value", &BorrowedPlaceholder)
.finish() .finish()
} }
} }

View File

@ -13,6 +13,7 @@
#![allow(unused_features)] #![allow(unused_features)]
#![feature(box_syntax)] #![feature(box_syntax)]
use std::cell::RefCell;
use std::fmt::{self, Write}; use std::fmt::{self, Write};
use std::usize; use std::usize;
@ -240,6 +241,8 @@ pub fn main() {
// test that trailing commas are acceptable // test that trailing commas are acceptable
format!("{}", "test",); format!("{}", "test",);
format!("{foo}", foo="test",); format!("{foo}", foo="test",);
test_refcell();
} }
// Basic test to make sure that we can invoke the `write!` macro with an // 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()), assert_eq!(format!("{0} {0} {0} {a} {a} {a}", foo(), a=foo()),
"1 1 1 2 2 2".to_string()); "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 }");
}