https://gcc.gnu.org/g:9e4a87ceb31d5c25cb7163ed8016986f0adbc68f

commit r15-6026-g9e4a87ceb31d5c25cb7163ed8016986f0adbc68f
Author: Thomas Schwinge <tschwi...@baylibre.com>
Date:   Sat Aug 3 16:39:17 2024 +0200

    Rust: Work around 'error[E0599]: no method named `leak` found for struct 
`std::string::String` in the current scope'
    
    Compiling with Debian GNU/Linux 12 (bookworm) packages:
    
        $ apt-cache madison cargo rustc
             cargo | 0.66.0+ds1-1 | http://deb.debian.org/debian bookworm/main 
ppc64el Packages
             cargo | 0.66.0+ds1-1 | http://deb.debian.org/debian bookworm/main 
Sources
             rustc | 1.63.0+dfsg1-2 | http://deb.debian.org/debian 
bookworm/main ppc64el Packages
             rustc | 1.63.0+dfsg1-2 | http://deb.debian.org/debian 
bookworm/main Sources
    
    ..., we run into:
    
           Compiling libformat_parser v0.1.0 
([...]/source-gcc/libgrust/libformat_parser)
        error[E0599]: no method named `leak` found for struct 
`std::string::String` in the current scope
           --> src/lib.rs:396:18
            |
        396 |         ptr: str.leak().as_ptr(),
            |                  ^^^^ method not found in `std::string::String`
    
        error[E0599]: no method named `leak` found for struct 
`std::string::String` in the current scope
           --> src/lib.rs:434:7
            |
        434 |     s.leak();
            |       ^^^^ method not found in `std::string::String`
    
        error[E0599]: no method named `leak` found for struct 
`std::string::String` in the current scope
           --> src/lib.rs:439:23
            |
        439 |         ptr: cloned_s.leak().as_ptr(),
            |                       ^^^^ method not found in 
`std::string::String`
    
    Locally replace 1.72.0+ method 'leak' for struct 'std::string::String'.
    
            libgrust/
            * libformat_parser/src/lib.rs: Work around 'error[E0599]:
            no method named `leak` found for struct `std::string::String` in 
the current scope'.

Diff:
---
 libgrust/libformat_parser/src/lib.rs | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/libgrust/libformat_parser/src/lib.rs 
b/libgrust/libformat_parser/src/lib.rs
index 84fac38e224d..28f6a6a62b62 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',
+// <https://doc.rust-lang.org/1.72.0/src/alloc/string.rs.html#1853>
+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<T> {
     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)

Reply via email to