@@ -15,7 +15,7 @@ use rustc::hir::def_id::{DefId};
1515use rustc:: infer:: { InferCtxt } ;
1616use rustc:: ty:: { self , TyCtxt , ParamEnv } ;
1717use 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 } ;
1919use rustc:: mir:: { Mir , Mutability , Operand , Projection , ProjectionElem , Rvalue } ;
2020use rustc:: mir:: { Statement , StatementKind , Terminator , TerminatorKind } ;
2121use 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