Auto merge of #64526 - Centril:rollup-k4cz2xn, r=Centril

Rollup of 4 pull requests

Successful merges:

 - #64357 (`AdtDef` is an algebraic data type, not abstract data type)
 - #64485 (update Miri)
 - #64509 (Make some adjustments to the documentation for `std::convert::identity`)
 - #64518 (Use while let slice_pattern instead of carrying an index around)

Failed merges:

r? @ghost
This commit is contained in:
bors 2019-09-16 21:22:54 +00:00
commit 7ac21e7636
13 changed files with 46 additions and 33 deletions

View File

@ -234,9 +234,9 @@ dependencies = [
[[package]] [[package]]
name = "byteorder" name = "byteorder"
version = "1.2.7" version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94f88df23a25417badc922ab0f5716cc1330e87f71ddd9203b3a3ccd9cedf75d" checksum = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
[[package]] [[package]]
name = "bytes" name = "bytes"
@ -2067,7 +2067,7 @@ dependencies = [
"hex", "hex",
"log", "log",
"num-traits", "num-traits",
"rand 0.6.1", "rand 0.7.0",
"rustc-workspace-hack", "rustc-workspace-hack",
"rustc_version", "rustc_version",
"shell-escape", "shell-escape",
@ -3255,7 +3255,6 @@ dependencies = [
name = "rustc-workspace-hack" name = "rustc-workspace-hack"
version = "1.0.0" version = "1.0.0"
dependencies = [ dependencies = [
"byteorder",
"crossbeam-utils 0.6.5", "crossbeam-utils 0.6.5",
"serde", "serde",
"serde_json", "serde_json",

View File

@ -42,11 +42,11 @@
use crate::fmt; use crate::fmt;
/// An identity function. /// The identity function.
/// ///
/// Two things are important to note about this function: /// Two things are important to note about this function:
/// ///
/// - It is not always equivalent to a closure like `|x| x` since the /// - It is not always equivalent to a closure like `|x| x`, since the
/// closure may coerce `x` into a different type. /// closure may coerce `x` into a different type.
/// ///
/// - It moves the input `x` passed to the function. /// - It moves the input `x` passed to the function.
@ -56,31 +56,32 @@ use crate::fmt;
/// ///
/// # Examples /// # Examples
/// ///
/// Using `identity` to do nothing among other interesting functions: /// Using `identity` to do nothing in a sequence of other, interesting,
/// functions:
/// ///
/// ```rust /// ```rust
/// use std::convert::identity; /// use std::convert::identity;
/// ///
/// fn manipulation(x: u32) -> u32 { /// fn manipulation(x: u32) -> u32 {
/// // Let's assume that this function does something interesting. /// // Let's pretend that adding one is an interesting function.
/// x + 1 /// x + 1
/// } /// }
/// ///
/// let _arr = &[identity, manipulation]; /// let _arr = &[identity, manipulation];
/// ``` /// ```
/// ///
/// Using `identity` to get a function that changes nothing in a conditional: /// Using `identity` as a "do nothing" base case in a conditional:
/// ///
/// ```rust /// ```rust
/// use std::convert::identity; /// use std::convert::identity;
/// ///
/// # let condition = true; /// # let condition = true;
/// /// #
/// # fn manipulation(x: u32) -> u32 { x + 1 } /// # fn manipulation(x: u32) -> u32 { x + 1 }
/// /// #
/// let do_stuff = if condition { manipulation } else { identity }; /// let do_stuff = if condition { manipulation } else { identity };
/// ///
/// // do more interesting stuff.. /// // Do more interesting stuff...
/// ///
/// let _results = do_stuff(42); /// let _results = do_stuff(42);
/// ``` /// ```

View File

@ -31,7 +31,7 @@ syntax = { path = "../libsyntax" }
syntax_pos = { path = "../libsyntax_pos" } syntax_pos = { path = "../libsyntax_pos" }
backtrace = "0.3.3" backtrace = "0.3.3"
parking_lot = "0.9" parking_lot = "0.9"
byteorder = { version = "1.1", features = ["i128"]} byteorder = { version = "1.3" }
chalk-engine = { version = "0.9.0", default-features=false } chalk-engine = { version = "0.9.0", default-features=false }
rustc_fs_util = { path = "../librustc_fs_util" } rustc_fs_util = { path = "../librustc_fs_util" }
smallvec = { version = "0.6.7", features = ["union", "may_dangle"] } smallvec = { version = "0.6.7", features = ["union", "may_dangle"] }

View File

@ -1938,9 +1938,15 @@ pub struct FieldDef {
pub vis: Visibility, pub vis: Visibility,
} }
/// The definition of an abstract data type -- a struct or enum. /// The definition of a user-defined type, e.g., a `struct`, `enum`, or `union`.
/// ///
/// These are all interned (by `intern_adt_def`) into the `adt_defs` table. /// These are all interned (by `intern_adt_def`) into the `adt_defs` table.
///
/// The initialism *"Adt"* stands for an [*algebraic data type (ADT)*][adt].
/// This is slightly wrong because `union`s are not ADTs.
/// Moreover, Rust only allows recursive data types through indirection.
///
/// [adt]: https://en.wikipedia.org/wiki/Algebraic_data_type
pub struct AdtDef { pub struct AdtDef {
/// `DefId` of the struct, enum or union item. /// `DefId` of the struct, enum or union item.
pub did: DefId, pub did: DefId,

View File

@ -24,6 +24,6 @@ rustc_lexer = { path = "../librustc_lexer" }
rustc_serialize = { path = "../libserialize", package = "serialize" } rustc_serialize = { path = "../libserialize", package = "serialize" }
syntax = { path = "../libsyntax" } syntax = { path = "../libsyntax" }
syntax_pos = { path = "../libsyntax_pos" } syntax_pos = { path = "../libsyntax_pos" }
byteorder = { version = "1.1", features = ["i128"] } byteorder = { version = "1.3" }
rustc_apfloat = { path = "../librustc_apfloat" } rustc_apfloat = { path = "../librustc_apfloat" }
smallvec = { version = "0.6.7", features = ["union", "may_dangle"] } smallvec = { version = "0.6.7", features = ["union", "may_dangle"] }

View File

@ -614,8 +614,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
projection, projection,
} = first_borrowed_place; } = first_borrowed_place;
for (i, elem) in projection.iter().enumerate().rev() { let mut cursor = &**projection;
let proj_base = &projection[..i]; while let [proj_base @ .., elem] = cursor {
cursor = proj_base;
match elem { match elem {
ProjectionElem::Field(field, _) if union_ty(base, proj_base).is_some() => { ProjectionElem::Field(field, _) if union_ty(base, proj_base).is_some() => {
@ -637,8 +638,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
projection, projection,
} = second_borrowed_place; } = second_borrowed_place;
for (i, elem) in projection.iter().enumerate().rev() { let mut cursor = &**projection;
let proj_base = &projection[..i]; while let [proj_base @ .., elem] = cursor {
cursor = proj_base;
if let ProjectionElem::Field(field, _) = elem { if let ProjectionElem::Field(field, _) = elem {
if let Some(union_ty) = union_ty(base, proj_base) { if let Some(union_ty) = union_ty(base, proj_base) {

View File

@ -1758,7 +1758,10 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
debug!("check_if_assigned_path_is_moved place: {:?}", place); debug!("check_if_assigned_path_is_moved place: {:?}", place);
// None case => assigning to `x` does not require `x` be initialized. // None case => assigning to `x` does not require `x` be initialized.
for (i, elem) in place.projection.iter().enumerate().rev() { let mut cursor = &*place.projection;
while let [proj_base @ .., elem] = cursor {
cursor = proj_base;
match elem { match elem {
ProjectionElem::Index(_/*operand*/) | ProjectionElem::Index(_/*operand*/) |
ProjectionElem::ConstantIndex { .. } | ProjectionElem::ConstantIndex { .. } |
@ -1771,8 +1774,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
// assigning to (*P) requires P to be initialized // assigning to (*P) requires P to be initialized
ProjectionElem::Deref => { ProjectionElem::Deref => {
let proj_base = &place.projection[..i];
self.check_if_full_path_is_moved( self.check_if_full_path_is_moved(
location, InitializationRequiringAction::Use, location, InitializationRequiringAction::Use,
(PlaceRef { (PlaceRef {
@ -1790,7 +1791,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
} }
ProjectionElem::Field(..) => { ProjectionElem::Field(..) => {
let proj_base = &place.projection[..i];
// if type of `P` has a dtor, then // if type of `P` has a dtor, then
// assigning to `P.f` requires `P` itself // assigning to `P.f` requires `P` itself
// be already initialized // be already initialized

View File

@ -2417,9 +2417,12 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
"add_reborrow_constraint({:?}, {:?}, {:?})", "add_reborrow_constraint({:?}, {:?}, {:?})",
location, borrow_region, borrowed_place location, borrow_region, borrowed_place
); );
for (i, elem) in borrowed_place.projection.iter().enumerate().rev() {
let mut cursor = &*borrowed_place.projection;
while let [proj_base @ .., elem] = cursor {
cursor = proj_base;
debug!("add_reborrow_constraint - iteration {:?}", elem); debug!("add_reborrow_constraint - iteration {:?}", elem);
let proj_base = &borrowed_place.projection[..i];
match elem { match elem {
ProjectionElem::Deref => { ProjectionElem::Deref => {

View File

@ -1296,8 +1296,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
// Insert a Shallow borrow of the prefixes of any fake borrows. // Insert a Shallow borrow of the prefixes of any fake borrows.
for place in fake_borrows for place in fake_borrows
{ {
for (i, elem) in place.projection.iter().enumerate().rev() { let mut cursor = &*place.projection;
let proj_base = &place.projection[..i]; while let [proj_base @ .., elem] = cursor {
cursor = proj_base;
if let ProjectionElem::Deref = elem { if let ProjectionElem::Deref = elem {
// Insert a shallow borrow after a deref. For other // Insert a shallow borrow after a deref. For other

View File

@ -407,8 +407,9 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> {
place: &Place<'tcx>, place: &Place<'tcx>,
is_mut_use: bool, is_mut_use: bool,
) { ) {
for (i, elem) in place.projection.iter().enumerate().rev() { let mut cursor = &*place.projection;
let proj_base = &place.projection[..i]; while let [proj_base @ .., elem] = cursor {
cursor = proj_base;
match elem { match elem {
ProjectionElem::Field(..) => { ProjectionElem::Field(..) => {

View File

@ -38,8 +38,9 @@ fn is_within_packed<'tcx, L>(tcx: TyCtxt<'tcx>, local_decls: &L, place: &Place<'
where where
L: HasLocalDecls<'tcx>, L: HasLocalDecls<'tcx>,
{ {
for (i, elem) in place.projection.iter().enumerate().rev() { let mut cursor = &*place.projection;
let proj_base = &place.projection[..i]; while let [proj_base @ .., elem] = cursor {
cursor = proj_base;
match elem { match elem {
// encountered a Deref, which is ABI-aligned // encountered a Deref, which is ABI-aligned

@ -1 +1 @@
Subproject commit dd94c7c5a32be2ee0adeeaf9d46f26f14925797c Subproject commit d88138723780d11ca2c09560111223dc20b9d5f3

View File

@ -62,7 +62,6 @@ crossbeam-utils = { version = "0.6.5", features = ["nightly"] }
serde = { version = "1.0.82", features = ['derive'] } serde = { version = "1.0.82", features = ['derive'] }
serde_json = { version = "1.0.31", features = ["raw_value"] } serde_json = { version = "1.0.31", features = ["raw_value"] }
smallvec = { version = "0.6", features = ['union', 'may_dangle'] } smallvec = { version = "0.6", features = ['union', 'may_dangle'] }
byteorder = { version = "1.2.7", features = ["i128"] }
[target.'cfg(not(windows))'.dependencies] [target.'cfg(not(windows))'.dependencies]