Skip to content

coop-rs 03 vec macroed #107607

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 112 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
cfe596b
START CoAlloc API
peter-lyons-kehl Jan 21, 2023
68e9405
CoAlloc: RawVec + compiler 'tests'
peter-lyons-kehl Jan 21, 2023
238f291
CoAlloc: GlobalAlloc API
peter-lyons-kehl Dec 10, 2022
f4aa6f2
CoAlloc: Alloc API
peter-lyons-kehl Jan 21, 2023
90dab29
CoAlloc: RawVec includes GlobalCoAllocMeta based on allocator; relate…
peter-lyons-kehl Jan 21, 2023
f067d64
CoAlloc: VecDeque (PROBABLY NOT COMPILING, standard error)
peter-lyons-kehl Jan 21, 2023
1dfcc39
CoAlloc: RawVec + Vec with COOP_PREFERRED. PROBABLY NOT COMPILING, bu…
peter-lyons-kehl Jan 22, 2023
c8f25a8
VecDeque with COOP_PREFERRED. PROBABLY NOT COMPILING, but no ICE.
peter-lyons-kehl Jan 22, 2023
14c624b
CoAlloc: RawVec, Vec, Box uses bounds. ICE
peter-lyons-kehl Jan 22, 2023
594149d
CoAlloc: BinaryHeap now uses bounds. (Probably needs to go together w…
peter-lyons-kehl Jan 22, 2023
b19d9e8
CoAlloc: VecDeque now uses bounds. ICE
peter-lyons-kehl Jan 22, 2023
e8f516b
CoAlloc: VecDeque. Probably ICE.
peter-lyons-kehl Jan 22, 2023
02719eb
CoAlloc: Vec + Slice. ICE
peter-lyons-kehl Jan 22, 2023
442f68d
CoAlloc: VecDeque. ICE
peter-lyons-kehl Jan 22, 2023
979ea25
CoAlloc: Minor
peter-lyons-kehl Jan 22, 2023
57f9939
CoAlloc: Vec + its use cases. ICE
peter-lyons-kehl Jan 22, 2023
7b74fbc
CoAlloc: VecDeque minor. ICE
peter-lyons-kehl Jan 22, 2023
7943a12
CoAlloc: Vec, Alloc, GlobalAlloc: x test tidy --bless. ICE
peter-lyons-kehl Jan 22, 2023
47d2659
CoAlloc: VecDeque + BinaryHeap: x test tidy --bless. ICE
peter-lyons-kehl Jan 22, 2023
d5b92f5
CoAlloc: VecDeque. ICE
peter-lyons-kehl Jan 22, 2023
5c4a755
CoAlloc: VecDeque. ICE
peter-lyons-kehl Jan 22, 2023
b6a5372
CoAlloc: Alloc docs. ICE
peter-lyons-kehl Jan 22, 2023
8c5e399
CoAlloc: Vec + BinaryHeap. ICE
peter-lyons-kehl Dec 14, 2022
8adc82a
CoAlloc: WeVec. ICE
peter-lyons-kehl Jan 22, 2023
e107119
CoAlloc: Vec + Alloc. Moved co_alloc_metadata_num_slots_with_preferen…
peter-lyons-kehl Jan 22, 2023
2472386
CoAlloc: BinaryHeap. ICE
peter-lyons-kehl Jan 22, 2023
f7f8539
CoAlloc: Vec: Renamed ::core::alloc::co_alloc_metadata_num_slots_with…
peter-lyons-kehl Jan 22, 2023
b07964c
CoAlloc: VecDeque: Renamed ::core::alloc::co_alloc_metadata_num_slots…
peter-lyons-kehl Jan 22, 2023
eb821a2
CoAlloc: Minor VecDeque. ICE
peter-lyons-kehl Jan 22, 2023
ebb4cce
CoAlloc: Vec: Tidy. ICE
peter-lyons-kehl Jan 22, 2023
ccfd944
CoAlloc: Vec: Working around ICE rust-lang/rust issue #106473 ICE. WIP
peter-lyons-kehl Jan 22, 2023
533d2da
CoAlloc: Vec (NOT String): Working around ICE rust-lang/rust issue #1…
peter-lyons-kehl Jan 22, 2023
0c6d714
CoAlloc: BinaryHeap: Working around ICE rust-lang/rust issue #106473 …
peter-lyons-kehl Jan 22, 2023
6f904d3
CoAlloc: Vec + related + FFI (NOT String-related): Macros instead of …
peter-lyons-kehl Jan 22, 2023
dd7b7a9
CoAlloc: VecDeque: Macros instead of const for global COOP defaults (…
peter-lyons-kehl Jan 22, 2023
9ebe0fd
CoAlloc: BinaryHeap: Macros instead of const for global COOP defaults…
peter-lyons-kehl Jan 22, 2023
8b2584a
CoAlloc: TODO replace co_alloc_metadata_num_slots_with_preference_glo…
peter-lyons-kehl Jan 22, 2023
b839e8e
CoAlloc: Vec + core: Renamed co_alloc_metadata_num_slots_with_prefere…
peter-lyons-kehl Jan 23, 2023
fa2d748
CoAlloc: VecDeque: Renamed co_alloc_metadata_num_slots_with_preferenc…
peter-lyons-kehl Jan 23, 2023
963fc29
CoAlloc: Vec + Box + Rc: Fixing COOP_PREFERRED (and similar).
peter-lyons-kehl Jan 23, 2023
e4bf69d
CoAlloc: VecDeque: Fixing COOP_PREFERRED (and similar).
peter-lyons-kehl Jan 23, 2023
27d4c6c
CoAlloc: BinaryHeap: Fixing COOP_PREFERRED (and similar).
peter-lyons-kehl Jan 23, 2023
334a637
CoAlloc: Vec + Box: Fixing COOP_PREFERRED.
peter-lyons-kehl Jan 23, 2023
dd2a0ce
CoAlloc: VecDeque: Fixing COOP_PREFERRED.
peter-lyons-kehl Jan 23, 2023
a8771d6
CoAlloc: Vec: Fixing COOP_PREFERRED.
peter-lyons-kehl Jan 23, 2023
02aac35
CoAlloc: VecDeque: Fixing COOP_PREFERRED.
peter-lyons-kehl Jan 23, 2023
f194c57
CoAlloc: VecDeque: Fixing COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
9ecbfa6
CoAlloc: Slice: Fixing COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
0827f34
CoAlloc: Vec: Fixing COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
c595c3c
CoAlloc: minor cleanup
peter-lyons-kehl Jan 23, 2023
3a2c998
CoAlloc: Vec: COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
75a9bd3
CoAlloc: Vec: COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
69f1200
CoAlloc: VecDeque: COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
df06667
CoAlloc: library/alloc: minor cleanup
peter-lyons-kehl Jan 23, 2023
35d5c94
CoAlloc: library/alloc: Re-added a closing curly bracket in mod test_…
peter-lyons-kehl Jan 23, 2023
39d8936
CoAlloc: Vec + slice: COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
30416fc
CoAlloc: library/alloc/src/ffi: minor
peter-lyons-kehl Jan 23, 2023
8d61314
CoAlloc: VecDeque: minor
peter-lyons-kehl Jan 23, 2023
4ae5a82
CoAlloc: Vec: COOP_PREFERRED
peter-lyons-kehl Jan 23, 2023
853f525
CoAlloc: Vec + Box: COOP_PREFERRED for various traits
peter-lyons-kehl Jan 23, 2023
49c1877
CoAlloc: VecDeque: minor cleanup
peter-lyons-kehl Jan 23, 2023
55c8f4c
CoVec, PlVec, DefVec, WeVec. Cleanup.
peter-lyons-kehl Jan 13, 2023
fe828ff
CoAlloc: Vec: added new_co()
peter-lyons-kehl Jan 23, 2023
49fc455
CoAlloc: std/src/lib.rs: minor
peter-lyons-kehl Jan 23, 2023
f18c91f
CoAlloc: FFI: minor
peter-lyons-kehl Jan 23, 2023
619e931
CoAlloc: VecDeque (io::Read + io::Write for VecDeque): minor
peter-lyons-kehl Jan 23, 2023
1c199ef
CoAlloc: sys ... thread dtor: minor
peter-lyons-kehl Jan 23, 2023
e4806ec
CoAlloc: alloc: minor
peter-lyons-kehl Jan 23, 2023
c4c75c9
CoAlloc: library/core: tidy
peter-lyons-kehl Jan 23, 2023
7f65630
CoAlloc: library/proc_macro: tidy
peter-lyons-kehl Jan 23, 2023
57ac69b
CoAlloc: Vec, Box + related slice.rs: tidy
peter-lyons-kehl Jan 23, 2023
dcf3104
CoAlloc: std: minor tidy
peter-lyons-kehl Jan 23, 2023
7560757
CoAlloc: VecDeque: tidy
peter-lyons-kehl Jan 23, 2023
1c13315
CoAlloc: BinaryHeap: tidy
peter-lyons-kehl Jan 23, 2023
1a9365e
CoAlloc: slice.rs: Cleanup (of old code already commented out)
peter-lyons-kehl Jan 23, 2023
e0c2c1a
CoAlloc: Uncommenting assert of BorrowType::TRAVERSAL_PERMIT. TODO Un…
peter-lyons-kehl Jan 13, 2023
77dfff4
CoAlloc: Vec + related: cleanup. Now library/alloc compiles, but std/…
peter-lyons-kehl Jan 24, 2023
928c5ac
CoAlloc: Vec, related + vec! macro: Separated co-alloc-aware function…
peter-lyons-kehl Jan 24, 2023
8ea691a
CoAlloc: library/proc_macro (+related library/alloc): Experimenting w…
peter-lyons-kehl Jan 24, 2023
35b828d
CoAlloc: Renamed feature global_co_alloc_def to global_co_alloc_defau…
peter-lyons-kehl Jan 25, 2023
bf2363d
CoAlloc: Removed co_alloc_metadata_num_slots(). Added docs.
peter-lyons-kehl Jan 25, 2023
7839b24
CoAlloc: Move + rename macros DEFAULT_COOP_PREF + meta_num_slots* mac…
peter-lyons-kehl Jan 26, 2023
f710e61
CoAlloc: Using the new macros (not everywhere yet).
peter-lyons-kehl Jan 26, 2023
b91b20e
CoAlloc: Renamed IS_CO_ALLOCATOR -> CO_ALLOCATES_WITH_META. Added All…
peter-lyons-kehl Jan 26, 2023
b6b6dfa
CoAlloc: Moved CoAllocMeta to both Allocator and GlobalAlloc.
peter-lyons-kehl Jan 26, 2023
3b989a6
CoAlloc: meta_num_slots... macros- WIP
peter-lyons-kehl Jan 26, 2023
f28d21b
CoAlloc: meta_num_slots... macros- WIP..
peter-lyons-kehl Jan 27, 2023
efd728a
CoAlloc: renamed macro DEFAULT_COOP_PREF -> CO_ALLOC_PREF_DEFAULT
peter-lyons-kehl Jan 27, 2023
13190c4
CoAlloc: minor tidy
peter-lyons-kehl Jan 27, 2023
687a318
CoAlloc: Preference/config types in ::alloc::co_alloc. Config value m…
peter-lyons-kehl Jan 28, 2023
0f5e8b0
CoAlloc: Renaming to use new value/config + transformation macros.
peter-lyons-kehl Jan 29, 2023
eb0bc33
CoAlloc: Using config + transformation macros in ::alloc. ICE!
peter-lyons-kehl Jan 29, 2023
b243399
CoAlloc: co_alloc_pref changed to 0usize - and (at least now) no ICE.
peter-lyons-kehl Jan 30, 2023
84f494d
CoAlloc: library/alloc now uses macros, and no ICE. But meta_num_slot…
peter-lyons-kehl Jan 30, 2023
611da39
CoAlloc: Using macros for config + transformations. WIP
peter-lyons-kehl Jan 31, 2023
10b3593
CoAlloc: (Some) Separation of co-alloc-aware traits & methods.
peter-lyons-kehl Jan 31, 2023
3cae616
CoAlloc: Undoing generalizations + splitting. WIP
peter-lyons-kehl Feb 1, 2023
5e0d7df
CoAlloc: slice::to_vec_co, slice::to_vec_in_co.
peter-lyons-kehl Feb 1, 2023
5a1f3bd
CoAlloc: Separated Vec::from_raw_parts_co and similar (and also in Ve…
peter-lyons-kehl Feb 1, 2023
023f14a
CoAlloc: tidy
peter-lyons-kehl Feb 1, 2023
a56b09a
CoAlloc: Fixed my buggy rebase. Added slice::SpecCloneIntoVecCo and f…
peter-lyons-kehl Feb 2, 2023
c2eea98
CoAlloc: Default for Vec - both coallocation-aware (default fn), and …
peter-lyons-kehl Feb 2, 2023
89e6170
CoAlloc: VecDeque: new_co, with_capacity_co, made default() coallocat…
peter-lyons-kehl Feb 2, 2023
4822feb
CoAlloc: tidy
peter-lyons-kehl Feb 2, 2023
fae59a0
CoAlloc: Fixed previous sick result of: tidy --bless
peter-lyons-kehl Feb 2, 2023
4821cb2
CoAlloc: slice::into_vec_co - for vec![...].
peter-lyons-kehl Feb 2, 2023
c427cd4
CoAlloc: compiler/rustc_arena: specialization; using Allocator::CoAll…
peter-lyons-kehl Feb 3, 2023
45518cd
CoAlloc: Unspecialized and specialized Box<[T]>::from(Vec) and Vec::f…
peter-lyons-kehl Feb 4, 2023
a93b530
CoAlloc: Fixed specializations
peter-lyons-kehl Feb 14, 2023
76b2237
CoAlloc: Fixes
peter-lyons-kehl Feb 15, 2023
d2a5893
Limited working around rust-lang/rust issue #106473.
peter-lyons-kehl Feb 15, 2023
39e5747
CoAlloc: tidy
peter-lyons-kehl Feb 15, 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
4 changes: 3 additions & 1 deletion compiler/rustc_arena/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@
html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/",
test(no_crate_inject, attr(deny(warnings)))
)]
#![allow(incomplete_features)]
#![feature(dropck_eyepatch)]
#![feature(new_uninit)]
#![feature(maybe_uninit_slice)]
#![feature(min_specialization)]
//#![feature(min_specialization)]
#![feature(specialization)]
#![feature(decl_macro)]
#![feature(pointer_byte_offsets)]
#![feature(rustc_attrs)]
Expand Down
25 changes: 13 additions & 12 deletions compiler/rustc_ast/src/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,11 @@ use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
use rustc_span::source_map::{respan, Spanned};
use rustc_span::symbol::{kw, sym, Ident, Symbol};
use rustc_span::{Span, DUMMY_SP};
use std::alloc::Allocator;
use std::alloc::Global;
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 @@ -3112,26 +3113,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::<<Global as Allocator>::CoAllocMeta>());
static_assert_size!(Expr, 72 + mem::size_of::<<Global as Allocator>::CoAllocMeta>());
static_assert_size!(ExprKind, 40 + mem::size_of::<<Global as Allocator>::CoAllocMeta>());
static_assert_size!(Fn, 184 + 2 * mem::size_of::<<Global as Allocator>::CoAllocMeta>());
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::<<Global as Allocator>::CoAllocMeta>());
static_assert_size!(Generics, 72 + 2 * mem::size_of::<<Global as Allocator>::CoAllocMeta>());
static_assert_size!(Impl, 184 + 3 * mem::size_of::<<Global as Allocator>::CoAllocMeta>());
static_assert_size!(Item, 184 + 3 * mem::size_of::<<Global as Allocator>::CoAllocMeta>());
static_assert_size!(ItemKind, 112 + 3 * mem::size_of::<<Global as Allocator>::CoAllocMeta>());
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::<<Global as Allocator>::CoAllocMeta>());
static_assert_size!(Path, 24);
static_assert_size!(PathSegment, 24);
static_assert_size!(PatKind, 64);
static_assert_size!(PatKind, 64 + mem::size_of::<<Global as Allocator>::CoAllocMeta>());
static_assert_size!(Stmt, 32);
static_assert_size!(StmtKind, 16);
static_assert_size!(Ty, 64);
Expand Down
2 changes: 2 additions & 0 deletions compiler/rustc_ast/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@
html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/",
test(attr(deny(warnings)))
)]
#![feature(allocator_api)]
#![feature(associated_type_bounds)]
#![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 @@ -3056,7 +3057,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 @@ -1284,6 +1286,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
66 changes: 53 additions & 13 deletions library/alloc/src/boxed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@

