提交 d58cb934 编写于 作者: M Mazdak Farrokhzad

Rename hir::ExprKind::Use to ::DropTemps and improve docs.

上级 862a8784
...@@ -369,7 +369,7 @@ fn expr(&mut self, expr: &hir::Expr, pred: CFGIndex) -> CFGIndex { ...@@ -369,7 +369,7 @@ fn expr(&mut self, expr: &hir::Expr, pred: CFGIndex) -> CFGIndex {
hir::ExprKind::AddrOf(_, ref e) | hir::ExprKind::AddrOf(_, ref e) |
hir::ExprKind::Cast(ref e, _) | hir::ExprKind::Cast(ref e, _) |
hir::ExprKind::Type(ref e, _) | hir::ExprKind::Type(ref e, _) |
hir::ExprKind::Use(ref e) | hir::ExprKind::DropTemps(ref e) |
hir::ExprKind::Unary(_, ref e) | hir::ExprKind::Unary(_, ref e) |
hir::ExprKind::Field(ref e, _) | hir::ExprKind::Field(ref e, _) |
hir::ExprKind::Yield(ref e) | hir::ExprKind::Yield(ref e) |
......
...@@ -1029,7 +1029,7 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) { ...@@ -1029,7 +1029,7 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) {
visitor.visit_expr(subexpression); visitor.visit_expr(subexpression);
visitor.visit_ty(typ) visitor.visit_ty(typ)
} }
ExprKind::Use(ref subexpression) => { ExprKind::DropTemps(ref subexpression) => {
visitor.visit_expr(subexpression); visitor.visit_expr(subexpression);
} }
ExprKind::If(ref head_expression, ref if_block, ref optional_else) => { ExprKind::If(ref head_expression, ref if_block, ref optional_else) => {
......
...@@ -4671,7 +4671,7 @@ fn lower_expr(&mut self, e: &Expr) -> hir::Expr { ...@@ -4671,7 +4671,7 @@ fn lower_expr(&mut self, e: &Expr) -> hir::Expr {
// The construct was introduced in #21984. // The construct was introduced in #21984.
// FIXME(60253): Is this still necessary? // FIXME(60253): Is this still necessary?
// Also, add the attributes to the outer returned expr node. // Also, add the attributes to the outer returned expr node.
return self.expr_use(head_sp, match_expr, e.attrs.clone()) return self.expr_drop_temps(head_sp, match_expr, e.attrs.clone())
} }
// Desugar `ExprKind::Try` // Desugar `ExprKind::Try`
...@@ -5030,15 +5030,19 @@ fn expr_std_path( ...@@ -5030,15 +5030,19 @@ fn expr_std_path(
) )
} }
/// Wrap the given `expr` in `hir::ExprKind::Use`. /// Wrap the given `expr` in a terminating scope using `hir::ExprKind::DropTemps`.
/// ///
/// In terms of drop order, it has the same effect as /// In terms of drop order, it has the same effect as wrapping `expr` in
/// wrapping `expr` in `{ let _t = $expr; _t }` but /// `{ let _t = $expr; _t }` but should provide better compile-time performance.
/// should provide better compile-time performance.
/// ///
/// The drop order can be important in e.g. `if expr { .. }`. /// The drop order can be important in e.g. `if expr { .. }`.
fn expr_use(&mut self, span: Span, expr: P<hir::Expr>, attrs: ThinVec<Attribute>) -> hir::Expr { fn expr_drop_temps(
self.expr(span, hir::ExprKind::Use(expr), attrs) &mut self,
span: Span,
expr: P<hir::Expr>,
attrs: ThinVec<Attribute>
) -> hir::Expr {
self.expr(span, hir::ExprKind::DropTemps(expr), attrs)
} }
fn expr_match( fn expr_match(
......
...@@ -1366,7 +1366,7 @@ pub fn precedence(&self) -> ExprPrecedence { ...@@ -1366,7 +1366,7 @@ pub fn precedence(&self) -> ExprPrecedence {
ExprKind::Unary(..) => ExprPrecedence::Unary, ExprKind::Unary(..) => ExprPrecedence::Unary,
ExprKind::Lit(_) => ExprPrecedence::Lit, ExprKind::Lit(_) => ExprPrecedence::Lit,
ExprKind::Type(..) | ExprKind::Cast(..) => ExprPrecedence::Cast, ExprKind::Type(..) | ExprKind::Cast(..) => ExprPrecedence::Cast,
ExprKind::Use(ref expr, ..) => expr.precedence(), ExprKind::DropTemps(ref expr, ..) => expr.precedence(),
ExprKind::If(..) => ExprPrecedence::If, ExprKind::If(..) => ExprPrecedence::If,
ExprKind::While(..) => ExprPrecedence::While, ExprKind::While(..) => ExprPrecedence::While,
ExprKind::Loop(..) => ExprPrecedence::Loop, ExprKind::Loop(..) => ExprPrecedence::Loop,
...@@ -1438,7 +1438,7 @@ pub fn is_place_expr(&self) -> bool { ...@@ -1438,7 +1438,7 @@ pub fn is_place_expr(&self) -> bool {
ExprKind::Binary(..) | ExprKind::Binary(..) |
ExprKind::Yield(..) | ExprKind::Yield(..) |
ExprKind::Cast(..) | ExprKind::Cast(..) |
ExprKind::Use(..) | ExprKind::DropTemps(..) |
ExprKind::Err => { ExprKind::Err => {
false false
} }
...@@ -1488,10 +1488,12 @@ pub enum ExprKind { ...@@ -1488,10 +1488,12 @@ pub enum ExprKind {
Cast(P<Expr>, P<Ty>), Cast(P<Expr>, P<Ty>),
/// A type reference (e.g., `Foo`). /// A type reference (e.g., `Foo`).
Type(P<Expr>, P<Ty>), Type(P<Expr>, P<Ty>),
/// Semantically equivalent to `{ let _t = expr; _t }`. /// Wraps the expression in a terminating scope.
/// Maps directly to `hair::ExprKind::Use`. /// This makes it semantically equivalent to `{ let _t = expr; _t }`.
/// Only exists to tweak the drop order in HIR. ///
Use(P<Expr>), /// This construct only exists to tweak the drop order in HIR lowering.
/// An example of that is the desugaring of `for` loops.
DropTemps(P<Expr>),
/// An `if` block, with an optional else block. /// An `if` block, with an optional else block.
/// ///
/// I.e., `if <expr> { <expr> } else { <expr> }`. /// I.e., `if <expr> { <expr> } else { <expr> }`.
......
...@@ -1388,7 +1388,7 @@ pub fn print_expr(&mut self, expr: &hir::Expr) -> io::Result<()> { ...@@ -1388,7 +1388,7 @@ pub fn print_expr(&mut self, expr: &hir::Expr) -> io::Result<()> {
self.word_space(":")?; self.word_space(":")?;
self.print_type(&ty)?; self.print_type(&ty)?;
} }
hir::ExprKind::Use(ref init) => { hir::ExprKind::DropTemps(ref init) => {
// Print `{`: // Print `{`:
self.cbox(indent_unit)?; self.cbox(indent_unit)?;
self.ibox(0)?; self.ibox(0)?;
......
...@@ -520,7 +520,7 @@ pub fn walk_expr(&mut self, expr: &hir::Expr) { ...@@ -520,7 +520,7 @@ pub fn walk_expr(&mut self, expr: &hir::Expr) {
self.consume_expr(&base); self.consume_expr(&base);
} }
hir::ExprKind::Use(ref expr) => { hir::ExprKind::DropTemps(ref expr) => {
self.consume_expr(&expr); self.consume_expr(&expr);
} }
......
...@@ -521,7 +521,7 @@ fn visit_expr<'a, 'tcx>(ir: &mut IrMaps<'a, 'tcx>, expr: &'tcx Expr) { ...@@ -521,7 +521,7 @@ fn visit_expr<'a, 'tcx>(ir: &mut IrMaps<'a, 'tcx>, expr: &'tcx Expr) {
hir::ExprKind::Binary(..) | hir::ExprKind::Binary(..) |
hir::ExprKind::AddrOf(..) | hir::ExprKind::AddrOf(..) |
hir::ExprKind::Cast(..) | hir::ExprKind::Cast(..) |
hir::ExprKind::Use(..) | hir::ExprKind::DropTemps(..) |
hir::ExprKind::Unary(..) | hir::ExprKind::Unary(..) |
hir::ExprKind::Break(..) | hir::ExprKind::Break(..) |
hir::ExprKind::Continue(_) | hir::ExprKind::Continue(_) |
...@@ -1222,7 +1222,7 @@ fn propagate_through_expr(&mut self, expr: &Expr, succ: LiveNode) ...@@ -1222,7 +1222,7 @@ fn propagate_through_expr(&mut self, expr: &Expr, succ: LiveNode)
hir::ExprKind::AddrOf(_, ref e) | hir::ExprKind::AddrOf(_, ref e) |
hir::ExprKind::Cast(ref e, _) | hir::ExprKind::Cast(ref e, _) |
hir::ExprKind::Type(ref e, _) | hir::ExprKind::Type(ref e, _) |
hir::ExprKind::Use(ref e) | hir::ExprKind::DropTemps(ref e) |
hir::ExprKind::Unary(_, ref e) | hir::ExprKind::Unary(_, ref e) |
hir::ExprKind::Yield(ref e) | hir::ExprKind::Yield(ref e) |
hir::ExprKind::Repeat(ref e, _) => { hir::ExprKind::Repeat(ref e, _) => {
...@@ -1526,7 +1526,7 @@ fn check_expr<'a, 'tcx>(this: &mut Liveness<'a, 'tcx>, expr: &'tcx Expr) { ...@@ -1526,7 +1526,7 @@ fn check_expr<'a, 'tcx>(this: &mut Liveness<'a, 'tcx>, expr: &'tcx Expr) {
hir::ExprKind::Match(..) | hir::ExprKind::While(..) | hir::ExprKind::Loop(..) | hir::ExprKind::Match(..) | hir::ExprKind::While(..) | hir::ExprKind::Loop(..) |
hir::ExprKind::Index(..) | hir::ExprKind::Field(..) | hir::ExprKind::Index(..) | hir::ExprKind::Field(..) |
hir::ExprKind::Array(..) | hir::ExprKind::Tup(..) | hir::ExprKind::Binary(..) | hir::ExprKind::Array(..) | hir::ExprKind::Tup(..) | hir::ExprKind::Binary(..) |
hir::ExprKind::Cast(..) | hir::ExprKind::Use(..) | hir::ExprKind::Unary(..) | hir::ExprKind::Cast(..) | hir::ExprKind::DropTemps(..) | hir::ExprKind::Unary(..) |
hir::ExprKind::Ret(..) | hir::ExprKind::Break(..) | hir::ExprKind::Continue(..) | hir::ExprKind::Ret(..) | hir::ExprKind::Break(..) | hir::ExprKind::Continue(..) |
hir::ExprKind::Lit(_) | hir::ExprKind::Block(..) | hir::ExprKind::AddrOf(..) | hir::ExprKind::Lit(_) | hir::ExprKind::Block(..) | hir::ExprKind::AddrOf(..) |
hir::ExprKind::Struct(..) | hir::ExprKind::Repeat(..) | hir::ExprKind::Struct(..) | hir::ExprKind::Repeat(..) |
......
...@@ -677,7 +677,7 @@ pub fn cat_expr_unadjusted(&self, expr: &hir::Expr) -> McResult<cmt_<'tcx>> { ...@@ -677,7 +677,7 @@ pub fn cat_expr_unadjusted(&self, expr: &hir::Expr) -> McResult<cmt_<'tcx>> {
hir::ExprKind::Assign(..) | hir::ExprKind::AssignOp(..) | hir::ExprKind::Assign(..) | hir::ExprKind::AssignOp(..) |
hir::ExprKind::Closure(..) | hir::ExprKind::Ret(..) | hir::ExprKind::Closure(..) | hir::ExprKind::Ret(..) |
hir::ExprKind::Unary(..) | hir::ExprKind::Yield(..) | hir::ExprKind::Unary(..) | hir::ExprKind::Yield(..) |
hir::ExprKind::MethodCall(..) | hir::ExprKind::Cast(..) | hir::ExprKind::Use(..) | hir::ExprKind::MethodCall(..) | hir::ExprKind::Cast(..) | hir::ExprKind::DropTemps(..) |
hir::ExprKind::Array(..) | hir::ExprKind::Tup(..) | hir::ExprKind::If(..) | hir::ExprKind::Array(..) | hir::ExprKind::Tup(..) | hir::ExprKind::If(..) |
hir::ExprKind::Binary(..) | hir::ExprKind::While(..) | hir::ExprKind::Binary(..) | hir::ExprKind::While(..) |
hir::ExprKind::Block(..) | hir::ExprKind::Loop(..) | hir::ExprKind::Match(..) | hir::ExprKind::Block(..) | hir::ExprKind::Loop(..) | hir::ExprKind::Match(..) |
......
...@@ -908,8 +908,8 @@ fn resolve_expr<'a, 'tcx>(visitor: &mut RegionResolutionVisitor<'a, 'tcx>, expr: ...@@ -908,8 +908,8 @@ fn resolve_expr<'a, 'tcx>(visitor: &mut RegionResolutionVisitor<'a, 'tcx>, expr:
visitor.cx.var_parent = visitor.cx.parent; visitor.cx.var_parent = visitor.cx.parent;
} }
hir::ExprKind::Use(ref expr) => { hir::ExprKind::DropTemps(ref expr) => {
// `Use(expr)` does not denote a conditional scope. // `DropTemps(expr)` does not denote a conditional scope.
// Rather, we want to achieve the same behavior as `{ let _t = expr; _t }`. // Rather, we want to achieve the same behavior as `{ let _t = expr; _t }`.
terminating(expr.hir_id.local_id); terminating(expr.hir_id.local_id);
} }
......
...@@ -759,7 +759,7 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>, ...@@ -759,7 +759,7 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
} }
} }
} }
hir::ExprKind::Use(ref source) => { hir::ExprKind::DropTemps(ref source) => {
ExprKind::Use { source: source.to_ref() } ExprKind::Use { source: source.to_ref() }
} }
hir::ExprKind::Box(ref value) => { hir::ExprKind::Box(ref value) => {
......
...@@ -437,7 +437,7 @@ fn check_expr_kind<'a, 'tcx>( ...@@ -437,7 +437,7 @@ fn check_expr_kind<'a, 'tcx>(
hir::ExprKind::AddrOf(_, ref expr) | hir::ExprKind::AddrOf(_, ref expr) |
hir::ExprKind::Repeat(ref expr, _) | hir::ExprKind::Repeat(ref expr, _) |
hir::ExprKind::Type(ref expr, _) | hir::ExprKind::Type(ref expr, _) |
hir::ExprKind::Use(ref expr) => { hir::ExprKind::DropTemps(ref expr) => {
v.check_expr(&expr) v.check_expr(&expr)
} }
......
...@@ -4538,7 +4538,7 @@ fn check_expr_kind( ...@@ -4538,7 +4538,7 @@ fn check_expr_kind(
self.check_expr_eq_type(&e, ty); self.check_expr_eq_type(&e, ty);
ty ty
} }
ExprKind::Use(ref e) => { ExprKind::DropTemps(ref e) => {
self.check_expr_with_expectation(e, expected) self.check_expr_with_expectation(e, expected)
} }
ExprKind::Array(ref args) => { ExprKind::Array(ref args) => {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册