diff options
author | Thomas Schwinge <tschwinge@baylibre.com> | 2024-08-03 16:39:17 +0200 |
---|---|---|
committer | Thomas Schwinge <tschwinge@baylibre.com> | 2024-12-09 10:48:40 +0100 |
commit | 9e4a87ceb31d5c25cb7163ed8016986f0adbc68f (patch) | |
tree | 8b794bc6a93bea3a535ea314e4e591b15f864e4c | |
parent | 85f81ba60e37c6d6df8a0d263f9335dae18e8cae (diff) | |
download | gcc-9e4a87ceb31d5c25cb7163ed8016986f0adbc68f.zip gcc-9e4a87ceb31d5c25cb7163ed8016986f0adbc68f.tar.gz gcc-9e4a87ceb31d5c25cb7163ed8016986f0adbc68f.tar.bz2 |
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'.
-rw-r--r-- | libgrust/libformat_parser/src/lib.rs | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/libgrust/libformat_parser/src/lib.rs b/libgrust/libformat_parser/src/lib.rs index 84fac38..28f6a6a 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) |