Auto merge of #43324 - Nashenas88:visit_locations, r=arielb1
Provide positional information when visiting ty, substs and closure_substs in MIR This will enable the region renumbering portion of #43234 (non-lexical lifetimes). @nikomatsakis's current plan [here](https://gist.github.com/nikomatsakis/dfc27b28cd024eb25054b52bb11082f2) shows that we need spans of the original code to create new region variables, e.g. `self.infcx.next_region_var(infer::MiscVariable(span))`. The current visitor impls did not pass positional information (`Location` in some, `Span` and `SourceInfo` for others) for all types. I did not expand this to all visits, just the ones necessary for the above-mentioned plan.
This commit is contained in:
commit
e2b5d7e6b3
@ -210,17 +210,20 @@ fn visit_source_info(&mut self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn visit_ty(&mut self,
|
fn visit_ty(&mut self,
|
||||||
ty: & $($mutability)* Ty<'tcx>) {
|
ty: & $($mutability)* Ty<'tcx>,
|
||||||
|
_: Lookup) {
|
||||||
self.super_ty(ty);
|
self.super_ty(ty);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_substs(&mut self,
|
fn visit_substs(&mut self,
|
||||||
substs: & $($mutability)* &'tcx Substs<'tcx>) {
|
substs: & $($mutability)* &'tcx Substs<'tcx>,
|
||||||
|
_: Location) {
|
||||||
self.super_substs(substs);
|
self.super_substs(substs);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_closure_substs(&mut self,
|
fn visit_closure_substs(&mut self,
|
||||||
substs: & $($mutability)* ClosureSubsts<'tcx>) {
|
substs: & $($mutability)* ClosureSubsts<'tcx>,
|
||||||
|
_: Location) {
|
||||||
self.super_closure_substs(substs);
|
self.super_closure_substs(substs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,7 +269,11 @@ fn super_mir(&mut self,
|
|||||||
self.visit_visibility_scope_data(scope);
|
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 {
|
for local_decl in &$($mutability)* mir.local_decls {
|
||||||
self.visit_local_decl(local_decl);
|
self.visit_local_decl(local_decl);
|
||||||
@ -385,7 +392,7 @@ fn super_terminator_kind(&mut self,
|
|||||||
ref values,
|
ref values,
|
||||||
ref targets } => {
|
ref targets } => {
|
||||||
self.visit_operand(discr, source_location);
|
self.visit_operand(discr, source_location);
|
||||||
self.visit_ty(switch_ty);
|
self.visit_ty(switch_ty, Lookup::Loc(source_location));
|
||||||
for value in &values[..] {
|
for value in &values[..] {
|
||||||
self.visit_const_int(value, source_location);
|
self.visit_const_int(value, source_location);
|
||||||
}
|
}
|
||||||
@ -489,7 +496,7 @@ fn super_rvalue(&mut self,
|
|||||||
ref $($mutability)* operand,
|
ref $($mutability)* operand,
|
||||||
ref $($mutability)* ty) => {
|
ref $($mutability)* ty) => {
|
||||||
self.visit_operand(operand, location);
|
self.visit_operand(operand, location);
|
||||||
self.visit_ty(ty);
|
self.visit_ty(ty, Lookup::Loc(location));
|
||||||
}
|
}
|
||||||
|
|
||||||
Rvalue::BinaryOp(_bin_op,
|
Rvalue::BinaryOp(_bin_op,
|
||||||
@ -511,7 +518,7 @@ fn super_rvalue(&mut self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Rvalue::NullaryOp(_op, ref $($mutability)* ty) => {
|
Rvalue::NullaryOp(_op, ref $($mutability)* ty) => {
|
||||||
self.visit_ty(ty);
|
self.visit_ty(ty, Lookup::Loc(location));
|
||||||
}
|
}
|
||||||
|
|
||||||
Rvalue::Aggregate(ref $($mutability)* kind,
|
Rvalue::Aggregate(ref $($mutability)* kind,
|
||||||
@ -519,7 +526,7 @@ fn super_rvalue(&mut self,
|
|||||||
let kind = &$($mutability)* **kind;
|
let kind = &$($mutability)* **kind;
|
||||||
match *kind {
|
match *kind {
|
||||||
AggregateKind::Array(ref $($mutability)* ty) => {
|
AggregateKind::Array(ref $($mutability)* ty) => {
|
||||||
self.visit_ty(ty);
|
self.visit_ty(ty, Lookup::Loc(location));
|
||||||
}
|
}
|
||||||
AggregateKind::Tuple => {
|
AggregateKind::Tuple => {
|
||||||
}
|
}
|
||||||
@ -527,12 +534,12 @@ fn super_rvalue(&mut self,
|
|||||||
_variant_index,
|
_variant_index,
|
||||||
ref $($mutability)* substs,
|
ref $($mutability)* substs,
|
||||||
_active_field_index) => {
|
_active_field_index) => {
|
||||||
self.visit_substs(substs);
|
self.visit_substs(substs, location);
|
||||||
}
|
}
|
||||||
AggregateKind::Closure(ref $($mutability)* def_id,
|
AggregateKind::Closure(ref $($mutability)* def_id,
|
||||||
ref $($mutability)* closure_substs) => {
|
ref $($mutability)* closure_substs) => {
|
||||||
self.visit_def_id(def_id, location);
|
self.visit_def_id(def_id, location);
|
||||||
self.visit_closure_substs(closure_substs);
|
self.visit_closure_substs(closure_substs, location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -581,7 +588,7 @@ fn super_static(&mut self,
|
|||||||
ref $($mutability)* ty,
|
ref $($mutability)* ty,
|
||||||
} = *static_;
|
} = *static_;
|
||||||
self.visit_def_id(def_id, location);
|
self.visit_def_id(def_id, location);
|
||||||
self.visit_ty(ty);
|
self.visit_ty(ty, Lookup::Loc(location));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn super_projection(&mut self,
|
fn super_projection(&mut self,
|
||||||
@ -611,7 +618,7 @@ fn super_projection_elem(&mut self,
|
|||||||
ProjectionElem::Subslice { from: _, to: _ } => {
|
ProjectionElem::Subslice { from: _, to: _ } => {
|
||||||
}
|
}
|
||||||
ProjectionElem::Field(_field, ref $($mutability)* ty) => {
|
ProjectionElem::Field(_field, ref $($mutability)* ty) => {
|
||||||
self.visit_ty(ty);
|
self.visit_ty(ty, Lookup::Loc(location));
|
||||||
}
|
}
|
||||||
ProjectionElem::Index(ref $($mutability)* operand) => {
|
ProjectionElem::Index(ref $($mutability)* operand) => {
|
||||||
self.visit_operand(operand, location);
|
self.visit_operand(operand, location);
|
||||||
@ -635,7 +642,7 @@ fn super_local_decl(&mut self,
|
|||||||
is_user_variable: _,
|
is_user_variable: _,
|
||||||
} = *local_decl;
|
} = *local_decl;
|
||||||
|
|
||||||
self.visit_ty(ty);
|
self.visit_ty(ty, Lookup::Src(*source_info));
|
||||||
self.visit_source_info(source_info);
|
self.visit_source_info(source_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -658,7 +665,7 @@ fn super_constant(&mut self,
|
|||||||
} = *constant;
|
} = *constant;
|
||||||
|
|
||||||
self.visit_span(span);
|
self.visit_span(span);
|
||||||
self.visit_ty(ty);
|
self.visit_ty(ty, Lookup::Loc(location));
|
||||||
self.visit_literal(literal, location);
|
self.visit_literal(literal, location);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -669,7 +676,7 @@ fn super_literal(&mut self,
|
|||||||
Literal::Item { ref $($mutability)* def_id,
|
Literal::Item { ref $($mutability)* def_id,
|
||||||
ref $($mutability)* substs } => {
|
ref $($mutability)* substs } => {
|
||||||
self.visit_def_id(def_id, location);
|
self.visit_def_id(def_id, location);
|
||||||
self.visit_substs(substs);
|
self.visit_substs(substs, location);
|
||||||
}
|
}
|
||||||
Literal::Value { ref $($mutability)* value } => {
|
Literal::Value { ref $($mutability)* value } => {
|
||||||
self.visit_const_val(value, location);
|
self.visit_const_val(value, location);
|
||||||
@ -734,6 +741,11 @@ fn visit_location(&mut self, mir: & $($mutability)* Mir<'tcx>, location: Locatio
|
|||||||
make_mir_visitor!(Visitor,);
|
make_mir_visitor!(Visitor,);
|
||||||
make_mir_visitor!(MutVisitor,mut);
|
make_mir_visitor!(MutVisitor,mut);
|
||||||
|
|
||||||
|
pub enum Lookup {
|
||||||
|
Loc(Location),
|
||||||
|
Src(SourceInfo),
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||||
pub enum LvalueContext<'tcx> {
|
pub enum LvalueContext<'tcx> {
|
||||||
// Appears as LHS of an assignment
|
// Appears as LHS of an assignment
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
use rustc::middle::region::CodeExtent;
|
use rustc::middle::region::CodeExtent;
|
||||||
use rustc::mir::*;
|
use rustc::mir::*;
|
||||||
use rustc::mir::transform::MirSource;
|
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::{self, Ty, TyCtxt};
|
||||||
use rustc::ty::subst::Substs;
|
use rustc::ty::subst::Substs;
|
||||||
use rustc::util::nodemap::NodeMap;
|
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> {
|
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) {
|
if let Some(lifted) = self.tcx.lift(ty) {
|
||||||
*ty = lifted;
|
*ty = lifted;
|
||||||
} else {
|
} else {
|
||||||
@ -153,7 +153,7 @@ fn visit_ty(&mut self, ty: &mut Ty<'tcx>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
if let Some(lifted) = self.tcx.lift(substs) {
|
||||||
*substs = lifted;
|
*substs = lifted;
|
||||||
} else {
|
} else {
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
use rustc::ty::subst::Substs;
|
use rustc::ty::subst::Substs;
|
||||||
use rustc::ty::{Ty, TyCtxt, ClosureSubsts};
|
use rustc::ty::{Ty, TyCtxt, ClosureSubsts};
|
||||||
use rustc::mir::*;
|
use rustc::mir::*;
|
||||||
use rustc::mir::visit::MutVisitor;
|
use rustc::mir::visit::{MutVisitor, Lookup};
|
||||||
use rustc::mir::transform::{MirPass, MirSource};
|
use rustc::mir::transform::{MirPass, MirSource};
|
||||||
|
|
||||||
struct EraseRegionsVisitor<'a, 'tcx: 'a> {
|
struct EraseRegionsVisitor<'a, 'tcx: 'a> {
|
||||||
@ -31,12 +31,12 @@ pub fn new(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> Self {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> MutVisitor<'tcx> for 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;
|
let old_ty = *ty;
|
||||||
*ty = self.tcx.erase_regions(&old_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});
|
*substs = self.tcx.erase_regions(&{*substs});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,7 +62,8 @@ fn visit_rvalue(&mut self, rvalue: &mut Rvalue<'tcx>, location: Location) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn visit_closure_substs(&mut self,
|
fn visit_closure_substs(&mut self,
|
||||||
substs: &mut ClosureSubsts<'tcx>) {
|
substs: &mut ClosureSubsts<'tcx>,
|
||||||
|
_: Location) {
|
||||||
*substs = self.tcx.erase_regions(substs);
|
*substs = self.tcx.erase_regions(substs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,7 +279,8 @@ fn visit_source_info(&mut self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn visit_closure_substs(&mut self,
|
fn visit_closure_substs(&mut self,
|
||||||
substs: &ClosureSubsts<'tcx>) {
|
substs: &ClosureSubsts<'tcx>,
|
||||||
|
_: Location) {
|
||||||
self.record("ClosureSubsts", substs);
|
self.record("ClosureSubsts", substs);
|
||||||
self.super_closure_substs(substs);
|
self.super_closure_substs(substs);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user