diff options
| author | Tobias Bucher <tobiasbucher5991@gmail.com> | 2025-08-18 11:50:27 +0200 |
|---|---|---|
| committer | Tobias Bucher <tobiasbucher5991@gmail.com> | 2025-08-19 17:35:55 +0200 |
| commit | 6a24ae96eaf175b048e70dfb46dfb860ee7147d9 (patch) | |
| tree | 1e2fdb930fc8a331526ce673215745fef587e892 | |
| parent | 8c32e313cccf7df531e2d49ffb8227bb92304aee (diff) | |
| download | rust-6a24ae96eaf175b048e70dfb46dfb860ee7147d9.tar.gz rust-6a24ae96eaf175b048e70dfb46dfb860ee7147d9.zip | |
Simplify macro generating `ToString` implementations for `&…&str`
Use deref coercion to let the compiler remove any amount of references.
| -rw-r--r-- | library/alloc/src/string.rs | 55 |
1 files changed, 21 insertions, 34 deletions
diff --git a/library/alloc/src/string.rs b/library/alloc/src/string.rs index 9eacbf00e42..b1f2cb598c8 100644 --- a/library/alloc/src/string.rs +++ b/library/alloc/src/string.rs @@ -2949,52 +2949,39 @@ impl SpecToString for i8 { } } -// Generic/generated code can sometimes have multiple, nested references -// for strings, including `&&&str`s that would never be written -// by hand. This macro generates twelve layers of nested `&`-impl -// for primitive strings. -#[cfg(not(no_global_oom_handling))] -macro_rules! to_string_str_wrap_in_ref { - {x $($x:ident)*} => { - &to_string_str_wrap_in_ref! { $($x)* } - }; - {} => { str }; -} -#[cfg(not(no_global_oom_handling))] -macro_rules! to_string_expr_wrap_in_deref { - {$self:expr ; x $($x:ident)*} => { - *(to_string_expr_wrap_in_deref! { $self ; $($x)* }) - }; - {$self:expr ;} => { $self }; -} #[cfg(not(no_global_oom_handling))] macro_rules! to_string_str { - {$($($x:ident)*),+} => { + {$($type:ty,)*} => { $( - impl SpecToString for to_string_str_wrap_in_ref!($($x)*) { + impl SpecToString for $type { #[inline] fn spec_to_string(&self) -> String { - String::from(to_string_expr_wrap_in_deref!(self ; $($x)*)) + let s: &str = self; + String::from(s) } } - )+ + )* }; } #[cfg(not(no_global_oom_handling))] to_string_str! { - x x x x x x x x x x x x, - x x x x x x x x x x x, - x x x x x x x x x x, - x x x x x x x x x, - x x x x x x x x, - x x x x x x x, - x x x x x x, - x x x x x, - x x x x, - x x x, - x x, - x, + // Generic/generated code can sometimes have multiple, nested references + // for strings, including `&&&str`s that would never be written + // by hand. + &&&&&&&&&&&&str, + &&&&&&&&&&&str, + &&&&&&&&&&str, + &&&&&&&&&str, + &&&&&&&&str, + &&&&&&&str, + &&&&&&str, + &&&&&str, + &&&&str, + &&&str, + &&str, + &str, + str, } #[cfg(not(no_global_oom_handling))] |