#![stable(feature = "rust1", since = "1.0.0")]

use crate::co_alloc::CoAllocPref;
use core::any::Any;
use core::async_iter::AsyncIterator;
use core::borrow;
Expand Down Expand Up @@ -641,7 +642,10 @@ 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, { CO_ALLOC_PREF_META_NO!() }>::with_capacity(len).into_box(len)
}
}

/// Constructs a new boxed slice with uninitialized contents, with the memory
Expand All @@ -666,7 +670,11 @@ 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, { CO_ALLOC_PREF_META_NO!() }>::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 +706,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, { CO_ALLOC_PREF_META_NO!() }>::from_raw_parts_in(
ptr.as_mut_ptr() as *mut _,
len,
Global,
)
.into_box(len))
}
}

Expand Down Expand Up @@ -730,12 +743,21 @@ 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, { CO_ALLOC_PREF_META_NO!() }>::from_raw_parts_in(
ptr.as_mut_ptr() as *mut _,
len,
Global,
)
.into_box(len))
}
}
}

impl<T, A: Allocator> Box<[T], A> {
#[allow(unused_braces)]
impl<T, A: Allocator> Box<[T], A>
where
[(); { crate::meta_num_slots!(A, crate::CO_ALLOC_PREF_META_NO!()) }]:,
{
/// Constructs a new boxed slice with uninitialized contents in the provided allocator.
///
/// # Examples
Expand All @@ -762,8 +784,11 @@ impl<T, A: Allocator> Box<[T], A> {
#[unstable(feature = "allocator_api", issue = "32838")]
// #[unstable(feature = "new_uninit", issue = "63291")]
#[must_use]
#[allow(unused_braces)]
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) }
unsafe {
RawVec::<T, A, { CO_ALLOC_PREF_META_NO!() }>::with_capacity_in(len, alloc).into_box(len)
}
}

