Auto merge of #75033 - Manishearth:rollup-d8afil1, r=Manishearth
Rollup of 5 pull requests Successful merges: - #74602 (Clarify the doc for MaybeUninit::zeroed on incorrect use) - #74720 (Clean up E0728 explanation) - #74992 (fix rustdoc generic param order) - #75015 (Add Vec::spare_capacity_mut) - #75022 (Use a slice pattern instead of rchunks_exact(_).next()) Failed merges: r? @ghost
This commit is contained in:
commit
e18b56345f
8 changed files with 63 additions and 37 deletions
|
@ -65,7 +65,7 @@ use core::hash::{Hash, Hasher};
|
||||||
use core::intrinsics::{arith_offset, assume};
|
use core::intrinsics::{arith_offset, assume};
|
||||||
use core::iter::{FromIterator, FusedIterator, TrustedLen};
|
use core::iter::{FromIterator, FusedIterator, TrustedLen};
|
||||||
use core::marker::PhantomData;
|
use core::marker::PhantomData;
|
||||||
use core::mem::{self, ManuallyDrop};
|
use core::mem::{self, ManuallyDrop, MaybeUninit};
|
||||||
use core::ops::Bound::{Excluded, Included, Unbounded};
|
use core::ops::Bound::{Excluded, Included, Unbounded};
|
||||||
use core::ops::{self, Index, IndexMut, RangeBounds};
|
use core::ops::{self, Index, IndexMut, RangeBounds};
|
||||||
use core::ptr::{self, NonNull};
|
use core::ptr::{self, NonNull};
|
||||||
|
@ -1523,6 +1523,47 @@ impl<T> Vec<T> {
|
||||||
{
|
{
|
||||||
Box::leak(self.into_boxed_slice())
|
Box::leak(self.into_boxed_slice())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the remaining spare capacity of the vector as a slice of
|
||||||
|
/// `MaybeUninit<T>`.
|
||||||
|
///
|
||||||
|
/// The returned slice can be used to fill the vector with data (e.g. by
|
||||||
|
/// reading from a file) before marking the data as initialized using the
|
||||||
|
/// [`set_len`] method.
|
||||||
|
///
|
||||||
|
/// [`set_len`]: #method.set_len
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #![feature(vec_spare_capacity, maybe_uninit_extra)]
|
||||||
|
///
|
||||||
|
/// // Allocate vector big enough for 10 elements.
|
||||||
|
/// let mut v = Vec::with_capacity(10);
|
||||||
|
///
|
||||||
|
/// // Fill in the first 3 elements.
|
||||||
|
/// let uninit = v.spare_capacity_mut();
|
||||||
|
/// uninit[0].write(0);
|
||||||
|
/// uninit[1].write(1);
|
||||||
|
/// uninit[2].write(2);
|
||||||
|
///
|
||||||
|
/// // Mark the first 3 elements of the vector as being initialized.
|
||||||
|
/// unsafe {
|
||||||
|
/// v.set_len(3);
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// assert_eq!(&v, &[0, 1, 2]);
|
||||||
|
/// ```
|
||||||
|
#[unstable(feature = "vec_spare_capacity", issue = "75017")]
|
||||||
|
#[inline]
|
||||||
|
pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>] {
|
||||||
|
unsafe {
|
||||||
|
slice::from_raw_parts_mut(
|
||||||
|
self.as_mut_ptr().add(self.len) as *mut MaybeUninit<T>,
|
||||||
|
self.buf.capacity() - self.len,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Clone> Vec<T> {
|
impl<T: Clone> Vec<T> {
|
||||||
|
|
|
@ -336,8 +336,8 @@ impl<T> MaybeUninit<T> {
|
||||||
/// assert_eq!(x, (0, false));
|
/// assert_eq!(x, (0, false));
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// *Incorrect* usage of this function: initializing a struct with zero, where some fields
|
/// *Incorrect* usage of this function: calling `x.zeroed().assume_init()`
|
||||||
/// cannot hold 0 as a valid value.
|
/// when `0` is not a valid bit-pattern for the type:
|
||||||
///
|
///
|
||||||
/// ```rust,no_run
|
/// ```rust,no_run
|
||||||
/// use std::mem::MaybeUninit;
|
/// use std::mem::MaybeUninit;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[`await`] has been used outside [`async`] function or block.
|
[`await`] has been used outside [`async`] function or [`async`] block.
|
||||||
|
|
||||||
Erroneous code examples:
|
Erroneous code example:
|
||||||
|
|
||||||
```edition2018,compile_fail,E0728
|
```edition2018,compile_fail,E0728
|
||||||
# use std::pin::Pin;
|
# use std::pin::Pin;
|
||||||
|
@ -33,7 +33,7 @@ fn foo() {
|
||||||
|
|
||||||
[`await`] is used to suspend the current computation until the given
|
[`await`] is used to suspend the current computation until the given
|
||||||
future is ready to produce a value. So it is legal only within
|
future is ready to produce a value. So it is legal only within
|
||||||
an [`async`] context, like an `async fn` or an `async` block.
|
an [`async`] context, like an `async` function or an `async` block.
|
||||||
|
|
||||||
```edition2018
|
```edition2018
|
||||||
# use std::pin::Pin;
|
# use std::pin::Pin;
|
||||||
|
|
|
@ -637,7 +637,7 @@ impl EmbargoVisitor<'tcx> {
|
||||||
&mut self,
|
&mut self,
|
||||||
segments: &[hir::PathSegment<'_>],
|
segments: &[hir::PathSegment<'_>],
|
||||||
) {
|
) {
|
||||||
if let Some([module, segment]) = segments.rchunks_exact(2).next() {
|
if let [.., module, segment] = segments {
|
||||||
if let Some(item) = module
|
if let Some(item) = module
|
||||||
.res
|
.res
|
||||||
.and_then(|res| res.mod_def_id())
|
.and_then(|res| res.mod_def_id())
|
||||||
|
|
|
@ -480,6 +480,11 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> {
|
||||||
.clean(self.cx)
|
.clean(self.cx)
|
||||||
.params;
|
.params;
|
||||||
|
|
||||||
|
debug!(
|
||||||
|
"param_env_to_generics({:?}): generic_params={:?}",
|
||||||
|
param_env_def_id, generic_params
|
||||||
|
);
|
||||||
|
|
||||||
let mut has_sized = FxHashSet::default();
|
let mut has_sized = FxHashSet::default();
|
||||||
let mut ty_to_bounds: FxHashMap<_, FxHashSet<_>> = Default::default();
|
let mut ty_to_bounds: FxHashMap<_, FxHashSet<_>> = Default::default();
|
||||||
let mut lifetime_to_bounds: FxHashMap<_, FxHashSet<_>> = Default::default();
|
let mut lifetime_to_bounds: FxHashMap<_, FxHashSet<_>> = Default::default();
|
||||||
|
|
|
@ -716,11 +716,11 @@ impl<'a, 'tcx> Clean<Generics> for (&'a ty::Generics, ty::GenericPredicates<'tcx
|
||||||
// Bounds in the type_params and lifetimes fields are repeated in the
|
// Bounds in the type_params and lifetimes fields are repeated in the
|
||||||
// predicates field (see rustc_typeck::collect::ty_generics), so remove
|
// predicates field (see rustc_typeck::collect::ty_generics), so remove
|
||||||
// them.
|
// them.
|
||||||
let stripped_typarams = gens
|
let stripped_params = gens
|
||||||
.params
|
.params
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|param| match param.kind {
|
.filter_map(|param| match param.kind {
|
||||||
ty::GenericParamDefKind::Lifetime => None,
|
ty::GenericParamDefKind::Lifetime => Some(param.clean(cx)),
|
||||||
ty::GenericParamDefKind::Type { synthetic, .. } => {
|
ty::GenericParamDefKind::Type { synthetic, .. } => {
|
||||||
if param.name == kw::SelfUpper {
|
if param.name == kw::SelfUpper {
|
||||||
assert_eq!(param.index, 0);
|
assert_eq!(param.index, 0);
|
||||||
|
@ -732,7 +732,7 @@ impl<'a, 'tcx> Clean<Generics> for (&'a ty::Generics, ty::GenericPredicates<'tcx
|
||||||
}
|
}
|
||||||
Some(param.clean(cx))
|
Some(param.clean(cx))
|
||||||
}
|
}
|
||||||
ty::GenericParamDefKind::Const { .. } => None,
|
ty::GenericParamDefKind::Const { .. } => Some(param.clean(cx)),
|
||||||
})
|
})
|
||||||
.collect::<Vec<GenericParamDef>>();
|
.collect::<Vec<GenericParamDef>>();
|
||||||
|
|
||||||
|
@ -844,8 +844,10 @@ impl<'a, 'tcx> Clean<Generics> for (&'a ty::Generics, ty::GenericPredicates<'tcx
|
||||||
|
|
||||||
// Run through the type parameters again and insert a ?Sized
|
// Run through the type parameters again and insert a ?Sized
|
||||||
// unbound for any we didn't find to be Sized.
|
// unbound for any we didn't find to be Sized.
|
||||||
for tp in &stripped_typarams {
|
for tp in &stripped_params {
|
||||||
if !sized_params.contains(&tp.name) {
|
if matches!(tp.kind, types::GenericParamDefKind::Type { .. })
|
||||||
|
&& !sized_params.contains(&tp.name)
|
||||||
|
{
|
||||||
where_predicates.push(WP::BoundPredicate {
|
where_predicates.push(WP::BoundPredicate {
|
||||||
ty: Type::Generic(tp.name.clone()),
|
ty: Type::Generic(tp.name.clone()),
|
||||||
bounds: vec![GenericBound::maybe_sized(cx)],
|
bounds: vec![GenericBound::maybe_sized(cx)],
|
||||||
|
@ -858,16 +860,7 @@ impl<'a, 'tcx> Clean<Generics> for (&'a ty::Generics, ty::GenericPredicates<'tcx
|
||||||
// and instead see `where T: Foo + Bar + Sized + 'a`
|
// and instead see `where T: Foo + Bar + Sized + 'a`
|
||||||
|
|
||||||
Generics {
|
Generics {
|
||||||
params: gens
|
params: stripped_params,
|
||||||
.params
|
|
||||||
.iter()
|
|
||||||
.flat_map(|param| match param.kind {
|
|
||||||
ty::GenericParamDefKind::Lifetime => Some(param.clean(cx)),
|
|
||||||
ty::GenericParamDefKind::Type { .. } => None,
|
|
||||||
ty::GenericParamDefKind::Const { .. } => Some(param.clean(cx)),
|
|
||||||
})
|
|
||||||
.chain(simplify::ty_params(stripped_typarams).into_iter())
|
|
||||||
.collect(),
|
|
||||||
where_predicates: simplify::where_clauses(cx, where_predicates),
|
where_predicates: simplify::where_clauses(cx, where_predicates),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
//! bounds by special casing scenarios such as these. Fun!
|
//! bounds by special casing scenarios such as these. Fun!
|
||||||
|
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use std::mem;
|
|
||||||
|
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_middle::ty;
|
use rustc_middle::ty;
|
||||||
|
@ -118,18 +117,6 @@ pub fn merge_bounds(
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ty_params(mut params: Vec<clean::GenericParamDef>) -> Vec<clean::GenericParamDef> {
|
|
||||||
for param in &mut params {
|
|
||||||
match param.kind {
|
|
||||||
clean::GenericParamDefKind::Type { ref mut bounds, .. } => {
|
|
||||||
*bounds = mem::take(bounds);
|
|
||||||
}
|
|
||||||
_ => panic!("expected only type parameters"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
params
|
|
||||||
}
|
|
||||||
|
|
||||||
fn trait_is_same_or_supertrait(cx: &DocContext<'_>, child: DefId, trait_: DefId) -> bool {
|
fn trait_is_same_or_supertrait(cx: &DocContext<'_>, child: DefId, trait_: DefId) -> bool {
|
||||||
if child == trait_ {
|
if child == trait_ {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -11,8 +11,8 @@ pub enum Order {
|
||||||
}
|
}
|
||||||
|
|
||||||
// @has foo/struct.VSet.html '//pre[@class="rust struct"]' 'pub struct VSet<T, const ORDER: Order>'
|
// @has foo/struct.VSet.html '//pre[@class="rust struct"]' 'pub struct VSet<T, const ORDER: Order>'
|
||||||
// @has foo/struct.VSet.html '//h3[@id="impl-Send"]/code' 'impl<const ORDER: Order, T> Send for VSet<T, ORDER>'
|
// @has foo/struct.VSet.html '//h3[@id="impl-Send"]/code' 'impl<T, const ORDER: Order> Send for VSet<T, ORDER>'
|
||||||
// @has foo/struct.VSet.html '//h3[@id="impl-Sync"]/code' 'impl<const ORDER: Order, T> Sync for VSet<T, ORDER>'
|
// @has foo/struct.VSet.html '//h3[@id="impl-Sync"]/code' 'impl<T, const ORDER: Order> Sync for VSet<T, ORDER>'
|
||||||
pub struct VSet<T, const ORDER: Order> {
|
pub struct VSet<T, const ORDER: Order> {
|
||||||
inner: Vec<T>,
|
inner: Vec<T>,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue