diff options
Diffstat (limited to 'rust/alloc/lib.rs')
| -rw-r--r-- | rust/alloc/lib.rs | 71 | 
1 files changed, 55 insertions, 16 deletions
| diff --git a/rust/alloc/lib.rs b/rust/alloc/lib.rs index 3aebf83c9967..5f374378b0d4 100644 --- a/rust/alloc/lib.rs +++ b/rust/alloc/lib.rs @@ -5,7 +5,7 @@  //! This library provides smart pointers and collections for managing  //! heap-allocated values.  //! -//! This library, like libcore, normally doesn’t need to be used directly +//! This library, like core, normally doesn’t need to be used directly  //! since its contents are re-exported in the [`std` crate](../std/index.html).  //! Crates that use the `#![no_std]` attribute however will typically  //! not depend on `std`, so they’d use this crate instead. @@ -58,10 +58,6 @@  //! [`Rc`]: rc  //! [`RefCell`]: core::cell -// To run liballoc tests without x.py without ending up with two copies of liballoc, Miri needs to be -// able to "empty" this crate. See <https://github.com/rust-lang/miri-test-libstd/issues/4>. -// rustc itself never sets the feature, so this line has no affect there. -#![cfg(any(not(feature = "miri-test-libstd"), test, doctest))]  #![allow(unused_attributes)]  #![stable(feature = "alloc", since = "1.36.0")]  #![doc( @@ -75,23 +71,30 @@      any(not(feature = "miri-test-libstd"), test, doctest),      no_global_oom_handling,      not(no_global_oom_handling), +    not(no_rc), +    not(no_sync),      target_has_atomic = "ptr"  ))]  #![no_std]  #![needs_allocator] +// To run alloc tests without x.py without ending up with two copies of alloc, Miri needs to be +// able to "empty" this crate. See <https://github.com/rust-lang/miri-test-libstd/issues/4>. +// rustc itself never sets the feature, so this line has no affect there. +#![cfg(any(not(feature = "miri-test-libstd"), test, doctest))]  //  // Lints:  #![deny(unsafe_op_in_unsafe_fn)] +#![deny(fuzzy_provenance_casts)]  #![warn(deprecated_in_future)]  #![warn(missing_debug_implementations)]  #![warn(missing_docs)]  #![allow(explicit_outlives_requirements)]  //  // Library features: -#![cfg_attr(not(no_global_oom_handling), feature(alloc_c_string))]  #![feature(alloc_layout_extra)]  #![feature(allocator_api)]  #![feature(array_chunks)] +#![feature(array_into_iter_constructors)]  #![feature(array_methods)]  #![feature(array_windows)]  #![feature(assert_matches)] @@ -99,39 +102,53 @@  #![feature(coerce_unsized)]  #![cfg_attr(not(no_global_oom_handling), feature(const_alloc_error))]  #![feature(const_box)] -#![cfg_attr(not(no_global_oom_handling), feature(const_btree_new))] +#![cfg_attr(not(no_global_oom_handling), feature(const_btree_len))]  #![cfg_attr(not(no_borrow), feature(const_cow_is_borrowed))]  #![feature(const_convert)]  #![feature(const_size_of_val)]  #![feature(const_align_of_val)]  #![feature(const_ptr_read)] +#![feature(const_maybe_uninit_zeroed)]  #![feature(const_maybe_uninit_write)]  #![feature(const_maybe_uninit_as_mut_ptr)]  #![feature(const_refs_to_cell)] -#![feature(core_c_str)]  #![feature(core_intrinsics)] -#![feature(core_ffi_c)] +#![feature(core_panic)]  #![feature(const_eval_select)]  #![feature(const_pin)] +#![feature(const_waker)]  #![feature(cstr_from_bytes_until_nul)]  #![feature(dispatch_from_dyn)] +#![feature(error_generic_member_access)] +#![feature(error_in_core)]  #![feature(exact_size_is_empty)]  #![feature(extend_one)]  #![feature(fmt_internals)]  #![feature(fn_traits)]  #![feature(hasher_prefixfree_extras)] +#![feature(inline_const)]  #![feature(inplace_iteration)] +#![cfg_attr(test, feature(is_sorted))]  #![feature(iter_advance_by)] +#![feature(iter_next_chunk)] +#![feature(iter_repeat_n)]  #![feature(layout_for_ptr)]  #![feature(maybe_uninit_slice)] +#![feature(maybe_uninit_uninit_array)] +#![feature(maybe_uninit_uninit_array_transpose)]  #![cfg_attr(test, feature(new_uninit))]  #![feature(nonnull_slice_from_raw_parts)]  #![feature(pattern)] +#![feature(pointer_byte_offsets)] +#![feature(provide_any)]  #![feature(ptr_internals)]  #![feature(ptr_metadata)]  #![feature(ptr_sub_ptr)]  #![feature(receiver_trait)] +#![feature(saturating_int_impl)]  #![feature(set_ptr_value)] +#![feature(sized_type_properties)] +#![feature(slice_from_ptr_range)]  #![feature(slice_group_by)]  #![feature(slice_ptr_get)]  #![feature(slice_ptr_len)] @@ -141,15 +158,17 @@  #![feature(trusted_len)]  #![feature(trusted_random_access)]  #![feature(try_trait_v2)] +#![feature(tuple_trait)]  #![feature(unchecked_math)]  #![feature(unicode_internals)]  #![feature(unsize)] +#![feature(utf8_chunks)] +#![feature(std_internals)]  //  // Language features:  #![feature(allocator_internals)]  #![feature(allow_internal_unstable)]  #![feature(associated_type_bounds)] -#![feature(box_syntax)]  #![feature(cfg_sanitize)]  #![feature(const_deref)]  #![feature(const_mut_refs)] @@ -163,19 +182,21 @@  #![cfg_attr(not(test), feature(generator_trait))]  #![feature(hashmap_internals)]  #![feature(lang_items)] -#![feature(let_else)]  #![feature(min_specialization)]  #![feature(negative_impls)]  #![feature(never_type)] -#![feature(nll)] // Not necessary, but here to test the `nll` feature.  #![feature(rustc_allow_const_fn_unstable)]  #![feature(rustc_attrs)] +#![feature(pointer_is_aligned)]  #![feature(slice_internals)]  #![feature(staged_api)] +#![feature(stmt_expr_attributes)]  #![cfg_attr(test, feature(test))]  #![feature(unboxed_closures)]  #![feature(unsized_fn_params)]  #![feature(c_unwind)] +#![feature(with_negative_coherence)] +#![cfg_attr(test, feature(panic_update_hook))]  //  // Rustdoc features:  #![feature(doc_cfg)] @@ -192,6 +213,8 @@  extern crate std;  #[cfg(test)]  extern crate test; +#[cfg(test)] +mod testing;  // Module with internal macros used by other modules (needs to be included before other modules).  #[cfg(not(no_macros))] @@ -218,7 +241,7 @@ mod boxed {  #[cfg(not(no_borrow))]  pub mod borrow;  pub mod collections; -#[cfg(not(no_global_oom_handling))] +#[cfg(all(not(no_rc), not(no_sync), not(no_global_oom_handling)))]  pub mod ffi;  #[cfg(not(no_fmt))]  pub mod fmt; @@ -229,10 +252,9 @@ pub mod slice;  pub mod str;  #[cfg(not(no_string))]  pub mod string; -#[cfg(not(no_sync))] -#[cfg(target_has_atomic = "ptr")] +#[cfg(all(not(no_rc), not(no_sync), target_has_atomic = "ptr"))]  pub mod sync; -#[cfg(all(not(no_global_oom_handling), target_has_atomic = "ptr"))] +#[cfg(all(not(no_global_oom_handling), not(no_rc), not(no_sync), target_has_atomic = "ptr"))]  pub mod task;  #[cfg(test)]  mod tests; @@ -243,3 +265,20 @@ pub mod vec;  pub mod __export {      pub use core::format_args;  } + +#[cfg(test)] +#[allow(dead_code)] // Not used in all configurations +pub(crate) mod test_helpers { +    /// Copied from `std::test_helpers::test_rng`, since these tests rely on the +    /// seed not being the same for every RNG invocation too. +    pub(crate) fn test_rng() -> rand_xorshift::XorShiftRng { +        use std::hash::{BuildHasher, Hash, Hasher}; +        let mut hasher = std::collections::hash_map::RandomState::new().build_hasher(); +        std::panic::Location::caller().hash(&mut hasher); +        let hc64 = hasher.finish(); +        let seed_vec = +            hc64.to_le_bytes().into_iter().chain(0u8..8).collect::<crate::vec::Vec<u8>>(); +        let seed: [u8; 16] = seed_vec.as_slice().try_into().unwrap(); +        rand::SeedableRng::from_seed(seed) +    } +} |