/// Constructs a new boxed slice with uninitialized contents in the provided allocator,
Expand All @@ -790,8 +815,12 @@ impl<T, A: Allocator> Box<[T], A> {
#[unstable(feature = "allocator_api", issue = "32838")]
// #[unstable(feature = "new_uninit", issue = "63291")]
#[must_use]
#[allow(unused_braces)]
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) }
unsafe {
RawVec::<T, A, { CO_ALLOC_PREF_META_NO!() }>::with_capacity_zeroed_in(len, alloc)
.into_box(len)
}
}
}

Expand Down Expand Up @@ -1496,7 +1525,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, { CO_ALLOC_PREF_META_NO!() }>::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 +1691,13 @@ 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>;
#[allow(unused_braces)]
impl<T, const N: usize, const CO_ALLOC_PREF: CoAllocPref> TryFrom<Vec<T, Global, CO_ALLOC_PREF>>
for Box<[T; N]>
where
[(); { meta_num_slots_global!(CO_ALLOC_PREF) }]:,
{
type Error = Vec<T, Global, CO_ALLOC_PREF>;

/// Attempts to convert a `Vec<T>` into a `Box<[T; N]>`.
///
Expand All @@ -1682,7 +1717,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, CO_ALLOC_PREF>) -> 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 +2054,15 @@ 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> {
#[allow(unused_braces)]
impl<T: Clone, A: Allocator + Clone> Clone for Box<[T], A>
where
[(); { crate::meta_num_slots!(A, crate::CO_ALLOC_PREF_META_NO!()) }]:,
{
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_co::<A, { CO_ALLOC_PREF_META_NO!() }>(alloc).into_boxed_slice()
}

fn clone_from(&mut self, other: &Self) {
Expand Down
47 changes: 47 additions & 0 deletions library/alloc/src/co_alloc.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
//! CoAlloction-specific types that only apply in heap-based applications (hence not a part of
//! [::core]).
//!
//! Types here have names with `CoAlloc` prefix. Yes, when using a q ualified path (like
//! ::alloc::co_alloc::CoAllocPref), that involves "stuttering", which is not recommended.
//!
//! However, as per Rust Book the common practice is to import type names fully and access them just
//! with their name (except for cases of conflict). And we don't want the type names any shorter
//! (such `Pref`), because thoe would be vague/confusing.

/// `CoAllocPref` values indicate a type's preference for coallocation (in either user space, or
/// `std` space). Used as a `const` generic parameter type (usually called `CO_ALLOC_PREF`).
///
/// The actual value may be overriden by the allocator. See also `CoAllocMetaNumSlotsPref` and
/// `co_alloc_pref` macro .
///
/// This type WILL CHANGE (once ``#![feature(generic_const_exprs)]` and
/// `#![feature(adt_const_params)]` are stable) to a dedicated struct/enum. Hence:
/// - DO NOT construct instances, but use `co_alloc_pref` macro together with constants
/// `CO_ALLOC_PREF_META_YES` and `CO_ALLOC_PREF_META_NO`;
/// - DO NOT hard code any values; and
/// - DO NOT mix this/cast this with/to `u8`, `u16`, `usize` (nor any other integer).
#[unstable(feature = "global_co_alloc_meta", issue = "none")]
pub type CoAllocPref = usize; //u8;

/// `CoAllocMetaNumSlotsPref` values indicate that a type (but not necessarily an allocator) prefers
/// to coallocate by carrying metadata, or not. (In either user space, or `std` or `alloc` space).
/// Used as an argument to macro call of `co_alloc_pref`, which generates a `CoAllocPref` value.
///
/// Currently this indicates only the (preferred) number of `CoAllocMetaBase` slots being used
/// (either 1 = coallocation, or 0 = no coallocation). However, in the future this type may have
/// other properties (serving as extra hints to the allocator).
///
/// The actual value may be overriden by the allocator. For example, if the allocator doesn't
/// support coallocation, then whether this value prefers to coallocate or not makes no difference.
///
/// This type WILL CHANGE (once ``#![feature(generic_const_exprs)]` and
/// `#![feature(adt_const_params)]` are stable) to a dedicated struct/enum. Hence:
/// - DO NOT mix this/cast this with/to `u8`, `u16`, (nor any other integer); and
/// - DO NOT hard code any values, but use `CO_ALLOC_PREF_META_YES` and `CO_ALLOC_PREF_META_NO`.
///
/// This type is intentionally not `u16`, `u32`, nor `usize`. Why? This helps to prevent mistakes
/// when one would use `CO_ALLOC_PREF_META_YES` or `CO_ALLOC_PREF_META_NO` in place of `CoAllocPref`
/// vales, or in place of a result of `meta_num_slots` macro. That also prevents mixing up with
/// [core::alloc::CoAllocatorMetaNumSlots].
#[unstable(feature = "global_co_alloc_meta", issue = "none")]
pub type CoAllocMetaNumSlotsPref = u16;
Loading