Skip to content

Commit 0df64c5

Browse files
committed
Auto merge of #149032 - matthiaskrgr:rollup-28xhwxa, r=matthiaskrgr
Rollup of 5 pull requests Successful merges: - #145610 (Stabilize `char_max_len`) - #148504 (Fix link in c_longlong documentation) - #148698 (Fix query cycle when encounter unevaluated const) - #148865 (move GAT inference prevention hack) - #149016 (Document the `let this = self;` idiom used in MIR building) r? `@ghost` `@rustbot` modify labels: rollup
2 parents 42ebbd2 + 6b8f2c7 commit 0df64c5

File tree

30 files changed

+175
-89
lines changed

30 files changed

+175
-89
lines changed

compiler/rustc_mir_build/src/builder/block.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
3939
expr: Option<ExprId>,
4040
region_scope: Scope,
4141
) -> BlockAnd<()> {
42-
let this = self;
42+
let this = self; // See "LET_THIS_SELF".
4343

4444
// This convoluted structure is to avoid using recursion as we walk down a list
4545
// of statements. Basically, the structure we get back is something like:

compiler/rustc_mir_build/src/builder/expr/as_constant.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1919
/// Compile `expr`, yielding a compile-time constant. Assumes that
2020
/// `expr` is a valid compile-time constant!
2121
pub(crate) fn as_constant(&mut self, expr: &Expr<'tcx>) -> ConstOperand<'tcx> {
22-
let this = self;
22+
let this = self; // See "LET_THIS_SELF".
2323
let tcx = this.tcx;
2424
let Expr { ty, temp_scope_id: _, span, ref kind } = *expr;
2525
match kind {

compiler/rustc_mir_build/src/builder/expr/as_operand.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
119119
local_info: LocalInfo<'tcx>,
120120
needs_temporary: NeedsTemporary,
121121
) -> BlockAnd<Operand<'tcx>> {
122-
let this = self;
122+
let this = self; // See "LET_THIS_SELF".
123123

124124
let expr = &this.thir[expr_id];
125125
if let ExprKind::Scope { region_scope, lint_level, value } = expr.kind {
@@ -161,7 +161,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
161161
scope: TempLifetime,
162162
expr_id: ExprId,
163163
) -> BlockAnd<Operand<'tcx>> {
164-
let this = self;
164+
let this = self; // See "LET_THIS_SELF".
165165
let expr = &this.thir[expr_id];
166166
debug!("as_call_operand(block={:?}, expr={:?})", block, expr);
167167

compiler/rustc_mir_build/src/builder/expr/as_place.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
423423
let expr = &self.thir[expr_id];
424424
debug!("expr_as_place(block={:?}, expr={:?}, mutability={:?})", block, expr, mutability);
425425

426-
let this = self;
426+
let this = self; // See "LET_THIS_SELF".
427427
let expr_span = expr.span;
428428
let source_info = this.source_info(expr_span);
429429
match expr.kind {

compiler/rustc_mir_build/src/builder/expr/as_rvalue.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
4747
scope: TempLifetime,
4848
expr_id: ExprId,
4949
) -> BlockAnd<Rvalue<'tcx>> {
50-
let this = self;
50+
let this = self; // See "LET_THIS_SELF".
5151
let expr = &this.thir[expr_id];
5252
debug!("expr_as_rvalue(block={:?}, scope={:?}, expr={:?})", block, scope, expr);
5353

@@ -676,7 +676,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
676676
scope: TempLifetime,
677677
outer_source_info: SourceInfo,
678678
) -> BlockAnd<Rvalue<'tcx>> {
679-
let this = self;
679+
let this = self; // See "LET_THIS_SELF".
680680
let value_expr = &this.thir[value];
681681
let elem_ty = value_expr.ty;
682682
if this.check_constness(&value_expr.kind) {
@@ -716,7 +716,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
716716
mut block: BasicBlock,
717717
arg: ExprId,
718718
) -> BlockAnd<Operand<'tcx>> {
719-
let this = self;
719+
let this = self; // See "LET_THIS_SELF".
720720

721721
let source_info = this.source_info(upvar_span);
722722
let temp = this.local_decls.push(LocalDecl::new(upvar_ty, upvar_span));

compiler/rustc_mir_build/src/builder/expr/as_temp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
3434
expr_id: ExprId,
3535
mutability: Mutability,
3636
) -> BlockAnd<Local> {
37-
let this = self;
37+
let this = self; // See "LET_THIS_SELF".
3838

3939
let expr = &this.thir[expr_id];
4040
let expr_span = expr.span;

compiler/rustc_mir_build/src/builder/expr/into.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
3232
// since we frequently have to reference `self` from within a
3333
// closure, where `self` would be shadowed, it's easier to
3434
// just use the name `this` uniformly
35-
let this = self;
35+
let this = self; // See "LET_THIS_SELF".
3636
let expr = &this.thir[expr_id];
3737
let expr_span = expr.span;
3838
let source_info = this.source_info(expr_span);

compiler/rustc_mir_build/src/builder/expr/stmt.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1818
expr_id: ExprId,
1919
statement_scope: Option<region::Scope>,
2020
) -> BlockAnd<()> {
21-
let this = self;
21+
let this = self; // See "LET_THIS_SELF".
2222
let expr = &this.thir[expr_id];
2323
let expr_span = expr.span;
2424
let source_info = this.source_info(expr.span);

compiler/rustc_mir_build/src/builder/matches/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
109109
expr_id: ExprId, // Condition expression to lower
110110
args: ThenElseArgs,
111111
) -> BlockAnd<()> {
112-
let this = self;
112+
let this = self; // See "LET_THIS_SELF".
113113
let expr = &this.thir[expr_id];
114114
let expr_span = expr.span;
115115

compiler/rustc_mir_build/src/builder/mod.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,23 @@
22
//! "Go to file" feature to silently ignore all files in the module, probably
33
//! because it assumes that "build" is a build-output directory.
44
//! See <https://github.com/rust-lang/rust/pull/134365>.
5+
//!
6+
//! ## The `let this = self;` idiom (LET_THIS_SELF)
7+
//!
8+
//! Throughout MIR building there are several places where a `Builder` method
9+
//! needs to borrow `self`, and then re-expose it to a closure as `|this|`.
10+
//!
11+
//! In complex builder methods, potentially with multiple levels of nesting, it
12+
//! would thus become necessary to mentally keep track of whether the builder
13+
//! is `self` (at the top level) or `this` (nested in a closure), or to replace
14+
//! one with the other when moving code in or out of a closure.
15+
//!
16+
//! (The borrow checker will prevent incorrect usage, but having to go back and
17+
//! satisfy the borrow checker still creates contributor friction.)
18+
//!
19+
//! To reduce that friction, some builder methods therefore start with
20+
//! `let this = self;` or similar, allowing subsequent code to uniformly refer
21+
//! to the builder as `this` (and never `self`), even when not nested.
522
623
use itertools::Itertools;
724
use rustc_abi::{ExternAbi, FieldIdx};

0 commit comments

Comments
 (0)