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::iter::{FromIterator, FusedIterator, TrustedLen};
|
||||
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::{self, Index, IndexMut, RangeBounds};
|
||||
use core::ptr::{self, NonNull};
|
||||
|
@ -1523,6 +1523,47 @@ impl<T> Vec<T> {
|
|||
{
|
||||
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> {
|
||||
|
|
|
@ -336,8 +336,8 @@ impl<T> MaybeUninit<T> {
|
|||
/// assert_eq!(x, (0, false));
|
||||
/// ```
|
||||
///
|
||||
/// *Incorrect* usage of this function: initializing a struct with zero, where some fields
|
||||
/// cannot hold 0 as a valid value.
|
||||
/// *Incorrect* usage of this function: calling `x.zeroed().assume_init()`
|
||||
/// when `0` is not a valid bit-pattern for the type:
|
||||
///
|
||||
/// ```rust,no_run
|
||||
/// 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
|
||||
# use std::pin::Pin;
|
||||
|
@ -33,7 +33,7 @@ fn foo() {
|
|||
|
||||
[`await`] is used to suspend the current computation until the given
|
||||
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
|
||||
# use std::pin::Pin;
|
||||
|
|
|
@ -637,7 +637,7 @@ impl EmbargoVisitor<'tcx> {
|
|||
&mut self,
|
||||
segments: &[hir::PathSegment<'_>],
|
||||
) {
|
||||
if let Some([module, segment]) = segments.rchunks_exact(2).next() {
|
||||
if let [.., module, segment] = segments {
|
||||
if let Some(item) = module
|
||||
.res
|
||||
.and_then(|res| res.mod_def_id())
|
||||
|
|
|
@ -480,6 +480,11 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> {
|
|||
.clean(self.cx)
|
||||
.params;
|
||||
|
||||
debug!(
|
||||
"param_env_to_generics({:?}): generic_params={:?}",
|
||||
param_env_def_id, generic_params
|
||||
);
|
||||
|
||||
let mut has_sized = FxHashSet::default();
|
||||
let mut ty_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
|
||||
// predicates field (see rustc_typeck::collect::ty_generics), so remove
|
||||
// them.
|
||||
let stripped_typarams = gens
|
||||
let stripped_params = gens
|
||||
.params
|
||||
.iter()
|
||||
.filter_map(|param| match param.kind {
|
||||
ty::GenericParamDefKind::Lifetime => None,
|
||||
ty::GenericParamDefKind::Lifetime => Some(param.clean(cx)),
|
||||
ty::GenericParamDefKind::Type { synthetic, .. } => {
|
||||
if param.name == kw::SelfUpper {
|
||||
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))
|
||||
}
|
||||
ty::GenericParamDefKind::Const { .. } => None,
|
||||
ty::GenericParamDefKind::Const { .. } => Some(param.clean(cx)),
|
||||
})
|
||||
.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
|
||||
// unbound for any we didn't find to be Sized.
|
||||
for tp in &stripped_typarams {
|
||||
if !sized_params.contains(&tp.name) {
|
||||
for tp in &stripped_params {
|
||||
if matches!(tp.kind, types::GenericParamDefKind::Type { .. })
|
||||
&& !sized_params.contains(&tp.name)
|
||||
{
|
||||
where_predicates.push(WP::BoundPredicate {
|
||||
ty: Type::Generic(tp.name.clone()),
|
||||
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`
|
||||
|
||||
Generics {
|
||||
params: gens
|
||||
.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(),
|
||||
params: stripped_params,
|
||||
where_predicates: simplify::where_clauses(cx, where_predicates),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
//! bounds by special casing scenarios such as these. Fun!
|
||||
|
||||
use std::collections::BTreeMap;
|
||||
use std::mem;
|
||||
|
||||
use rustc_hir::def_id::DefId;
|
||||
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 {
|
||||
if child == trait_ {
|
||||
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 '//h3[@id="impl-Send"]/code' 'impl<const ORDER: Order, T> 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-Send"]/code' 'impl<T, const ORDER: Order> Send 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> {
|
||||
inner: Vec<T>,
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue