Skip to content

Commit 5508583

Browse files
committed
core: Make Debug impl of raw pointers print metadata if present
Make Rust pointers less magic by including metadata information in their `Debug` output. This does not break Rust stability guarantees because `Debug` output is explicitly exempted from stability: https://doc.rust-lang.org/std/fmt/trait.Debug.html#stability
1 parent 60e3549 commit 5508583

File tree

2 files changed

+13
-5
lines changed

2 files changed

+13
-5
lines changed

library/core/src/fmt/mod.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -2767,7 +2767,15 @@ impl Display for char {
27672767
#[stable(feature = "rust1", since = "1.0.0")]
27682768
impl<T: ?Sized> Pointer for *const T {
27692769
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
2770-
pointer_fmt_inner(self.expose_provenance(), f)
2770+
if core::mem::size_of::<<T as core::ptr::Pointee>::Metadata>() == 0 {
2771+
pointer_fmt_inner(self.expose_provenance(), f)
2772+
} else {
2773+
f.write_str("Pointer { addr: ")?;
2774+
pointer_fmt_inner(self.expose_provenance(), f)?;
2775+
f.write_str(", metadata: ")?;
2776+
Debug::fmt(&core::ptr::metadata(*self), f)?;
2777+
f.write_str(" }")
2778+
}
27712779
}
27722780
}
27732781

tests/ui/fmt/ptr-metadata.run.stdout

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
*mut i32: $HEX
22
*const i32: $HEX
3-
*mut [i32]: $HEX
4-
*const [i32]: $HEX
5-
*mut dyn Display: $HEX
6-
*const dyn Display: $HEX
3+
*mut [i32]: Pointer { addr: $HEX, metadata: 3 }
4+
*const [i32]: Pointer { addr: $HEX, metadata: 3 }
5+
*mut dyn Display: Pointer { addr: $HEX, metadata: DynMetadata($HEX) }
6+
*const dyn Display: Pointer { addr: $HEX, metadata: DynMetadata($HEX) }

0 commit comments

Comments
 (0)