Skip to content

Commit 2285e35

Browse files
committed
mir-borrowck: Use Field instead of usize for field index in user description functions
1 parent e5d291a commit 2285e35

File tree

1 file changed

+18
-19
lines changed

1 file changed

+18
-19
lines changed

src/librustc_mir/borrow_check.rs

+18-19
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use rustc::hir::def_id::{DefId};
1515
use rustc::infer::{InferCtxt};
1616
use rustc::ty::{self, TyCtxt, ParamEnv};
1717
use rustc::ty::maps::Providers;
18-
use rustc::mir::{AssertMessage, BasicBlock, BorrowKind, Location, Lvalue, Local};
18+
use rustc::mir::{AssertMessage, BasicBlock, BorrowKind, Field, Location, Lvalue, Local};
1919
use rustc::mir::{Mir, Mutability, Operand, Projection, ProjectionElem, Rvalue};
2020
use rustc::mir::{Statement, StatementKind, Terminator, TerminatorKind};
2121
use transform::nll;
@@ -1611,7 +1611,7 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
16111611
let is_projection_from_ty_closure = proj.base.ty(self.mir, self.tcx)
16121612
.to_ty(self.tcx).is_closure();
16131613

1614-
let field_name = self.describe_field(&proj.base, field.index());
1614+
let field_name = self.describe_field(&proj.base, field);
16151615
if is_projection_from_ty_closure {
16161616
buf.push_str(&format!("{}", field_name));
16171617
} else {
@@ -1650,66 +1650,65 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
16501650
}
16511651
}
16521652

1653-
// FIXME Instead of passing usize, Field should be passed
1654-
// End-user visible description of the `field_index`nth field of `base`
1655-
fn describe_field(&self, base: &Lvalue, field_index: usize) -> String {
1653+
// End-user visible description of the `field`nth field of `base`
1654+
fn describe_field(&self, base: &Lvalue, field: Field) -> String {
16561655
match *base {
16571656
Lvalue::Local(local) => {
16581657
let local = &self.mir.local_decls[local];
1659-
self.describe_field_from_ty(&local.ty, field_index)
1658+
self.describe_field_from_ty(&local.ty, field)
16601659
},
16611660
Lvalue::Static(ref static_) => {
1662-
self.describe_field_from_ty(&static_.ty, field_index)
1661+
self.describe_field_from_ty(&static_.ty, field)
16631662
},
16641663
Lvalue::Projection(ref proj) => {
16651664
match proj.elem {
16661665
ProjectionElem::Deref =>
1667-
self.describe_field(&proj.base, field_index),
1666+
self.describe_field(&proj.base, field),
16681667
ProjectionElem::Downcast(def, variant_index) =>
1669-
format!("{}", def.variants[variant_index].fields[field_index].name),
1668+
format!("{}", def.variants[variant_index].fields[field.index()].name),
16701669
ProjectionElem::Field(_, field_type) =>
1671-
self.describe_field_from_ty(&field_type, field_index),
1670+
self.describe_field_from_ty(&field_type, field),
16721671
ProjectionElem::Index(..)
16731672
| ProjectionElem::ConstantIndex { .. }
16741673
| ProjectionElem::Subslice { .. } =>
1675-
format!("{}", self.describe_field(&proj.base, field_index)),
1674+
format!("{}", self.describe_field(&proj.base, field)),
16761675
}
16771676
}
16781677
}
16791678
}
16801679

16811680
// End-user visible description of the `field_index`nth field of `ty`
1682-
fn describe_field_from_ty(&self, ty: &ty::Ty, field_index: usize) -> String {
1681+
fn describe_field_from_ty(&self, ty: &ty::Ty, field: Field) -> String {
16831682
if ty.is_box() {
16841683
// If the type is a box, the field is described from the boxed type
1685-
self.describe_field_from_ty(&ty.boxed_ty(), field_index)
1684+
self.describe_field_from_ty(&ty.boxed_ty(), field)
16861685
}
16871686
else {
16881687
match ty.sty {
16891688
ty::TyAdt(def, _) => {
16901689
if def.is_enum() {
1691-
format!("{}", field_index)
1690+
format!("{}", field.index())
16921691
}
16931692
else {
1694-
format!("{}", def.struct_variant().fields[field_index].name)
1693+
format!("{}", def.struct_variant().fields[field.index()].name)
16951694
}
16961695
},
16971696
ty::TyTuple(_, _) => {
1698-
format!("{}", field_index)
1697+
format!("{}", field.index())
16991698
},
17001699
ty::TyRef(_, tnm) | ty::TyRawPtr(tnm) => {
1701-
self.describe_field_from_ty(&tnm.ty, field_index)
1700+
self.describe_field_from_ty(&tnm.ty, field)
17021701
},
17031702
ty::TyArray(ty, _) | ty::TySlice(ty) => {
1704-
self.describe_field_from_ty(&ty, field_index)
1703+
self.describe_field_from_ty(&ty, field)
17051704
},
17061705
ty::TyClosure(closure_def_id, _) => {
17071706
// Convert the def-id into a node-id. node-ids are only valid for
17081707
// the local code in the current crate, so this returns an `Option` in case
17091708
// the closure comes from another crate. But in that case we wouldn't
17101709
// be borrowck'ing it, so we can just unwrap:
17111710
let node_id = self.tcx.hir.as_local_node_id(closure_def_id).unwrap();
1712-
let freevar = self.tcx.with_freevars(node_id, |fv| fv[field_index]);
1711+
let freevar = self.tcx.with_freevars(node_id, |fv| fv[field.index()]);
17131712

17141713
self.tcx.hir.name(freevar.var_id()).to_string()
17151714
}

0 commit comments

Comments
 (0)