diff options
| author | bors <bors@rust-lang.org> | 2021-09-11 07:11:01 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-09-11 07:11:01 +0000 |
| commit | 4e880f8cbc191374ce7db335962489f41d6d4e3e (patch) | |
| tree | f25dad5a8356801beab8d2628bc9d6f613625976 /compiler/rustc_ast_lowering/src/expr.rs | |
| parent | 22719efcc570b043f2e519d6025e5f36eab38fe2 (diff) | |
| parent | 543e601a9d5e0efbb3fff803a0427efcceb0fef1 (diff) | |
| download | rust-4e880f8cbc191374ce7db335962489f41d6d4e3e.tar.gz rust-4e880f8cbc191374ce7db335962489f41d6d4e3e.zip | |
Auto merge of #88214 - notriddle:notriddle/for-loop-span-drop-temps-mut, r=nagisa
rustc: use more correct span data in for loop desugaring
Fixes #82462
Before:
help: consider adding semicolon after the expression so its temporaries are dropped sooner, before the local variables declared by the block are dropped
|
LL | for x in DroppingSlice(&*v).iter(); {
| +
After:
help: consider adding semicolon after the expression so its temporaries are dropped sooner, before the local variables declared by the block are dropped
|
LL | };
| +
This seems like a reasonable fix: since the desugared "expr_drop_temps_mut" contains the entire desugared loop construct, its span should contain the entire loop construct as well.
Diffstat (limited to 'compiler/rustc_ast_lowering/src/expr.rs')
| -rw-r--r-- | compiler/rustc_ast_lowering/src/expr.rs | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/compiler/rustc_ast_lowering/src/expr.rs b/compiler/rustc_ast_lowering/src/expr.rs index 16cd7a0bcdd..26b1052e0de 100644 --- a/compiler/rustc_ast_lowering/src/expr.rs +++ b/compiler/rustc_ast_lowering/src/expr.rs @@ -1450,8 +1450,13 @@ impl<'hir> LoweringContext<'_, 'hir> { ) }; + // #82462: to correctly diagnose borrow errors, the block that contains + // the iter expr needs to have a span that covers the loop body. + let desugared_full_span = + self.mark_span_with_reason(DesugaringKind::ForLoop(ForLoopLoc::Head), e.span, None); + let match_expr = self.arena.alloc(self.expr_match( - desugared_span, + desugared_full_span, into_iter_expr, arena_vec![self; iter_arm], hir::MatchSource::ForLoopDesugar, @@ -1465,7 +1470,7 @@ impl<'hir> LoweringContext<'_, 'hir> { // surrounding scope of the `match` since the `match` is not a terminating scope. // // Also, add the attributes to the outer returned expr node. - self.expr_drop_temps_mut(desugared_span, match_expr, attrs.into()) + self.expr_drop_temps_mut(desugared_full_span, match_expr, attrs.into()) } /// Desugar `ExprKind::Try` from: `<expr>?` into: |
