Skip to content

DO NOT REVIEW - WIP coop-rs/rust:02_vec #107274

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 80 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
05b7b18
START CoAlloc API
peter-lyons-kehl Jan 21, 2023
406e8a3
CoAlloc: RawVec + compiler 'tests'
peter-lyons-kehl Jan 21, 2023
7de7aff
CoAlloc: GlobalAlloc API
peter-lyons-kehl Dec 10, 2022
4a72a96
CoAlloc: Alloc API
peter-lyons-kehl Jan 21, 2023
e1114cc
CoAlloc: RawVec includes GlobalCoAllocMeta based on allocator; relate…
peter-lyons-kehl Jan 21, 2023
0db8c6f
CoAlloc: VecDeque (PROBABLY NOT COMPILING, standard error)
peter-lyons-kehl Jan 21, 2023
1e4e3ee
CoAlloc: RawVec + Vec with COOP_PREFERRED. PROBABLY NOT COMPILING, bu…
peter-lyons-kehl Jan 22, 2023
8ae4cf0
VecDeque with COOP_PREFERRED. PROBABLY NOT COMPILING, but no ICE.
peter-lyons-kehl Jan 22, 2023
37a0847
CoAlloc: RawVec, Vec, Box uses bounds. ICE
peter-lyons-kehl Jan 22, 2023
b0dd71c
CoAlloc: BinaryHeap now uses bounds. (Probably needs to go together w…
peter-lyons-kehl Jan 22, 2023
b7c43ec
CoAlloc: VecDeque now uses bounds. ICE
peter-lyons-kehl Jan 22, 2023
33c42a4
CoAlloc: VecDeque. Probably ICE.
peter-lyons-kehl Jan 22, 2023
b221045
CoAlloc: Vec + Slice. ICE
peter-lyons-kehl Jan 22, 2023
6ee4ede
CoAlloc: VecDeque. ICE
peter-lyons-kehl Jan 22, 2023
eeb4214
CoAlloc: Minor
peter-lyons-kehl Jan 22, 2023
6c3801d
CoAlloc: Vec + its use cases. ICE
peter-lyons-kehl Jan 22, 2023
682f1e0
CoAlloc: VecDeque minor. ICE
peter-lyons-kehl Jan 22, 2023
3cdb2d9
CoAlloc: Vec, Alloc, GlobalAlloc: x test tidy --bless. ICE
peter-lyons-kehl Jan 22, 2023
4909d57
CoAlloc: VecDeque + BinaryHeap: x test tidy --bless. ICE
peter-lyons-kehl Jan 22, 2023
17b3244
CoAlloc: VecDeque. ICE
peter-lyons-kehl Jan 22, 2023
85c6759
CoAlloc: VecDeque. ICE
peter-lyons-kehl Jan 22, 2023
3306d1d
CoAlloc: Alloc docs. ICE
peter-lyons-kehl Jan 22, 2023
13f09f7
CoAlloc: Vec + BinaryHeap. ICE
peter-lyons-kehl Dec 14, 2022
932d356
CoAlloc: WeVec. ICE
peter-lyons-kehl Jan 22, 2023
4e2268d
CoAlloc: Vec + Alloc. Moved co_alloc_metadata_num_slots_with_preferen…
peter-lyons-kehl Jan 22, 2023
4f54ecb
CoAlloc: BinaryHeap. ICE
peter-lyons-kehl Jan 22, 2023
72db464
CoAlloc: Vec: Renamed ::core::alloc::co_alloc_metadata_num_slots_with…
peter-lyons-kehl Jan 22, 2023
f9d07de
CoAlloc: VecDeque: Renamed ::core::alloc::co_alloc_metadata_num_slots…
peter-lyons-kehl Jan 22, 2023
dab8ad4
CoAlloc: Minor VecDeque. ICE
peter-lyons-kehl Jan 22, 2023
621d05c
CoAlloc: Vec: Tidy. ICE
peter-lyons-kehl Jan 22, 2023
c5fcbb0
CoAlloc: Vec: Working around ICE rust-lang/rust issue #106473 ICE. WIP
peter-lyons-kehl Jan 22, 2023
9db032e
CoAlloc: Vec (NOT String): Working around ICE rust-lang/rust issue #1…
peter-lyons-kehl Jan 22, 2023
ee19ed9
CoAlloc: BinaryHeap: Working around ICE rust-lang/rust issue #106473 …
peter-lyons-kehl Jan 22, 2023
cae1a82
CoAlloc: Vec + related + FFI (NOT String-related): Macros instead of …
peter-lyons-kehl Jan 22, 2023
6d5e865
CoAlloc: VecDeque: Macros instead of const for global COOP defaults (…
peter-lyons-kehl Jan 22, 2023
061fe5d
CoAlloc: BinaryHeap: Macros instead of const for global COOP defaults…
peter-lyons-kehl Jan 22, 2023
20ade76
CoAlloc: TODO replace co_alloc_metadata_num_slots_with_preference_glo…
peter-lyons-kehl Jan 22, 2023
e516e62
CoAlloc: Vec + core: Renamed co_alloc_metadata_num_slots_with_prefere…
peter-lyons-kehl Jan 23, 2023
9d9e75d
CoAlloc: VecDeque: Renamed co_alloc_metadata_num_slots_with_preferenc…
peter-lyons-kehl Jan 23, 2023
9fd925d
CoAlloc: Vec + Box + Rc: Fixing COOP_PREFERRED (and similar).
peter-lyons-kehl Jan 23, 2023
8d02835
CoAlloc: VecDeque: Fixing COOP_PREFERRED (and similar).
peter-lyons-kehl Jan 23, 2023
6a82ca6
CoAlloc: BinaryHeap: Fixing COOP_PREFERRED (and similar).
peter-lyons-kehl Jan 23, 2023
7348162
CoAlloc: Vec + Box: Fixing COOP_PREFERRED.
peter-lyons-kehl Jan 23, 2023
51889f1
CoAlloc: VecDeque: Fixing COOP_PREFERRED.
peter-lyons-kehl Jan 23, 2023
a772e0f
CoAlloc: Vec: Fixing COOP_PREFERRED.
peter-lyons-kehl Jan 23, 2023
1647c55
CoAlloc: VecDeque: Fixing COOP_PREFERRED.
peter-lyons-kehl Jan 23, 2023
6720d1e
CoAlloc: VecDeque: Fixing COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
59f9ed5
CoAlloc: Slice: Fixing COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
d849403
CoAlloc: Vec: Fixing COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
452bf19
CoAlloc: minor cleanup
peter-lyons-kehl Jan 23, 2023
e8d07df
CoAlloc: Vec: COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
ee2504b
CoAlloc: Vec: COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
4185a1f
CoAlloc: VecDeque: COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
0693767
CoAlloc: library/alloc: minor cleanup
peter-lyons-kehl Jan 23, 2023
f47ce34
CoAlloc: library/alloc: Re-added a closing curly bracket in mod test_…
peter-lyons-kehl Jan 23, 2023
86f332d
CoAlloc: Vec + slice: COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
e097c2f
CoAlloc: library/alloc/src/ffi: minor
peter-lyons-kehl Jan 23, 2023
c146757
CoAlloc: VecDeque: minor
peter-lyons-kehl Jan 23, 2023
6ec79e7
CoAlloc: Vec: COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
cb22e2f
CoAlloc: Vec + Box: COOP_PREFERRED for various traits
peter-lyons-kehl Jan 23, 2023
d74d5be
CoAlloc: VecDeque: minor cleanup
peter-lyons-kehl Jan 23, 2023
df419ce
CoVec, PlVec, DefVec, WeVec. Cleanup.
peter-lyons-kehl Jan 13, 2023
a3c765e
CoAlloc: Vec: added new_co()
peter-lyons-kehl Jan 23, 2023
86d380a
CoAlloc: std/src/lib.rs: minor
peter-lyons-kehl Jan 23, 2023
94f4fdd
CoAlloc: FFI: minor
peter-lyons-kehl Jan 23, 2023
9d808d1
CoAlloc: VecDeque (io::Read + io::Write for VecDeque): minor
peter-lyons-kehl Jan 23, 2023
3059f60
CoAlloc: sys ... thread dtor: minor
peter-lyons-kehl Jan 23, 2023
da31fd7
CoAlloc: alloc: minor
peter-lyons-kehl Jan 23, 2023
36cb284
CoAlloc: library/core: tidy
peter-lyons-kehl Jan 23, 2023
bc9bdc8
CoAlloc: library/proc_macro: tidy
peter-lyons-kehl Jan 23, 2023
1a84ad6
CoAlloc: Vec, Box + related slice.rs: tidy
peter-lyons-kehl Jan 23, 2023
eb83aba
CoAlloc: std: minor tidy
peter-lyons-kehl Jan 23, 2023
374e144
CoAlloc: VecDeque: tidy
peter-lyons-kehl Jan 23, 2023
f928542
CoAlloc: BinaryHeap: tidy
peter-lyons-kehl Jan 23, 2023
25f6d45
CoAlloc: slice.rs: Cleanup (of old code already commented out)
peter-lyons-kehl Jan 23, 2023
bb72710
CoAlloc: Uncommenting assert of BorrowType::TRAVERSAL_PERMIT. TODO Un…
peter-lyons-kehl Jan 13, 2023
3528115
CoAlloc: Vec + related: cleanup. Now library/alloc compiles, but std/…
peter-lyons-kehl Jan 24, 2023
20f0301
CoAlloc: Vec, related + vec! macro: Separated co-alloc-aware function…
peter-lyons-kehl Jan 24, 2023
43855d4
CoAlloc: library/proc_macro (+related library/alloc): Experimenting w…
peter-lyons-kehl Jan 24, 2023
ebb2264
CoAlloc: Renamed feature global_co_alloc_def to global_co_alloc_defau…
peter-lyons-kehl Jan 25, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 12 additions & 12 deletions compiler/rustc_ast/src/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ pub use UnsafeSource::*;
use crate::ptr::P;
use crate::token::{self, CommentKind, Delimiter};
use crate::tokenstream::{DelimSpan, LazyAttrTokenStream, TokenStream};
use core::alloc::GlobalCoAllocMeta;
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
use rustc_data_structures::stack::ensure_sufficient_stack;
use rustc_data_structures::sync::Lrc;
Expand All @@ -36,7 +37,6 @@ use rustc_span::{Span, DUMMY_SP};
use std::fmt;
use std::mem;
use thin_vec::{thin_vec, ThinVec};

/// A "Label" is an identifier of some point in sources,
/// e.g. in the following code:
///
Expand Down Expand Up @@ -3100,26 +3100,26 @@ mod size_asserts {
static_assert_size!(AssocItem, 104);
static_assert_size!(AssocItemKind, 32);
static_assert_size!(Attribute, 32);
static_assert_size!(Block, 48);
static_assert_size!(Expr, 72);
static_assert_size!(ExprKind, 40);
static_assert_size!(Fn, 184);
static_assert_size!(Block, 48 + mem::size_of::<GlobalCoAllocMeta>());
static_assert_size!(Expr, 72 + mem::size_of::<GlobalCoAllocMeta>());
static_assert_size!(ExprKind, 40 + mem::size_of::<GlobalCoAllocMeta>());
static_assert_size!(Fn, 184 + 2 * mem::size_of::<GlobalCoAllocMeta>());
static_assert_size!(ForeignItem, 96);
static_assert_size!(ForeignItemKind, 24);
static_assert_size!(GenericArg, 24);
static_assert_size!(GenericBound, 72);
static_assert_size!(Generics, 72);
static_assert_size!(Impl, 184);
static_assert_size!(Item, 184);
static_assert_size!(ItemKind, 112);
static_assert_size!(GenericBound, 72 + mem::size_of::<GlobalCoAllocMeta>());
static_assert_size!(Generics, 72 + 2 * mem::size_of::<GlobalCoAllocMeta>());
static_assert_size!(Impl, 184 + 3 * mem::size_of::<GlobalCoAllocMeta>());
static_assert_size!(Item, 184 + 3 * mem::size_of::<GlobalCoAllocMeta>());
static_assert_size!(ItemKind, 112 + 3 * mem::size_of::<GlobalCoAllocMeta>());
static_assert_size!(LitKind, 24);
static_assert_size!(Local, 72);
static_assert_size!(MetaItemLit, 40);
static_assert_size!(Param, 40);
static_assert_size!(Pat, 88);
static_assert_size!(Pat, 88 + mem::size_of::<GlobalCoAllocMeta>());
static_assert_size!(Path, 24);
static_assert_size!(PathSegment, 24);
static_assert_size!(PatKind, 64);
static_assert_size!(PatKind, 64 + mem::size_of::<GlobalCoAllocMeta>());
static_assert_size!(Stmt, 32);
static_assert_size!(StmtKind, 16);
static_assert_size!(Ty, 64);
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_ast/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#![feature(box_patterns)]
#![feature(const_default_impls)]
#![feature(const_trait_impl)]
#![feature(global_co_alloc_meta)]
#![feature(if_let_guard)]
#![feature(let_chains)]
#![feature(min_specialization)]
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_middle/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#![feature(exhaustive_patterns)]
#![feature(generators)]
#![feature(get_mut_unchecked)]
#![feature(global_co_alloc_meta)]
#![feature(if_let_guard)]
#![feature(iter_from_generator)]
#![feature(negative_impls)]
Expand Down
3 changes: 2 additions & 1 deletion compiler/rustc_middle/src/mir/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ use crate::ty::visit::{TypeVisitable, TypeVisitor};
use crate::ty::{self, DefIdTree, List, Ty, TyCtxt};
use crate::ty::{AdtDef, InstanceDef, ScalarInt, UserTypeAnnotationIndex};
use crate::ty::{GenericArg, InternalSubsts, SubstsRef};
use core::alloc::GlobalCoAllocMeta;

use rustc_data_structures::captures::Captures;
use rustc_errors::ErrorGuaranteed;
Expand Down Expand Up @@ -3057,7 +3058,7 @@ mod size_asserts {
use super::*;
use rustc_data_structures::static_assert_size;
// tidy-alphabetical-start
static_assert_size!(BasicBlockData<'_>, 144);
static_assert_size!(BasicBlockData<'_>, 144 + mem::size_of::<GlobalCoAllocMeta>());
static_assert_size!(LocalDecl<'_>, 56);
static_assert_size!(Statement<'_>, 32);
static_assert_size!(StatementKind<'_>, 16);
Expand Down
4 changes: 3 additions & 1 deletion compiler/rustc_middle/src/mir/syntax.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
//! The intention is that this file only contains datatype declarations, no code.

use super::{BasicBlock, Constant, Field, Local, SwitchTargets, UserTypeProjection};
use core::alloc::GlobalCoAllocMeta;
use core::mem;

use crate::mir::coverage::{CodeRegion, CoverageKind};
use crate::traits::Reveal;
Expand Down Expand Up @@ -1278,6 +1280,6 @@ mod size_asserts {
static_assert_size!(Operand<'_>, 24);
static_assert_size!(Place<'_>, 16);
static_assert_size!(PlaceElem<'_>, 24);
static_assert_size!(Rvalue<'_>, 40);
static_assert_size!(Rvalue<'_>, 40 + mem::size_of::<GlobalCoAllocMeta>());
// tidy-alphabetical-end
}
1 change: 1 addition & 0 deletions compiler/rustc_parse/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#![feature(array_windows)]
#![feature(box_patterns)]
#![feature(global_co_alloc_meta)]
#![feature(if_let_guard)]
#![feature(iter_intersperse)]
#![feature(let_chains)]
Expand Down
4 changes: 3 additions & 1 deletion compiler/rustc_parse/src/parser/attr_wrapper.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
use super::{Capturing, FlatToken, ForceCollect, Parser, ReplaceRange, TokenCursor, TrailingToken};
use core::alloc::GlobalCoAllocMeta;
use core::mem;
use rustc_ast::token::{self, Delimiter, Token, TokenKind};
use rustc_ast::tokenstream::{AttrTokenStream, AttributesData, ToAttrTokenStream};
use rustc_ast::tokenstream::{AttrTokenTree, DelimSpan, LazyAttrTokenStream, Spacing};
Expand Down Expand Up @@ -469,6 +471,6 @@ mod size_asserts {
use rustc_data_structures::static_assert_size;
// tidy-alphabetical-start
static_assert_size!(AttrWrapper, 16);
static_assert_size!(LazyAttrTokenStreamImpl, 144);
static_assert_size!(LazyAttrTokenStreamImpl, 144 + mem::size_of::<GlobalCoAllocMeta>());
// tidy-alphabetical-end
}
6 changes: 5 additions & 1 deletion compiler/rustc_parse/src/parser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ mod ty;

use crate::lexer::UnmatchedBrace;
pub use attr_wrapper::AttrWrapper;
use core::alloc::GlobalCoAllocMeta;
pub use diagnostics::AttemptLocalParseRecovery;
pub(crate) use item::FnParseMode;
pub use pat::{CommaRecoveryMode, RecoverColon, RecoverComma};
Expand Down Expand Up @@ -168,7 +169,10 @@ pub struct Parser<'a> {
// This type is used a lot, e.g. it's cloned when matching many declarative macro rules with nonterminals. Make sure
// it doesn't unintentionally get bigger.
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
rustc_data_structures::static_assert_size!(Parser<'_>, 336);
rustc_data_structures::static_assert_size!(
Parser<'_>,
336 + 4 * mem::size_of::<GlobalCoAllocMeta>()
);

/// Stores span information about a closure.
#[derive(Clone)]
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_trait_selection/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#![feature(box_patterns)]
#![feature(control_flow_enum)]
#![feature(drain_filter)]
#![feature(global_co_alloc_meta)]
#![feature(hash_drain_filter)]
#![feature(let_chains)]
#![feature(if_let_guard)]
Expand Down
5 changes: 4 additions & 1 deletion compiler/rustc_trait_selection/src/traits/fulfill.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
use crate::infer::{InferCtxt, TyOrConstInferVar};
use core::alloc::GlobalCoAllocMeta;
use core::mem;
// use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::obligation_forest::ProcessResult;
use rustc_data_structures::obligation_forest::{Error, ForestObligation, Outcome};
use rustc_data_structures::obligation_forest::{ObligationForest, ObligationProcessor};
Expand Down Expand Up @@ -77,7 +80,7 @@ pub struct PendingPredicateObligation<'tcx> {

// `PendingPredicateObligation` is used a lot. Make sure it doesn't unintentionally get bigger.
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
static_assert_size!(PendingPredicateObligation<'_>, 72);
static_assert_size!(PendingPredicateObligation<'_>, 72 + mem::size_of::<GlobalCoAllocMeta>());

impl<'a, 'tcx> FulfillmentContext<'tcx> {
/// Creates a new fulfillment context.
Expand Down
64 changes: 49 additions & 15 deletions library/alloc/src/boxed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -641,7 +641,8 @@ impl<T> Box<[T]> {
#[unstable(feature = "new_uninit", issue = "63291")]
#[must_use]
pub fn new_uninit_slice(len: usize) -> Box<[mem::MaybeUninit<T>]> {
unsafe { RawVec::with_capacity(len).into_box(len) }
// false = no need for co-alloc metadata, since it would get lost once converted to Box.
unsafe { RawVec::<T, Global, false>::with_capacity(len).into_box(len) }
}

/// Constructs a new boxed slice with uninitialized contents, with the memory
Expand All @@ -666,7 +667,8 @@ impl<T> Box<[T]> {
#[unstable(feature = "new_uninit", issue = "63291")]
#[must_use]
pub fn new_zeroed_slice(len: usize) -> Box<[mem::MaybeUninit<T>]> {
unsafe { RawVec::with_capacity_zeroed(len).into_box(len) }
// false = no need for co-alloc metadata, since it would get lost once converted to Box.
unsafe { RawVec::<T, Global, false>::with_capacity_zeroed(len).into_box(len) }
}

/// Constructs a new boxed slice with uninitialized contents. Returns an error if
Expand Down Expand Up @@ -698,7 +700,12 @@ impl<T> Box<[T]> {
Err(_) => return Err(AllocError),
};
let ptr = Global.allocate(layout)?;
Ok(RawVec::from_raw_parts_in(ptr.as_mut_ptr() as *mut _, len, Global).into_box(len))
Ok(RawVec::<T, Global, false>::from_raw_parts_in(
ptr.as_mut_ptr() as *mut _,
len,
Global,
)
.into_box(len))
}
}

Expand Down Expand Up @@ -730,12 +737,20 @@ impl<T> Box<[T]> {
Err(_) => return Err(AllocError),
};
let ptr = Global.allocate_zeroed(layout)?;
Ok(RawVec::from_raw_parts_in(ptr.as_mut_ptr() as *mut _, len, Global).into_box(len))
Ok(RawVec::<T, Global, false>::from_raw_parts_in(
ptr.as_mut_ptr() as *mut _,
len,
Global,
)
.into_box(len))
}
}
}

impl<T, A: Allocator> Box<[T], A> {
impl<T, A: Allocator> Box<[T], A>
where
[(); core::alloc::co_alloc_metadata_num_slots::<A>()]:,
{
/// Constructs a new boxed slice with uninitialized contents in the provided allocator.
///
/// # Examples
Expand All @@ -762,8 +777,13 @@ impl<T, A: Allocator> Box<[T], A> {
#[unstable(feature = "allocator_api", issue = "32838")]
// #[unstable(feature = "new_uninit", issue = "63291")]
#[must_use]
pub fn new_uninit_slice_in(len: usize, alloc: A) -> Box<[mem::MaybeUninit<T>], A> {
unsafe { RawVec::with_capacity_in(len, alloc).into_box(len) }
#[allow(unused_braces)]
pub fn new_uninit_slice_in(len: usize, alloc: A) -> Box<[mem::MaybeUninit<T>], A>
where
// false = no need for co-alloc metadata, since it would get lost once converted to Box.
[(); core::alloc::co_alloc_metadata_num_slots_with_preference::<A>(false)]:,
{
unsafe { RawVec::<T, A, false>::with_capacity_in(len, alloc).into_box(len) }
}

/// Constructs a new boxed slice with uninitialized contents in the provided allocator,
Expand All @@ -790,8 +810,13 @@ impl<T, A: Allocator> Box<[T], A> {
#[unstable(feature = "allocator_api", issue = "32838")]
// #[unstable(feature = "new_uninit", issue = "63291")]
#[must_use]
pub fn new_zeroed_slice_in(len: usize, alloc: A) -> Box<[mem::MaybeUninit<T>], A> {
unsafe { RawVec::with_capacity_zeroed_in(len, alloc).into_box(len) }
#[allow(unused_braces)]
pub fn new_zeroed_slice_in(len: usize, alloc: A) -> Box<[mem::MaybeUninit<T>], A>
where
// false = no need for co-alloc metadata, since it would get lost once converted to Box.
[(); core::alloc::co_alloc_metadata_num_slots_with_preference::<A>(false)]:,
{
unsafe { RawVec::<T, A, false>::with_capacity_zeroed_in(len, alloc).into_box(len) }
}
}

Expand Down Expand Up @@ -1496,7 +1521,8 @@ impl<T: Copy> From<&[T]> for Box<[T]> {
/// ```
fn from(slice: &[T]) -> Box<[T]> {
let len = slice.len();
let buf = RawVec::with_capacity(len);
// false = no need for co-alloc metadata, since it would get lost once converted to Box.
let buf = RawVec::<T, Global, false>::with_capacity(len);
unsafe {
ptr::copy_nonoverlapping(slice.as_ptr(), buf.ptr(), len);
buf.into_box(slice.len()).assume_init()
Expand Down Expand Up @@ -1661,8 +1687,12 @@ impl<T, const N: usize> TryFrom<Box<[T]>> for Box<[T; N]> {

#[cfg(not(no_global_oom_handling))]
#[stable(feature = "boxed_array_try_from_vec", since = "1.66.0")]
impl<T, const N: usize> TryFrom<Vec<T>> for Box<[T; N]> {
type Error = Vec<T>;
impl<T, const N: usize, const COOP_PREFERRED: bool> TryFrom<Vec<T, Global, COOP_PREFERRED>>
for Box<[T; N]>
where
[(); core::alloc::co_alloc_metadata_num_slots_with_preference::<Global>(COOP_PREFERRED)]:,
{
type Error = Vec<T, Global, COOP_PREFERRED>;

/// Attempts to convert a `Vec<T>` into a `Box<[T; N]>`.
///
Expand All @@ -1682,7 +1712,7 @@ impl<T, const N: usize> TryFrom<Vec<T>> for Box<[T; N]> {
/// let state: Box<[f32; 100]> = vec![1.0; 100].try_into().unwrap();
/// assert_eq!(state.len(), 100);
/// ```
fn try_from(vec: Vec<T>) -> Result<Self, Self::Error> {
fn try_from(vec: Vec<T, Global, COOP_PREFERRED>) -> Result<Self, Self::Error> {
if vec.len() == N {
let boxed_slice = vec.into_boxed_slice();
Ok(unsafe { boxed_slice_as_array_unchecked(boxed_slice) })
Expand Down Expand Up @@ -2019,10 +2049,14 @@ impl<I> FromIterator<I> for Box<[I]> {

#[cfg(not(no_global_oom_handling))]
#[stable(feature = "box_slice_clone", since = "1.3.0")]
impl<T: Clone, A: Allocator + Clone> Clone for Box<[T], A> {
impl<T: Clone, A: Allocator + Clone> Clone for Box<[T], A>
where
[(); core::alloc::co_alloc_metadata_num_slots_with_preference::<A>(false)]:,
{
fn clone(&self) -> Self {
let alloc = Box::allocator(self).clone();
self.to_vec_in(alloc).into_boxed_slice()
// false = no need for co-alloc metadata, since it would get lost once converted to the boxed slice.
self.to_vec_in::<A, false>(alloc).into_boxed_slice()
}

fn clone_from(&mut self, other: &Self) {
Expand Down
Loading