diff --git a/libgrust/libformat_parser/src/lib.rs b/libgrust/libformat_parser/src/lib.rs index 84fac38e224..28f6a6a62b6 100644 --- a/libgrust/libformat_parser/src/lib.rs +++ b/libgrust/libformat_parser/src/lib.rs @@ -5,6 +5,13 @@ use std::ffi::CStr; +// Local replacement for 1.72.0+ method 'leak' for struct 'std::string::String', +// +fn leak_string<'a>(s: String) -> &'a mut str { + let slice = s.into_bytes().leak(); + unsafe { std::str::from_utf8_unchecked_mut(slice) } +} + trait IntoFFI { fn into_ffi(self) -> T; } @@ -393,7 +400,7 @@ pub extern "C" fn collect_pieces( let rust_string = RustString { len: str.len(), cap: str.capacity(), - ptr: str.leak().as_ptr(), + ptr: leak_string(str).as_ptr(), }; FormatArgsHandle(piece_slice, rust_string) @@ -431,12 +438,12 @@ pub extern "C" fn clone_pieces( let cloned_s = s.clone(); // FIXME: Documentation - s.leak(); + leak_string(s); let rust_string = RustString { len: cloned_s.len(), cap: cloned_s.capacity(), - ptr: cloned_s.leak().as_ptr(), + ptr: leak_string(cloned_s).as_ptr(), }; FormatArgsHandle(piece_slice, rust_string)