Simplify rustc_mir_dataflow::abs_domain. · rust-lang/rust@67df7cb (original) (raw)

`@@ -4,60 +4,34 @@

`

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

`}

`