Auto merge of #109849 - scottmcm:more-fieldidx-rebase, r=oli-obk
Use `FieldIdx` in various things related to aggregates Shrank `AggregateKind` by 8 bytes on x64, since the active field of a union is tracked as an `Option<FieldIdx>` instead of `Option<usize>`. Part 3/? of https://github.com/rust-lang/compiler-team/issues/606 [`IndexSlice`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_index/vec/struct.IndexVec.html#deref-methods-IndexSlice%3CI,+T%3E) was added in https://github.com/rust-lang/rust/pull/109787
This commit is contained in:
commit
a93bcdc307
13 changed files with 51 additions and 46 deletions
|
@ -185,7 +185,7 @@ impl<'tcx, 'body> ParseCtxt<'tcx, 'body> {
|
|||
},
|
||||
ExprKind::Adt(box AdtExpr{ adt_def, variant_index, substs, fields, .. }) => {
|
||||
let is_union = adt_def.is_union();
|
||||
let active_field_index = is_union.then(|| fields[0].name.index());
|
||||
let active_field_index = is_union.then(|| fields[0].name);
|
||||
|
||||
Ok(Rvalue::Aggregate(
|
||||
Box::new(AggregateKind::Adt(adt_def.did(), *variant_index, substs, None, active_field_index)),
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
//! See docs in `build/expr/mod.rs`.
|
||||
|
||||
use rustc_index::vec::Idx;
|
||||
use rustc_index::vec::{Idx, IndexVec};
|
||||
use rustc_middle::ty::util::IntTypeExt;
|
||||
use rustc_target::abi::{Abi, Primitive};
|
||||
use rustc_target::abi::{Abi, FieldIdx, Primitive};
|
||||
|
||||
use crate::build::expr::as_place::PlaceBase;
|
||||
use crate::build::expr::category::{Category, RvalueFunc};
|
||||
|
@ -17,7 +17,6 @@ use rustc_middle::thir::*;
|
|||
use rustc_middle::ty::cast::{mir_cast_kind, CastTy};
|
||||
use rustc_middle::ty::{self, Ty, UpvarSubsts};
|
||||
use rustc_span::Span;
|
||||
use rustc_target::abi::FieldIdx;
|
||||
|
||||
impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||
/// Returns an rvalue suitable for use until the end of the current
|
||||
|
@ -327,7 +326,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
|
||||
// first process the set of fields
|
||||
let el_ty = expr.ty.sequence_element_type(this.tcx);
|
||||
let fields: Vec<_> = fields
|
||||
let fields: IndexVec<FieldIdx, _> = fields
|
||||
.into_iter()
|
||||
.copied()
|
||||
.map(|f| {
|
||||
|
@ -348,7 +347,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
ExprKind::Tuple { ref fields } => {
|
||||
// see (*) above
|
||||
// first process the set of fields
|
||||
let fields: Vec<_> = fields
|
||||
let fields: IndexVec<FieldIdx, _> = fields
|
||||
.into_iter()
|
||||
.copied()
|
||||
.map(|f| {
|
||||
|
@ -402,7 +401,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
}
|
||||
|
||||
// see (*) above
|
||||
let operands: Vec<_> = upvars
|
||||
let operands: IndexVec<FieldIdx, _> = upvars
|
||||
.into_iter()
|
||||
.copied()
|
||||
.map(|upvar| {
|
||||
|
@ -710,7 +709,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
}
|
||||
this.record_operands_moved(&[value_operand]);
|
||||
}
|
||||
block.and(Rvalue::Aggregate(Box::new(AggregateKind::Array(elem_ty)), Vec::new()))
|
||||
block.and(Rvalue::Aggregate(Box::new(AggregateKind::Array(elem_ty)), IndexVec::new()))
|
||||
}
|
||||
|
||||
fn limit_capture_mutability(
|
||||
|
|
|
@ -6,11 +6,9 @@ use rustc_ast::InlineAsmOptions;
|
|||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
use rustc_hir as hir;
|
||||
use rustc_index::vec::Idx;
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::thir::*;
|
||||
use rustc_middle::ty::CanonicalUserTypeAnnotation;
|
||||
use rustc_target::abi::FieldIdx;
|
||||
use std::iter;
|
||||
|
||||
impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||
|
@ -320,7 +318,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
// See the notes for `ExprKind::Array` in `as_rvalue` and for
|
||||
// `ExprKind::Borrow` above.
|
||||
let is_union = adt_def.is_union();
|
||||
let active_field_index = is_union.then(|| fields[0].name.index());
|
||||
let active_field_index = is_union.then(|| fields[0].name);
|
||||
|
||||
let scope = this.local_scope();
|
||||
|
||||
|
@ -344,10 +342,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
})
|
||||
.collect();
|
||||
|
||||
let field_names: Vec<_> =
|
||||
(0..adt_def.variant(variant_index).fields.len()).map(FieldIdx::new).collect();
|
||||
let field_names = adt_def.variant(variant_index).fields.indices();
|
||||
|
||||
let fields: Vec<_> = if let Some(FruInfo { base, field_types }) = base {
|
||||
let fields = if let Some(FruInfo { base, field_types }) = base {
|
||||
let place_builder =
|
||||
unpack!(block = this.as_place_builder(block, &this.thir[*base]));
|
||||
|
||||
|
@ -364,7 +361,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
})
|
||||
.collect()
|
||||
} else {
|
||||
field_names.iter().filter_map(|n| fields_map.get(n).cloned()).collect()
|
||||
field_names.filter_map(|n| fields_map.get(&n).cloned()).collect()
|
||||
};
|
||||
|
||||
let inferred_ty = expr.ty;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue