]>
Commit | Line | Data |
---|---|---|
17df50a5 | 1 | use rustc_middle::thir::*; |
e9174d1e SL |
2 | |
3 | #[derive(Debug, PartialEq)] | |
dfeec247 | 4 | crate enum Category { |
e9174d1e SL |
5 | // An assignable memory location like `x`, `x.f`, `foo()[3]`, that |
6 | // sort of thing. Something that could appear on the LHS of an `=` | |
7 | // sign. | |
ff7c6d11 | 8 | Place, |
e9174d1e SL |
9 | |
10 | // A literal like `23` or `"foo"`. Does not include constant | |
11 | // expressions like `3 + 5`. | |
12 | Constant, | |
13 | ||
14 | // Something that generates a new value at runtime, like `x + y` | |
15 | // or `foo()`. | |
16 | Rvalue(RvalueFunc), | |
17 | } | |
18 | ||
19 | // Rvalues fall into different "styles" that will determine which fn | |
20 | // is best suited to generate them. | |
21 | #[derive(Debug, PartialEq)] | |
dfeec247 | 22 | crate enum RvalueFunc { |
e9174d1e SL |
23 | // Best generated by `into`. This is generally exprs that |
24 | // cause branching, like `match`, but also includes calls. | |
25 | Into, | |
26 | ||
27 | // Best generated by `as_rvalue`. This is usually the case. | |
28 | AsRvalue, | |
29 | } | |
30 | ||
31 | /// Determines the category for a given expression. Note that scope | |
32 | /// and paren expressions have no category. | |
33 | impl Category { | |
17df50a5 | 34 | crate fn of(ek: &ExprKind<'_>) -> Option<Category> { |
e9174d1e | 35 | match *ek { |
b039eaaf | 36 | ExprKind::Scope { .. } => None, |
e9174d1e | 37 | |
b7449926 XL |
38 | ExprKind::Field { .. } |
39 | | ExprKind::Deref { .. } | |
40 | | ExprKind::Index { .. } | |
fc512014 | 41 | | ExprKind::UpvarRef { .. } |
b7449926 | 42 | | ExprKind::VarRef { .. } |
0bf4aa26 XL |
43 | | ExprKind::PlaceTypeAscription { .. } |
44 | | ExprKind::ValueTypeAscription { .. } => Some(Category::Place), | |
e9174d1e | 45 | |
b7449926 | 46 | ExprKind::LogicalOp { .. } |
b7449926 | 47 | | ExprKind::Match { .. } |
5869c6ff | 48 | | ExprKind::If { .. } |
b7449926 | 49 | | ExprKind::NeverToAny { .. } |
48663c56 | 50 | | ExprKind::Use { .. } |
60c5eb7d XL |
51 | | ExprKind::Adt { .. } |
52 | | ExprKind::Borrow { .. } | |
dfeec247 | 53 | | ExprKind::AddressOf { .. } |
74b04a01 | 54 | | ExprKind::Yield { .. } |
f9f354fc XL |
55 | | ExprKind::Call { .. } |
56 | | ExprKind::InlineAsm { .. } => Some(Category::Rvalue(RvalueFunc::Into)), | |
e9174d1e | 57 | |
b7449926 XL |
58 | ExprKind::Array { .. } |
59 | | ExprKind::Tuple { .. } | |
b7449926 XL |
60 | | ExprKind::Closure { .. } |
61 | | ExprKind::Unary { .. } | |
62 | | ExprKind::Binary { .. } | |
63 | | ExprKind::Box { .. } | |
64 | | ExprKind::Cast { .. } | |
48663c56 | 65 | | ExprKind::Pointer { .. } |
b7449926 | 66 | | ExprKind::Repeat { .. } |
b7449926 XL |
67 | | ExprKind::Assign { .. } |
68 | | ExprKind::AssignOp { .. } | |
f9f354fc | 69 | | ExprKind::ThreadLocalRef(_) |
ba9703b0 | 70 | | ExprKind::LlvmInlineAsm { .. } => Some(Category::Rvalue(RvalueFunc::AsRvalue)), |
e9174d1e | 71 | |
29967ef6 XL |
72 | ExprKind::ConstBlock { .. } | ExprKind::Literal { .. } | ExprKind::StaticRef { .. } => { |
73 | Some(Category::Constant) | |
74 | } | |
e9174d1e | 75 | |
b7449926 XL |
76 | ExprKind::Loop { .. } |
77 | | ExprKind::Block { .. } | |
78 | | ExprKind::Break { .. } | |
79 | | ExprKind::Continue { .. } | |
80 | | ExprKind::Return { .. } => | |
81 | // FIXME(#27840) these probably want their own | |
82 | // category, like "nonterminating" | |
83 | { | |
84 | Some(Category::Rvalue(RvalueFunc::Into)) | |
85 | } | |
e9174d1e SL |
86 | } |
87 | } | |
88 | } |