Skip to content

Commit 2c85e84

Browse files
committed
Auto merge of #153296 - JonathanBrouwer:rollup-yNjsZyJ, r=JonathanBrouwer
Rollup of 5 pull requests Successful merges: - #153153 (add tests for thumb interworking) - #149328 (Add `String<A>` type with custom allocator parameter) - #151780 (Updated slice tests to pass for big endian hosts for `multiple-option-or-permutations.rs`) - #153015 (core: make atomic primitives type aliases of `Atomic<T>`) - #153292 (tests: codegen-llvm: vec-calloc: do not require the uwtable attribute) Failed merges: - #151864 (Implement AST -> HIR generics propagation in delegation)
2 parents 8ddf4ef + 8828dfe commit 2c85e84

211 files changed

Lines changed: 1665 additions & 1029 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

RELEASES.md

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -303,8 +303,8 @@ Stabilized APIs
303303
- [`impl PartialEq<String> for PathBuf`](https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#impl-PartialEq%3CString%3E-for-PathBuf)
304304
- [`impl PartialEq<str> for Path`](https://doc.rust-lang.org/stable/std/path/struct.Path.html#impl-PartialEq%3Cstr%3E-for-Path)
305305
- [`impl PartialEq<String> for Path`](https://doc.rust-lang.org/stable/std/path/struct.Path.html#impl-PartialEq%3CString%3E-for-Path)
306-
- [`impl PartialEq<PathBuf> for String`](https://doc.rust-lang.org/stable/std/string/struct.String.html#impl-PartialEq%3CPathBuf%3E-for-String)
307-
- [`impl PartialEq<Path> for String`](https://doc.rust-lang.org/stable/std/string/struct.String.html#impl-PartialEq%3CPath%3E-for-String)
306+
- [`impl PartialEq<PathBuf> for String`](https://doc.rust-lang.org/stable/std/string/type.String.html#impl-PartialEq%3CPathBuf%3E-for-String)
307+
- [`impl PartialEq<Path> for String`](https://doc.rust-lang.org/stable/std/string/type.String.html#impl-PartialEq%3CPath%3E-for-String)
308308
- [`impl PartialEq<PathBuf> for str`](https://doc.rust-lang.org/stable/std/primitive.str.html#impl-PartialEq%3CPathBuf%3E-for-str)
309309
- [`impl PartialEq<Path> for str`](https://doc.rust-lang.org/stable/std/primitive.str.html#impl-PartialEq%3CPath%3E-for-str)
310310
- [`Ipv4Addr::from_octets`](https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.from_octets)
@@ -854,7 +854,7 @@ Stabilized APIs
854854
- [`<[T]>::split_off_first_mut`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_off_first_mut)
855855
- [`<[T]>::split_off_last`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_off_last)
856856
- [`<[T]>::split_off_last_mut`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_off_last_mut)
857-
- [`String::extend_from_within`](https://doc.rust-lang.org/stable/alloc/string/struct.String.html#method.extend_from_within)
857+
- [`String::extend_from_within`](https://doc.rust-lang.org/stable/alloc/string/type.String.html#method.extend_from_within)
858858
- [`os_str::Display`](https://doc.rust-lang.org/stable/std/ffi/os_str/struct.Display.html)
859859
- [`OsString::display`](https://doc.rust-lang.org/stable/std/ffi/struct.OsString.html#method.display)
860860
- [`OsStr::display`](https://doc.rust-lang.org/stable/std/ffi/struct.OsStr.html#method.display)
@@ -868,7 +868,7 @@ Stabilized APIs
868868
- [`impl From<PipeReader> for OwnedFd`](https://doc.rust-lang.org/stable/std/os/fd/struct.OwnedFd.html#impl-From%3CPipeReader%3E-for-OwnedFd)
869869
- [`impl From<PipeWriter> for OwnedFd`](https://doc.rust-lang.org/stable/std/os/fd/struct.OwnedFd.html#impl-From%3CPipeWriter%3E-for-OwnedFd)
870870
- [`Box<MaybeUninit<T>>::write`](https://doc.rust-lang.org/stable/std/boxed/struct.Box.html#method.write)
871-
- [`impl TryFrom<Vec<u8>> for String`](https://doc.rust-lang.org/stable/std/string/struct.String.html#impl-TryFrom%3CVec%3Cu8%3E%3E-for-String)
871+
- [`impl TryFrom<Vec<u8>> for String`](https://doc.rust-lang.org/stable/std/string/type.String.html#impl-TryFrom%3CVec%3Cu8%3E%3E-for-String)
872872
- [`<*const T>::offset_from_unsigned`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.offset_from_unsigned)
873873
- [`<*const T>::byte_offset_from_unsigned`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.byte_offset_from_unsigned)
874874
- [`<*mut T>::offset_from_unsigned`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.offset_from_unsigned-1)
@@ -906,14 +906,14 @@ These previously stable APIs are now stable in const contexts:
906906
- [`char::is_whitespace`](https://doc.rust-lang.org/stable/std/primitive.char.html#method.is_whitespace)
907907
- [`<[[T; N]]>::as_flattened`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.as_flattened)
908908
- [`<[[T; N]]>::as_flattened_mut`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.as_flattened_mut)
909-
- [`String::into_bytes`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.into_bytes)
910-
- [`String::as_str`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.as_str)
911-
- [`String::capacity`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.capacity)
912-
- [`String::as_bytes`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.as_bytes)
913-
- [`String::len`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.len)
914-
- [`String::is_empty`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.is_empty)
915-
- [`String::as_mut_str`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.as_mut_str)
916-
- [`String::as_mut_vec`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.as_mut_vec)
909+
- [`String::into_bytes`](https://doc.rust-lang.org/stable/std/string/type.String.html#method.into_bytes)
910+
- [`String::as_str`](https://doc.rust-lang.org/stable/std/string/type.String.html#method.as_str)
911+
- [`String::capacity`](https://doc.rust-lang.org/stable/std/string/type.String.html#method.capacity)
912+
- [`String::as_bytes`](https://doc.rust-lang.org/stable/std/string/type.String.html#method.as_bytes)
913+
- [`String::len`](https://doc.rust-lang.org/stable/std/string/type.String.html#method.len)
914+
- [`String::is_empty`](https://doc.rust-lang.org/stable/std/string/type.String.html#method.is_empty)
915+
- [`String::as_mut_str`](https://doc.rust-lang.org/stable/std/string/type.String.html#method.as_mut_str)
916+
- [`String::as_mut_vec`](https://doc.rust-lang.org/stable/std/string/type.String.html#method.as_mut_vec)
917917
- [`Vec::as_ptr`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.as_ptr)
918918
- [`Vec::as_slice`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.as_slice)
919919
- [`Vec::capacity`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.capacity)
@@ -2965,7 +2965,7 @@ Stabilized APIs
29652965

29662966
- [`impl<T: Send> Sync for mpsc::Sender<T>`](https://doc.rust-lang.org/stable/std/sync/mpsc/struct.Sender.html#impl-Sync-for-Sender%3CT%3E)
29672967
- [`impl TryFrom<&OsStr> for &str`](https://doc.rust-lang.org/stable/std/primitive.str.html#impl-TryFrom%3C%26'a+OsStr%3E-for-%26'a+str)
2968-
- [`String::leak`](https://doc.rust-lang.org/stable/alloc/string/struct.String.html#method.leak)
2968+
- [`String::leak`](https://doc.rust-lang.org/stable/alloc/string/type.String.html#method.leak)
29692969

29702970
These APIs are now stable in const contexts:
29712971

@@ -5024,8 +5024,8 @@ and related tools.
50245024
[`collections::TryReserveError`]: https://doc.rust-lang.org/std/collections/struct.TryReserveError.html
50255025
[`HashMap::try_reserve`]: https://doc.rust-lang.org/std/collections/hash_map/struct.HashMap.html#method.try_reserve
50265026
[`HashSet::try_reserve`]: https://doc.rust-lang.org/std/collections/hash_set/struct.HashSet.html#method.try_reserve
5027-
[`String::try_reserve`]: https://doc.rust-lang.org/alloc/string/struct.String.html#method.try_reserve
5028-
[`String::try_reserve_exact`]: https://doc.rust-lang.org/alloc/string/struct.String.html#method.try_reserve_exact
5027+
[`String::try_reserve`]: https://doc.rust-lang.org/alloc/string/type.String.html#method.try_reserve
5028+
[`String::try_reserve_exact`]: https://doc.rust-lang.org/alloc/string/type.String.html#method.try_reserve_exact
50295029
[`Vec::try_reserve`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.try_reserve
50305030
[`Vec::try_reserve_exact`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.try_reserve_exact
50315031
[`VecDeque::try_reserve`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.try_reserve
@@ -5166,7 +5166,7 @@ and related tools.
51665166
[`BufWriter::into_parts`]: https://doc.rust-lang.org/stable/std/io/struct.BufWriter.html#method.into_parts
51675167
[`core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}`]: https://github.com/rust-lang/rust/pull/84662
51685168
[`Vec::shrink_to`]: https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.shrink_to
5169-
[`String::shrink_to`]: https://doc.rust-lang.org/stable/std/string/struct.String.html#method.shrink_to
5169+
[`String::shrink_to`]: https://doc.rust-lang.org/stable/std/string/type.String.html#method.shrink_to
51705170
[`OsString::shrink_to`]: https://doc.rust-lang.org/stable/std/ffi/struct.OsString.html#method.shrink_to
51715171
[`PathBuf::shrink_to`]: https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#method.shrink_to
51725172
[`BinaryHeap::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/struct.BinaryHeap.html#method.shrink_to
@@ -9361,7 +9361,7 @@ Compatibility Notes
93619361
[`Iterator::try_for_each`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.try_for_each
93629362
[`NonNull::cast`]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html#method.cast
93639363
[`Option::filter`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.filter
9364-
[`String::replace_range`]: https://doc.rust-lang.org/std/string/struct.String.html#method.replace_range
9364+
[`String::replace_range`]: https://doc.rust-lang.org/std/string/type.String.html#method.replace_range
93659365
[`Take::set_limit`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.set_limit
93669366
[`hint::unreachable_unchecked`]: https://doc.rust-lang.org/std/hint/fn.unreachable_unchecked.html
93679367
[`os::unix::process::parent_id`]: https://doc.rust-lang.org/std/os/unix/process/fn.parent_id.html
@@ -9606,7 +9606,7 @@ Compatibility Notes
96069606
[`process::id`]: https://doc.rust-lang.org/std/process/fn.id.html
96079607
[`slice::rotate_left`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rotate_left
96089608
[`slice::rotate_right`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rotate_right
9609-
[`String::retain`]: https://doc.rust-lang.org/std/string/struct.String.html#method.retain
9609+
[`String::retain`]: https://doc.rust-lang.org/std/string/type.String.html#method.retain
96109610
[cargo/5041]: https://github.com/rust-lang/cargo/pull/5041
96119611
[cargo/5083]: https://github.com/rust-lang/cargo/pull/5083
96129612

@@ -11057,8 +11057,8 @@ Compatibility Notes
1105711057
[`Result::unwrap_or_default`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.unwrap_or_default
1105811058
[`SocketAddr::is_ipv4`]: https://doc.rust-lang.org/std/net/enum.SocketAddr.html#method.is_ipv4
1105911059
[`SocketAddr::is_ipv6`]: https://doc.rust-lang.org/std/net/enum.SocketAddr.html#method.is_ipv6
11060-
[`String::insert_str`]: https://doc.rust-lang.org/std/string/struct.String.html#method.insert_str
11061-
[`String::split_off`]: https://doc.rust-lang.org/std/string/struct.String.html#method.split_off
11060+
[`String::insert_str`]: https://doc.rust-lang.org/std/string/type.String.html#method.insert_str
11061+
[`String::split_off`]: https://doc.rust-lang.org/std/string/type.String.html#method.split_off
1106211062
[`Vec::dedup_by_key`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.dedup_by_key
1106311063
[`Vec::dedup_by`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.dedup_by
1106411064
[`VecDeque::resize`]: https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.resize
@@ -12972,8 +12972,8 @@ Compatibility Notes
1297212972
[`Ipv6Addr::is_unspecified`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_unspecified
1297312973
[`Path::strip_prefix`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.strip_prefix
1297412974
[`RandomState::new`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.RandomState.html#method.new
12975-
[`String::as_mut_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_mut_str
12976-
[`String::as_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_str
12975+
[`String::as_mut_str`]: http://doc.rust-lang.org/nightly/std/string/type.String.html#method.as_mut_str
12976+
[`String::as_str`]: http://doc.rust-lang.org/nightly/std/string/type.String.html#method.as_str
1297712977
[`Vec::as_mut_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_mut_slice
1297812978
[`Vec::as_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_slice
1297912979
[`clone_from_slice`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.clone_from_slice
@@ -13159,7 +13159,7 @@ Compatibility Notes
1315913159
[`os::unix::fs::DirBuilderExt::mode`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html#tymethod.mode
1316013160
[`os::unix::fs::DirBuilderExt`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html
1316113161
[`string::Drain`]: http://doc.rust-lang.org/nightly/std/string/struct.Drain.html
13162-
[`string::String::drain`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.drain
13162+
[`string::String::drain`]: http://doc.rust-lang.org/nightly/std/string/type.String.html#method.drain
1316313163
[`vec::Drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Drain.html
1316413164
[`vec::Vec::drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.drain
1316513165
[`vec_deque::Drain`]: http://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.Drain.html
@@ -13508,7 +13508,7 @@ Miscellaneous
1350813508
[`Rc::make_mut`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.make_mut
1350913509
[`Rc::try_unwrap`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.try_unwrap
1351013510
[`Result::expect`]: http://doc.rust-lang.org/nightly/core/result/enum.Result.html#method.expect
13511-
[`String::into_boxed_str`]: http://doc.rust-lang.org/nightly/collections/string/struct.String.html#method.into_boxed_str
13511+
[`String::into_boxed_str`]: http://doc.rust-lang.org/nightly/collections/string/type.String.html#method.into_boxed_str
1351213512
[`TcpStream::read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout
1351313513
[`TcpStream::set_read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout
1351413514
[`TcpStream::write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout

compiler/rustc_data_structures/src/marker.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,16 @@ macro_rules! already_send {
5959

6060
// These structures are already `Send`.
6161
already_send!(
62-
[std::backtrace::Backtrace][std::io::Stdout][std::io::Stderr][std::io::Error][std::fs::File][std::panic::Location<'_>]
63-
[rustc_arena::DroplessArena][jobserver_crate::Client][jobserver_crate::HelperThread]
64-
[crate::memmap::Mmap][crate::profiling::SelfProfiler][crate::owned_slice::OwnedSlice]
62+
[std::sync::atomic::AtomicBool][std::sync::atomic::AtomicUsize][std::sync::atomic::AtomicU8]
63+
[std::sync::atomic::AtomicU32][std::backtrace::Backtrace][std::io::Stdout][std::io::Stderr]
64+
[std::io::Error][std::fs::File][std::panic::Location<'_>][rustc_arena::DroplessArena]
65+
[jobserver_crate::Client][jobserver_crate::HelperThread][crate::memmap::Mmap]
66+
[crate::profiling::SelfProfiler][crate::owned_slice::OwnedSlice]
6567
);
6668

69+
#[cfg(target_has_atomic = "64")]
70+
already_send!([std::sync::atomic::AtomicU64]);
71+
6772
macro_rules! impl_dyn_send {
6873
($($($attr: meta)* [$ty: ty where $($generics2: tt)*])*) => {
6974
$(unsafe impl<$($generics2)*> DynSend for $ty {})*

compiler/rustc_lint/src/types.rs

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,31 +1036,13 @@ impl InvalidAtomicOrdering {
10361036
expr: &Expr<'hir>,
10371037
recognized_names: &[Symbol], // used for fast path calculation
10381038
) -> Option<(Symbol, &'hir [Expr<'hir>])> {
1039-
const ATOMIC_TYPES: &[Symbol] = &[
1040-
sym::AtomicBool,
1041-
sym::AtomicPtr,
1042-
sym::AtomicUsize,
1043-
sym::AtomicU8,
1044-
sym::AtomicU16,
1045-
sym::AtomicU32,
1046-
sym::AtomicU64,
1047-
sym::AtomicU128,
1048-
sym::AtomicIsize,
1049-
sym::AtomicI8,
1050-
sym::AtomicI16,
1051-
sym::AtomicI32,
1052-
sym::AtomicI64,
1053-
sym::AtomicI128,
1054-
];
10551039
if let ExprKind::MethodCall(method_path, _, args, _) = &expr.kind
10561040
&& recognized_names.contains(&method_path.ident.name)
10571041
&& let Some(m_def_id) = cx.typeck_results().type_dependent_def_id(expr.hir_id)
10581042
// skip extension traits, only lint functions from the standard library
10591043
&& let Some(impl_did) = cx.tcx.inherent_impl_of_assoc(m_def_id)
10601044
&& let Some(adt) = cx.tcx.type_of(impl_did).instantiate_identity().ty_adt_def()
1061-
&& let parent = cx.tcx.parent(adt.did())
1062-
&& cx.tcx.is_diagnostic_item(sym::atomic_mod, parent)
1063-
&& ATOMIC_TYPES.contains(&cx.tcx.item_name(adt.did()))
1045+
&& cx.tcx.is_diagnostic_item(sym::Atomic, adt.did())
10641046
{
10651047
return Some((method_path.ident.name, args));
10661048
}

compiler/rustc_span/src/symbol.rs

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -171,20 +171,7 @@ symbols! {
171171
AsyncGenFinished,
172172
AsyncGenPending,
173173
AsyncGenReady,
174-
AtomicBool,
175-
AtomicI8,
176-
AtomicI16,
177-
AtomicI32,
178-
AtomicI64,
179-
AtomicI128,
180-
AtomicIsize,
181-
AtomicPtr,
182-
AtomicU8,
183-
AtomicU16,
184-
AtomicU32,
185-
AtomicU64,
186-
AtomicU128,
187-
AtomicUsize,
174+
Atomic,
188175
BTreeMap,
189176
Bool,
190177
Borrow,
@@ -485,7 +472,6 @@ symbols! {
485472
atomic_load,
486473
atomic_max,
487474
atomic_min,
488-
atomic_mod,
489475
atomic_nand,
490476
atomic_or,
491477
atomic_singlethreadfence,
@@ -1972,6 +1958,7 @@ symbols! {
19721958
str_inherent_from_utf8_unchecked_mut,
19731959
strict_provenance_lints,
19741960
string_deref_patterns,
1961+
string_in_global,
19751962
stringify,
19761963
struct_field_attributes,
19771964
struct_inherit,

library/alloc/src/boxed.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,8 @@ use crate::alloc::{AllocError, Allocator, Global, Layout};
210210
use crate::raw_vec::RawVec;
211211
#[cfg(not(no_global_oom_handling))]
212212
use crate::str::from_boxed_utf8_unchecked;
213+
#[cfg(not(no_global_oom_handling))]
214+
use crate::vec::Vec;
213215

214216
/// Conversion related impls for `Box<_>` (`From`, `downcast`, etc)
215217
mod convert;
@@ -2072,11 +2074,13 @@ impl<T: Clone, A: Allocator + Clone> Clone for Box<[T], A> {
20722074

20732075
#[cfg(not(no_global_oom_handling))]
20742076
#[stable(feature = "box_slice_clone", since = "1.3.0")]
2075-
impl Clone for Box<str> {
2077+
impl<A: Allocator + Clone> Clone for Box<str, A> {
20762078
fn clone(&self) -> Self {
2077-
// this makes a copy of the data
2078-
let buf: Box<[u8]> = self.as_bytes().into();
2079-
unsafe { from_boxed_utf8_unchecked(buf) }
2079+
let alloc = Box::allocator(self).clone();
2080+
let len = self.len();
2081+
let mut vec: Vec<u8, A> = Vec::with_capacity_in(len, alloc);
2082+
vec.extend_from_slice(self.as_bytes());
2083+
unsafe { from_boxed_utf8_unchecked(vec.into_boxed_slice()) }
20802084
}
20812085
}
20822086

0 commit comments

Comments
 (0)