diff options
| author | bors <bors@rust-lang.org> | 2016-08-11 05:04:41 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-08-11 05:04:41 -0700 |
| commit | 42001edc998f3406ecc04afa48bf07ce91247b67 (patch) | |
| tree | 7c29d830bfa0ccd66f2577ef52be3a46aacab5de /src/librustc_borrowck | |
| parent | 695b3d8279e17689b988e000203ba95ffeb4a91c (diff) | |
| parent | f37bf6d367c8fb0a69f72ff49b24ad2da67ddbe5 (diff) | |
| download | rust-42001edc998f3406ecc04afa48bf07ce91247b67.tar.gz rust-42001edc998f3406ecc04afa48bf07ce91247b67.zip | |
Auto merge of #35403 - scottcarr:lvalue_refactor, r=nikomatsakis
refactor lvalue_ty to be method of lvalue Currently `Mir` (and `MirContext`) implement a method `lvalue_ty` (and actually many more `foo_ty`). But this should be a method of `Lvalue`. If you have an `lvalue` and you want to get its type, the natural thing to write is: ``` lvalue.ty() ``` Of course it needs context, but still: ``` lvalue.ty(mir, tcx) ``` Makes more sense than ``` mir.lvalue_ty(lvalue, tcx) ``` I actually think we should go a step farther and have traits so we could get the type of some value generically, but that's up for debate. The thing I'm running into a lot in the compiler is I have a value of type `Foo` and I know that there is some related type `Bar` which I can get through some combination of method calls, but it's often not as direct as I would imagine. Unless you already know the code, its not clear why you would look in `Mir` for a method to get the type of an `Lvalue`.
Diffstat (limited to 'src/librustc_borrowck')
| -rw-r--r-- | src/librustc_borrowck/borrowck/mir/elaborate_drops.rs | 8 | ||||
| -rw-r--r-- | src/librustc_borrowck/borrowck/mir/mod.rs | 4 |
2 files changed, 6 insertions, 6 deletions
diff --git a/src/librustc_borrowck/borrowck/mir/elaborate_drops.rs b/src/librustc_borrowck/borrowck/mir/elaborate_drops.rs index 623ea60c5a6..f6e9484eda1 100644 --- a/src/librustc_borrowck/borrowck/mir/elaborate_drops.rs +++ b/src/librustc_borrowck/borrowck/mir/elaborate_drops.rs @@ -185,7 +185,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { { match self.move_data().move_paths[path].content { MovePathContent::Lvalue(ref lvalue) => { - let ty = self.mir.lvalue_ty(self.tcx, lvalue).to_ty(self.tcx); + let ty = lvalue.ty(self.mir, self.tcx).to_ty(self.tcx); debug!("path_needs_drop({:?}, {:?} : {:?})", path, lvalue, ty); self.tcx.type_needs_drop_given_env(ty, self.param_env()) @@ -555,7 +555,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { let mut fields = fields; fields.retain(|&(ref lvalue, _)| { - let ty = self.mir.lvalue_ty(self.tcx, lvalue).to_ty(self.tcx); + let ty = lvalue.ty(self.mir, self.tcx).to_ty(self.tcx); self.tcx.type_needs_drop_given_env(ty, self.param_env()) }); @@ -706,7 +706,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { /// This creates a "drop ladder" that drops the needed fields of the /// ADT, both in the success case or if one of the destructors fail. fn open_drop<'a>(&mut self, c: &DropCtxt<'a, 'tcx>) -> BasicBlock { - let ty = self.mir.lvalue_ty(self.tcx, c.lvalue).to_ty(self.tcx); + let ty = c.lvalue.ty(self.mir, self.tcx).to_ty(self.tcx); match ty.sty { ty::TyStruct(def, substs) | ty::TyEnum(def, substs) => { self.open_drop_for_adt(c, def, substs) @@ -892,7 +892,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { // dataflow can create unneeded children in some cases // - be sure to ignore them. - let ty = self.mir.lvalue_ty(self.tcx, c.lvalue).to_ty(self.tcx); + let ty = c.lvalue.ty(self.mir, self.tcx).to_ty(self.tcx); match ty.sty { ty::TyStruct(def, _) | ty::TyEnum(def, _) => { diff --git a/src/librustc_borrowck/borrowck/mir/mod.rs b/src/librustc_borrowck/borrowck/mir/mod.rs index 7481b15685e..7c912e8bac6 100644 --- a/src/librustc_borrowck/borrowck/mir/mod.rs +++ b/src/librustc_borrowck/borrowck/mir/mod.rs @@ -256,7 +256,7 @@ fn move_path_children_matching<'tcx, F>(move_paths: &MovePathData<'tcx>, fn lvalue_contents_drop_state_cannot_differ<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, mir: &Mir<'tcx>, lv: &repr::Lvalue<'tcx>) -> bool { - let ty = mir.lvalue_ty(tcx, lv).to_ty(tcx); + let ty = lv.ty(mir, tcx).to_ty(tcx); match ty.sty { ty::TyArray(..) | ty::TySlice(..) | ty::TyRef(..) | ty::TyRawPtr(..) => { debug!("lvalue_contents_drop_state_cannot_differ lv: {:?} ty: {:?} refd => false", @@ -355,7 +355,7 @@ fn drop_flag_effects_for_location<'a, 'tcx, F>( // don't move out of non-Copy things if let MovePathContent::Lvalue(ref lvalue) = move_data.move_paths[path].content { - let ty = mir.lvalue_ty(tcx, lvalue).to_ty(tcx); + let ty = lvalue.ty(mir, tcx).to_ty(tcx); if !ty.moves_by_default(tcx, param_env, DUMMY_SP) { continue; } |
