]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_mir_build/src/build/expr/category.rs
New upstream version 1.54.0+dfsg1
[rustc.git] / compiler / rustc_mir_build / src / build / expr / category.rs
CommitLineData
17df50a5 1use rustc_middle::thir::*;
e9174d1e
SL
2
3#[derive(Debug, PartialEq)]
dfeec247 4crate 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 22crate 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.
33impl 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}