From f727b3622bf69f44500e708f387160d5afbb39db Mon Sep 17 00:00:00 2001
From: Tamir Duberstein <tamird@gmail.com>
Date: Fri, 18 Apr 2025 10:15:11 -0400
Subject: [PATCH 1/4] Invert `<CString as Deref>::deref` and
 `CString::as_c_str`

This is consistent with the style of `ByteString`.
---
 library/alloc/src/ffi/c_str.rs | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/library/alloc/src/ffi/c_str.rs b/library/alloc/src/ffi/c_str.rs
index f6743c657109..7e863f13f434 100644
--- a/library/alloc/src/ffi/c_str.rs
+++ b/library/alloc/src/ffi/c_str.rs
@@ -574,7 +574,7 @@ impl CString {
     #[stable(feature = "as_c_str", since = "1.20.0")]
     #[rustc_diagnostic_item = "cstring_as_c_str"]
     pub fn as_c_str(&self) -> &CStr {
-        &*self
+        unsafe { CStr::from_bytes_with_nul_unchecked(self.as_bytes_with_nul()) }
     }
 
     /// Converts this `CString` into a boxed [`CStr`].
@@ -705,14 +705,14 @@ impl ops::Deref for CString {
 
     #[inline]
     fn deref(&self) -> &CStr {
-        unsafe { CStr::from_bytes_with_nul_unchecked(self.as_bytes_with_nul()) }
+        self.as_c_str()
     }
 }
 
 #[stable(feature = "rust1", since = "1.0.0")]
 impl fmt::Debug for CString {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        fmt::Debug::fmt(&**self, f)
+        fmt::Debug::fmt(self.as_c_str(), f)
     }
 }
 

From 9058bab9a9e88b90596019f686cce1f21ac19ef8 Mon Sep 17 00:00:00 2001
From: Tamir Duberstein <tamird@gmail.com>
Date: Fri, 18 Apr 2025 10:30:38 -0400
Subject: [PATCH 2/4] Move `<CStr as Debug>` test to coretests

---
 library/alloctests/tests/c_str2.rs  | 6 ------
 library/coretests/tests/ffi/cstr.rs | 6 ++++++
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/library/alloctests/tests/c_str2.rs b/library/alloctests/tests/c_str2.rs
index 0f4c27fa1232..fe7686bd1c59 100644
--- a/library/alloctests/tests/c_str2.rs
+++ b/library/alloctests/tests/c_str2.rs
@@ -33,12 +33,6 @@ fn build_with_zero2() {
     assert!(CString::new(vec![0]).is_err());
 }
 
-#[test]
-fn formatted() {
-    let s = CString::new(&b"abc\x01\x02\n\xE2\x80\xA6\xFF"[..]).unwrap();
-    assert_eq!(format!("{s:?}"), r#""abc\x01\x02\n\xe2\x80\xa6\xff""#);
-}
-
 #[test]
 fn borrowed() {
     unsafe {
diff --git a/library/coretests/tests/ffi/cstr.rs b/library/coretests/tests/ffi/cstr.rs
index 9bf4c21a9ab9..0d85b22c585a 100644
--- a/library/coretests/tests/ffi/cstr.rs
+++ b/library/coretests/tests/ffi/cstr.rs
@@ -13,3 +13,9 @@ fn compares_as_u8s() {
     assert_eq!(Ord::cmp(a, b), Ord::cmp(a_bytes, b_bytes));
     assert_eq!(PartialOrd::partial_cmp(a, b), PartialOrd::partial_cmp(a_bytes, b_bytes));
 }
+
+#[test]
+fn debug() {
+    let s = c"abc\x01\x02\n\xE2\x80\xA6\xFF";
+    assert_eq!(format!("{s:?}"), r#""abc\x01\x02\n\xe2\x80\xa6\xff""#);
+}

From 87072c1d2ec0b5efbcc23eea838357fc629bcf99 Mon Sep 17 00:00:00 2001
From: Tamir Duberstein <tamird@gmail.com>
Date: Fri, 18 Apr 2025 11:20:14 -0400
Subject: [PATCH 3/4] Remove errant doc comment lines

---
 library/core/src/bstr/mod.rs  | 1 -
 library/core/src/ffi/c_str.rs | 1 -
 2 files changed, 2 deletions(-)

diff --git a/library/core/src/bstr/mod.rs b/library/core/src/bstr/mod.rs
index c8d0c701ba8b..07d4fd911d3a 100644
--- a/library/core/src/bstr/mod.rs
+++ b/library/core/src/bstr/mod.rs
@@ -37,7 +37,6 @@ use crate::ops::{Deref, DerefMut, DerefPure};
 ///
 /// The `Display` implementation behaves as if the `ByteStr` were first lossily converted to a
 /// `str`, with invalid UTF-8 presented as the Unicode replacement character: �
-///
 #[unstable(feature = "bstr", issue = "134915")]
 #[repr(transparent)]
 #[doc(alias = "BStr")]
diff --git a/library/core/src/ffi/c_str.rs b/library/core/src/ffi/c_str.rs
index 080c0cef5330..85e87445a1b4 100644
--- a/library/core/src/ffi/c_str.rs
+++ b/library/core/src/ffi/c_str.rs
@@ -150,7 +150,6 @@ impl Error for FromBytesWithNulError {
 /// within the slice.
 ///
 /// This error is created by the [`CStr::from_bytes_until_nul`] method.
-///
 #[derive(Clone, PartialEq, Eq, Debug)]
 #[stable(feature = "cstr_from_bytes_until_nul", since = "1.69.0")]
 pub struct FromBytesUntilNulError(());

From aedbd2d1ec91339954573b691022f89d169f9b84 Mon Sep 17 00:00:00 2001
From: Tamir Duberstein <tamird@gmail.com>
Date: Fri, 18 Apr 2025 11:25:46 -0400
Subject: [PATCH 4/4] Replace colon with parentheses, add missing period

---
 library/core/src/bstr/mod.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/library/core/src/bstr/mod.rs b/library/core/src/bstr/mod.rs
index 07d4fd911d3a..13127d645a25 100644
--- a/library/core/src/bstr/mod.rs
+++ b/library/core/src/bstr/mod.rs
@@ -36,7 +36,7 @@ use crate::ops::{Deref, DerefMut, DerefPure};
 /// presented as hex escape sequences.
 ///
 /// The `Display` implementation behaves as if the `ByteStr` were first lossily converted to a
-/// `str`, with invalid UTF-8 presented as the Unicode replacement character: �
+/// `str`, with invalid UTF-8 presented as the Unicode replacement character (�).
 #[unstable(feature = "bstr", issue = "134915")]
 #[repr(transparent)]
 #[doc(alias = "BStr")]