diff --git a/src/librustc/mir/visit.rs b/src/librustc/mir/visit.rs index ac1c0306f701c..fd3a9f8cd2d9a 100644 --- a/src/librustc/mir/visit.rs +++ b/src/librustc/mir/visit.rs @@ -210,17 +210,20 @@ macro_rules! make_mir_visitor { } fn visit_ty(&mut self, - ty: & $($mutability)* Ty<'tcx>) { + ty: & $($mutability)* Ty<'tcx>, + _: Lookup) { self.super_ty(ty); } fn visit_substs(&mut self, - substs: & $($mutability)* &'tcx Substs<'tcx>) { + substs: & $($mutability)* &'tcx Substs<'tcx>, + _: Location) { self.super_substs(substs); } fn visit_closure_substs(&mut self, - substs: & $($mutability)* ClosureSubsts<'tcx>) { + substs: & $($mutability)* ClosureSubsts<'tcx>, + _: Location) { self.super_closure_substs(substs); } @@ -266,7 +269,11 @@ macro_rules! make_mir_visitor { self.visit_visibility_scope_data(scope); } - self.visit_ty(&$($mutability)* mir.return_ty); + let lookup = Lookup::Src(SourceInfo { + span: mir.span, + scope: ARGUMENT_VISIBILITY_SCOPE, + }); + self.visit_ty(&$($mutability)* mir.return_ty, lookup); for local_decl in &$($mutability)* mir.local_decls { self.visit_local_decl(local_decl); @@ -385,7 +392,7 @@ macro_rules! make_mir_visitor { ref values, ref targets } => { self.visit_operand(discr, source_location); - self.visit_ty(switch_ty); + self.visit_ty(switch_ty, Lookup::Loc(source_location)); for value in &values[..] { self.visit_const_int(value, source_location); } @@ -489,7 +496,7 @@ macro_rules! make_mir_visitor { ref $($mutability)* operand, ref $($mutability)* ty) => { self.visit_operand(operand, location); - self.visit_ty(ty); + self.visit_ty(ty, Lookup::Loc(location)); } Rvalue::BinaryOp(_bin_op, @@ -511,7 +518,7 @@ macro_rules! make_mir_visitor { } Rvalue::NullaryOp(_op, ref $($mutability)* ty) => { - self.visit_ty(ty); + self.visit_ty(ty, Lookup::Loc(location)); } Rvalue::Aggregate(ref $($mutability)* kind, @@ -519,7 +526,7 @@ macro_rules! make_mir_visitor { let kind = &$($mutability)* **kind; match *kind { AggregateKind::Array(ref $($mutability)* ty) => { - self.visit_ty(ty); + self.visit_ty(ty, Lookup::Loc(location)); } AggregateKind::Tuple => { } @@ -527,12 +534,12 @@ macro_rules! make_mir_visitor { _variant_index, ref $($mutability)* substs, _active_field_index) => { - self.visit_substs(substs); + self.visit_substs(substs, location); } AggregateKind::Closure(ref $($mutability)* def_id, ref $($mutability)* closure_substs) => { self.visit_def_id(def_id, location); - self.visit_closure_substs(closure_substs); + self.visit_closure_substs(closure_substs, location); } } @@ -581,7 +588,7 @@ macro_rules! make_mir_visitor { ref $($mutability)* ty, } = *static_; self.visit_def_id(def_id, location); - self.visit_ty(ty); + self.visit_ty(ty, Lookup::Loc(location)); } fn super_projection(&mut self, @@ -611,7 +618,7 @@ macro_rules! make_mir_visitor { ProjectionElem::Subslice { from: _, to: _ } => { } ProjectionElem::Field(_field, ref $($mutability)* ty) => { - self.visit_ty(ty); + self.visit_ty(ty, Lookup::Loc(location)); } ProjectionElem::Index(ref $($mutability)* operand) => { self.visit_operand(operand, location); @@ -635,7 +642,7 @@ macro_rules! make_mir_visitor { is_user_variable: _, } = *local_decl; - self.visit_ty(ty); + self.visit_ty(ty, Lookup::Src(*source_info)); self.visit_source_info(source_info); } @@ -658,7 +665,7 @@ macro_rules! make_mir_visitor { } = *constant; self.visit_span(span); - self.visit_ty(ty); + self.visit_ty(ty, Lookup::Loc(location)); self.visit_literal(literal, location); } @@ -669,7 +676,7 @@ macro_rules! make_mir_visitor { Literal::Item { ref $($mutability)* def_id, ref $($mutability)* substs } => { self.visit_def_id(def_id, location); - self.visit_substs(substs); + self.visit_substs(substs, location); } Literal::Value { ref $($mutability)* value } => { self.visit_const_val(value, location); @@ -734,6 +741,11 @@ macro_rules! make_mir_visitor { make_mir_visitor!(Visitor,); make_mir_visitor!(MutVisitor,mut); +pub enum Lookup { + Loc(Location), + Src(SourceInfo), +} + #[derive(Copy, Clone, Debug, PartialEq, Eq)] pub enum LvalueContext<'tcx> { // Appears as LHS of an assignment diff --git a/src/librustc_mir/build/mod.rs b/src/librustc_mir/build/mod.rs index eb1414d42e179..74101abd5d76d 100644 --- a/src/librustc_mir/build/mod.rs +++ b/src/librustc_mir/build/mod.rs @@ -17,7 +17,7 @@ use rustc::hir::def_id::DefId; use rustc::middle::region::CodeExtent; use rustc::mir::*; use rustc::mir::transform::MirSource; -use rustc::mir::visit::MutVisitor; +use rustc::mir::visit::{MutVisitor, Lookup}; use rustc::ty::{self, Ty, TyCtxt}; use rustc::ty::subst::Substs; use rustc::util::nodemap::NodeMap; @@ -143,7 +143,7 @@ struct GlobalizeMir<'a, 'gcx: 'a> { } impl<'a, 'gcx: 'tcx, 'tcx> MutVisitor<'tcx> for GlobalizeMir<'a, 'gcx> { - fn visit_ty(&mut self, ty: &mut Ty<'tcx>) { + fn visit_ty(&mut self, ty: &mut Ty<'tcx>, _: Lookup) { if let Some(lifted) = self.tcx.lift(ty) { *ty = lifted; } else { @@ -153,7 +153,7 @@ impl<'a, 'gcx: 'tcx, 'tcx> MutVisitor<'tcx> for GlobalizeMir<'a, 'gcx> { } } - fn visit_substs(&mut self, substs: &mut &'tcx Substs<'tcx>) { + fn visit_substs(&mut self, substs: &mut &'tcx Substs<'tcx>, _: Location) { if let Some(lifted) = self.tcx.lift(substs) { *substs = lifted; } else { diff --git a/src/librustc_mir/transform/erase_regions.rs b/src/librustc_mir/transform/erase_regions.rs index eb283df869f12..da9032685e03b 100644 --- a/src/librustc_mir/transform/erase_regions.rs +++ b/src/librustc_mir/transform/erase_regions.rs @@ -15,7 +15,7 @@ use rustc::ty::subst::Substs; use rustc::ty::{Ty, TyCtxt, ClosureSubsts}; use rustc::mir::*; -use rustc::mir::visit::MutVisitor; +use rustc::mir::visit::{MutVisitor, Lookup}; use rustc::mir::transform::{MirPass, MirSource}; struct EraseRegionsVisitor<'a, 'tcx: 'a> { @@ -31,12 +31,12 @@ impl<'a, 'tcx> EraseRegionsVisitor<'a, 'tcx> { } impl<'a, 'tcx> MutVisitor<'tcx> for EraseRegionsVisitor<'a, 'tcx> { - fn visit_ty(&mut self, ty: &mut Ty<'tcx>) { + fn visit_ty(&mut self, ty: &mut Ty<'tcx>, _: Lookup) { let old_ty = *ty; *ty = self.tcx.erase_regions(&old_ty); } - fn visit_substs(&mut self, substs: &mut &'tcx Substs<'tcx>) { + fn visit_substs(&mut self, substs: &mut &'tcx Substs<'tcx>, _: Location) { *substs = self.tcx.erase_regions(&{*substs}); } @@ -62,7 +62,8 @@ impl<'a, 'tcx> MutVisitor<'tcx> for EraseRegionsVisitor<'a, 'tcx> { } fn visit_closure_substs(&mut self, - substs: &mut ClosureSubsts<'tcx>) { + substs: &mut ClosureSubsts<'tcx>, + _: Location) { *substs = self.tcx.erase_regions(substs); } diff --git a/src/librustc_passes/mir_stats.rs b/src/librustc_passes/mir_stats.rs index 4dd38cc515c77..9895802700ef7 100644 --- a/src/librustc_passes/mir_stats.rs +++ b/src/librustc_passes/mir_stats.rs @@ -279,7 +279,8 @@ impl<'a, 'tcx> mir_visit::Visitor<'tcx> for StatCollector<'a, 'tcx> { } fn visit_closure_substs(&mut self, - substs: &ClosureSubsts<'tcx>) { + substs: &ClosureSubsts<'tcx>, + _: Location) { self.record("ClosureSubsts", substs); self.super_closure_substs(substs); }