| 
4 | 4 | //! field-deref on a local variable, `x.field`, has the same meaning  | 
5 | 5 | //! in both domains). Indexed projections are the exception: `a[x]`  | 
6 | 6 | //! needs to be treated as mapping to the same move path as `a[y]` as  | 
7 |  | -//! well as `a[13]`, etc.  | 
 | 7 | +//! well as `a[13]`, etc. So we map these `x`/`y` values to `()`.  | 
8 | 8 | //!  | 
9 | 9 | //! (In theory, the analysis could be extended to work with sets of  | 
10 | 10 | //! paths, so that `a[0]` and `a[13]` could be kept distinct, while  | 
11 | 11 | //! `a[x]` would still overlap them both. But that is not this  | 
12 | 12 | //! representation does today.)  | 
13 | 13 | 
  | 
14 |  | -use rustc_middle::mir::{Local, Operand, PlaceElem, ProjectionElem};  | 
15 |  | -use rustc_middle::ty::Ty;  | 
16 |  | - | 
17 |  | -#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]  | 
18 |  | -pub(crate) struct AbstractOperand;  | 
19 |  | -#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]  | 
20 |  | -pub(crate) struct AbstractType;  | 
21 |  | -pub(crate) type AbstractElem = ProjectionElem<AbstractOperand, AbstractType>;  | 
 | 14 | +use rustc_middle::mir::{PlaceElem, ProjectionElem, ProjectionKind};  | 
22 | 15 | 
 
  | 
23 | 16 | pub(crate) trait Lift {  | 
24 |  | -    type Abstract;  | 
25 |  | -    fn lift(&self) -> Self::Abstract;  | 
26 |  | -}  | 
27 |  | -impl<'tcx> Lift for Operand<'tcx> {  | 
28 |  | -    type Abstract = AbstractOperand;  | 
29 |  | -    fn lift(&self) -> Self::Abstract {  | 
30 |  | -        AbstractOperand  | 
31 |  | -    }  | 
32 |  | -}  | 
33 |  | -impl Lift for Local {  | 
34 |  | -    type Abstract = AbstractOperand;  | 
35 |  | -    fn lift(&self) -> Self::Abstract {  | 
36 |  | -        AbstractOperand  | 
37 |  | -    }  | 
38 |  | -}  | 
39 |  | -impl<'tcx> Lift for Ty<'tcx> {  | 
40 |  | -    type Abstract = AbstractType;  | 
41 |  | -    fn lift(&self) -> Self::Abstract {  | 
42 |  | -        AbstractType  | 
43 |  | -    }  | 
 | 17 | +    fn lift(&self) -> ProjectionKind;  | 
44 | 18 | }  | 
 | 19 | + | 
45 | 20 | impl<'tcx> Lift for PlaceElem<'tcx> {  | 
46 |  | -    type Abstract = AbstractElem;  | 
47 |  | -    fn lift(&self) -> Self::Abstract {  | 
 | 21 | +    fn lift(&self) -> ProjectionKind {  | 
48 | 22 |         match *self {  | 
49 | 23 |             ProjectionElem::Deref => ProjectionElem::Deref,  | 
50 |  | -            ProjectionElem::Field(f, ty) => ProjectionElem::Field(f, ty.lift()),  | 
51 |  | -            ProjectionElem::OpaqueCast(ty) => ProjectionElem::OpaqueCast(ty.lift()),  | 
52 |  | -            ProjectionElem::Index(ref i) => ProjectionElem::Index(i.lift()),  | 
 | 24 | +            ProjectionElem::Field(f, _ty) => ProjectionElem::Field(f, ()),  | 
 | 25 | +            ProjectionElem::OpaqueCast(_ty) => ProjectionElem::OpaqueCast(()),  | 
 | 26 | +            ProjectionElem::Index(_i) => ProjectionElem::Index(()),  | 
53 | 27 |             ProjectionElem::Subslice { from, to, from_end } => {  | 
54 | 28 |                 ProjectionElem::Subslice { from, to, from_end }  | 
55 | 29 |             }  | 
56 | 30 |             ProjectionElem::ConstantIndex { offset, min_length, from_end } => {  | 
57 | 31 |                 ProjectionElem::ConstantIndex { offset, min_length, from_end }  | 
58 | 32 |             }  | 
59 | 33 |             ProjectionElem::Downcast(a, u) => ProjectionElem::Downcast(a, u),  | 
60 |  | -            ProjectionElem::Subtype(ty) => ProjectionElem::Subtype(ty.lift()),  | 
 | 34 | +            ProjectionElem::Subtype(_ty) => ProjectionElem::Subtype(()),  | 
61 | 35 |         }  | 
62 | 36 |     }  | 
63 | 37 | }  | 
0 commit comments