Skip to content

Commit

Permalink
stabilize if_let_rescope
Browse files Browse the repository at this point in the history
  • Loading branch information
dingxiangfei2009 committed Oct 20, 2024
1 parent de977a5 commit 8daa523
Show file tree
Hide file tree
Showing 21 changed files with 59 additions and 81 deletions.
2 changes: 2 additions & 0 deletions compiler/rustc_feature/src/accepted.rs
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,8 @@ declare_features! (
(accepted, irrefutable_let_patterns, "1.33.0", Some(44495)),
/// Allows `#[instruction_set(_)]` attribute.
(accepted, isa_attribute, "1.67.0", Some(74727)),
/// Rescoping temporaries in `if let` to align with Rust 2024.
(accepted, if_let_rescope, "1.83.0", Some(124085)),

Check failure on line 248 in compiler/rustc_feature/src/accepted.rs

View workflow job for this annotation

GitHub Actions / PR - mingw-check-tidy

feature if_let_rescope is not sorted by feature name (should be between if_let and if_while_or_patterns)

Check failure on line 248 in compiler/rustc_feature/src/accepted.rs

View workflow job for this annotation

GitHub Actions / PR - x86_64-gnu-llvm-18

feature if_let_rescope is not sorted by feature name (should be between if_let and if_while_or_patterns)
/// Allows some increased flexibility in the name resolution rules,
/// especially around globs and shadowing (RFC 1560).
(accepted, item_like_imports, "1.15.0", Some(35120)),
Expand Down
2 changes: 0 additions & 2 deletions compiler/rustc_feature/src/unstable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -497,8 +497,6 @@ declare_features! (
(unstable, half_open_range_patterns_in_slices, "1.66.0", Some(67264)),
/// Allows `if let` guard in match arms.
(unstable, if_let_guard, "1.47.0", Some(51114)),
/// Rescoping temporaries in `if let` to align with Rust 2024.
(unstable, if_let_rescope, "1.83.0", Some(124085)),
/// Allows `impl Trait` to be used inside associated types (RFC 2515).
(unstable, impl_trait_in_assoc_type, "1.70.0", Some(63063)),
/// Allows `impl Trait` as output type in `Fn` traits in return position of functions.
Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_hir_analysis/src/check/region.rs
Original file line number Diff line number Diff line change
Expand Up @@ -466,7 +466,7 @@ fn resolve_expr<'tcx>(visitor: &mut RegionResolutionVisitor<'tcx>, expr: &'tcx h

hir::ExprKind::If(cond, then, Some(otherwise)) => {
let expr_cx = visitor.cx;
let data = if expr.span.at_least_rust_2024() && visitor.tcx.features().if_let_rescope {
let data = if expr.span.at_least_rust_2024() {
ScopeData::IfThenRescope
} else {
ScopeData::IfThen
Expand All @@ -481,7 +481,7 @@ fn resolve_expr<'tcx>(visitor: &mut RegionResolutionVisitor<'tcx>, expr: &'tcx h

hir::ExprKind::If(cond, then, None) => {
let expr_cx = visitor.cx;
let data = if expr.span.at_least_rust_2024() && visitor.tcx.features().if_let_rescope {
let data = if expr.span.at_least_rust_2024() {
ScopeData::IfThenRescope
} else {
ScopeData::IfThen
Expand Down
3 changes: 1 addition & 2 deletions compiler/rustc_lint/src/if_let_rescope.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ declare_lint! {
/// ### Example
///
/// ```rust,edition2021
/// #![feature(if_let_rescope)]
/// #![warn(if_let_rescope)]
/// #![allow(unused_variables)]
///
Expand Down Expand Up @@ -243,7 +242,7 @@ impl_lint_pass!(

impl<'tcx> LateLintPass<'tcx> for IfLetRescope {
fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx hir::Expr<'tcx>) {
if expr.span.edition().at_least_rust_2024() || !cx.tcx.features().if_let_rescope {
if expr.span.edition().at_least_rust_2024() {
return;
}
if let (Level::Allow, _) = cx.tcx.lint_level_at_node(IF_LET_RESCOPE, expr.hir_id) {
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_mir_build/src/thir/cx/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -777,7 +777,7 @@ impl<'tcx> Cx<'tcx> {
if_then_scope: region::Scope {
id: then.hir_id.local_id,
data: {
if expr.span.at_least_rust_2024() && tcx.features().if_let_rescope {
if expr.span.at_least_rust_2024() {
region::ScopeData::IfThenRescope
} else {
region::ScopeData::IfThen
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/drop/drop_order.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
//@ [edition2021] edition: 2021
//@ [edition2024] compile-flags: -Z unstable-options
//@ [edition2024] edition: 2024

#![feature(let_chains)]
#![cfg_attr(edition2024, feature(if_let_rescope))]

use std::cell::RefCell;
use std::convert::TryInto;
Expand Down
1 change: 0 additions & 1 deletion tests/ui/drop/drop_order_if_let_rescope.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
//@ compile-flags: -Z validate-mir -Zunstable-options

#![feature(let_chains)]
#![feature(if_let_rescope)]

use std::cell::RefCell;
use std::convert::TryInto;
Expand Down
1 change: 0 additions & 1 deletion tests/ui/drop/if-let-rescope-borrowck-suggestions.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
//@ edition: 2024
//@ compile-flags: -Z validate-mir -Zunstable-options

#![feature(if_let_rescope)]
#![deny(if_let_rescope)]

struct Droppy;
Expand Down
12 changes: 6 additions & 6 deletions tests/ui/drop/if-let-rescope-borrowck-suggestions.stderr
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
error[E0716]: temporary value dropped while borrowed
--> $DIR/if-let-rescope-borrowck-suggestions.rs:22:39
--> $DIR/if-let-rescope-borrowck-suggestions.rs:21:39
|
LL | do_something(if let Some(value) = Droppy.get_ref() { value } else { &0 });
| ^^^^^^ - temporary value is freed at the end of this statement
| |
| creates a temporary value which is freed while still in use
|
note: lifetimes for temporaries generated in `if let`s have been shortened in Edition 2024 so that they are dropped here instead
--> $DIR/if-let-rescope-borrowck-suggestions.rs:22:64
--> $DIR/if-let-rescope-borrowck-suggestions.rs:21:64
|
LL | do_something(if let Some(value) = Droppy.get_ref() { value } else { &0 });
| ^
Expand All @@ -22,7 +22,7 @@ LL | do_something({ match Droppy.get_ref() { Some(value) => { value } _ =>
| ~~~~~~~ ++++++++++++++++ ~~~~ ++

error[E0716]: temporary value dropped while borrowed
--> $DIR/if-let-rescope-borrowck-suggestions.rs:24:39
--> $DIR/if-let-rescope-borrowck-suggestions.rs:23:39
|
LL | do_something(if let Some(value) = Droppy.get_ref() {
| ^^^^^^ creates a temporary value which is freed while still in use
Expand All @@ -31,7 +31,7 @@ LL | } else if let Some(value) = Droppy.get_ref() {
| - temporary value is freed at the end of this statement
|
note: lifetimes for temporaries generated in `if let`s have been shortened in Edition 2024 so that they are dropped here instead
--> $DIR/if-let-rescope-borrowck-suggestions.rs:27:5
--> $DIR/if-let-rescope-borrowck-suggestions.rs:26:5
|
LL | } else if let Some(value) = Droppy.get_ref() {
| ^
Expand All @@ -53,7 +53,7 @@ LL ~ }}});
|

error[E0716]: temporary value dropped while borrowed
--> $DIR/if-let-rescope-borrowck-suggestions.rs:27:33
--> $DIR/if-let-rescope-borrowck-suggestions.rs:26:33
|
LL | } else if let Some(value) = Droppy.get_ref() {
| ^^^^^^ creates a temporary value which is freed while still in use
Expand All @@ -62,7 +62,7 @@ LL | } else {
| - temporary value is freed at the end of this statement
|
note: lifetimes for temporaries generated in `if let`s have been shortened in Edition 2024 so that they are dropped here instead
--> $DIR/if-let-rescope-borrowck-suggestions.rs:30:5
--> $DIR/if-let-rescope-borrowck-suggestions.rs:29:5
|
LL | } else {
| ^
Expand Down
11 changes: 4 additions & 7 deletions tests/ui/drop/lint-if-let-rescope-gated.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,8 @@
// Edition 2021 is used here because the lint should work especially
// when edition migration towards 2024 is run.

//@ revisions: with_feature_gate without_feature_gate
//@ [without_feature_gate] check-pass
//@ edition: 2021

#![cfg_attr(with_feature_gate, feature(if_let_rescope))]
#![deny(if_let_rescope)]
#![allow(irrefutable_let_patterns)]

Expand All @@ -25,10 +22,10 @@ impl Droppy {

fn main() {
if let Some(_value) = Droppy.get() {
//[with_feature_gate]~^ ERROR: `if let` assigns a shorter lifetime since Edition 2024
//[with_feature_gate]~| HELP: a `match` with a single arm can preserve the drop order up to Edition 2021
//[with_feature_gate]~| WARN: this changes meaning in Rust 2024
//~^ ERROR: `if let` assigns a shorter lifetime since Edition 2024
//~| HELP: a `match` with a single arm can preserve the drop order up to Edition 2021
//~| WARN: this changes meaning in Rust 2024
} else {
//[with_feature_gate]~^ HELP: the value is now dropped here in Edition 2024
//~^ HELP: the value is now dropped here in Edition 2024
}
}
33 changes: 33 additions & 0 deletions tests/ui/drop/lint-if-let-rescope-gated.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
error: `if let` assigns a shorter lifetime since Edition 2024
--> $DIR/lint-if-let-rescope-gated.rs:24:8
|
LL | if let Some(_value) = Droppy.get() {
| ^^^^^^^^^^^^^^^^^^^------^^^^^^
| |
| this value has a significant drop implementation which may observe a major change in drop order and requires your discretion
|
= warning: this changes meaning in Rust 2024
= note: for more information, see issue #124085 <https://github.com/rust-lang/rust/issues/124085>
help: the value is now dropped here in Edition 2024
--> $DIR/lint-if-let-rescope-gated.rs:28:5
|
LL | } else {
| ^
note: the lint level is defined here
--> $DIR/lint-if-let-rescope-gated.rs:8:9
|
LL | #![deny(if_let_rescope)]
| ^^^^^^^^^^^^^^
help: a `match` with a single arm can preserve the drop order up to Edition 2021
|
LL ~ match Droppy.get() { Some(_value) => {
LL |
LL |
LL |
LL ~ } _ => {
LL |
LL ~ }}
|

error: aborting due to 1 previous error

Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: `if let` assigns a shorter lifetime since Edition 2024
--> $DIR/lint-if-let-rescope-gated.rs:27:8
--> $DIR/lint-if-let-rescope-gated.rs:26:8
|
LL | if let Some(_value) = Droppy.get() {
| ^^^^^^^^^^^^^^^^^^^------^^^^^^
Expand All @@ -9,12 +9,12 @@ LL | if let Some(_value) = Droppy.get() {
= warning: this changes meaning in Rust 2024
= note: for more information, see issue #124085 <https://github.com/rust-lang/rust/issues/124085>
help: the value is now dropped here in Edition 2024
--> $DIR/lint-if-let-rescope-gated.rs:31:5
--> $DIR/lint-if-let-rescope-gated.rs:30:5
|
LL | } else {
| ^
note: the lint level is defined here
--> $DIR/lint-if-let-rescope-gated.rs:11:9
--> $DIR/lint-if-let-rescope-gated.rs:10:9
|
LL | #![deny(if_let_rescope)]
| ^^^^^^^^^^^^^^
Expand Down
1 change: 0 additions & 1 deletion tests/ui/drop/lint-if-let-rescope-with-macro.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
//@ edition:2021
//@ compile-flags: -Z unstable-options

#![feature(if_let_rescope)]
#![deny(if_let_rescope)]
#![allow(irrefutable_let_patterns)]

Expand Down
6 changes: 3 additions & 3 deletions tests/ui/drop/lint-if-let-rescope-with-macro.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: `if let` assigns a shorter lifetime since Edition 2024
--> $DIR/lint-if-let-rescope-with-macro.rs:13:12
--> $DIR/lint-if-let-rescope-with-macro.rs:12:12
|
LL | if let $p = $e { $($conseq)* } else { $($alt)* }
| ^^^
Expand All @@ -16,7 +16,7 @@ LL | | };
= warning: this changes meaning in Rust 2024
= note: for more information, see issue #124085 <https://github.com/rust-lang/rust/issues/124085>
help: the value is now dropped here in Edition 2024
--> $DIR/lint-if-let-rescope-with-macro.rs:13:38
--> $DIR/lint-if-let-rescope-with-macro.rs:12:38
|
LL | if let $p = $e { $($conseq)* } else { $($alt)* }
| ^
Expand All @@ -29,7 +29,7 @@ LL | | {}
LL | | };
| |_____- in this macro invocation
note: the lint level is defined here
--> $DIR/lint-if-let-rescope-with-macro.rs:8:9
--> $DIR/lint-if-let-rescope-with-macro.rs:7:9
|
LL | #![deny(if_let_rescope)]
| ^^^^^^^^^^^^^^
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/drop/lint-if-let-rescope.fixed
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//@ run-rustfix

#![deny(if_let_rescope)]
#![feature(if_let_rescope, stmt_expr_attributes)]
#![feature(stmt_expr_attributes)]
#![allow(irrefutable_let_patterns, unused_parens)]

fn droppy() -> Droppy {
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/drop/lint-if-let-rescope.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//@ run-rustfix

#![deny(if_let_rescope)]
#![feature(if_let_rescope, stmt_expr_attributes)]
#![feature(stmt_expr_attributes)]
#![allow(irrefutable_let_patterns, unused_parens)]

fn droppy() -> Droppy {
Expand Down
27 changes: 0 additions & 27 deletions tests/ui/feature-gates/feature-gate-if-let-rescope.rs

This file was deleted.

18 changes: 0 additions & 18 deletions tests/ui/feature-gates/feature-gate-if-let-rescope.stderr

This file was deleted.

1 change: 0 additions & 1 deletion tests/ui/mir/mir_let_chains_drop_order.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
// See `mir_drop_order.rs` for more information

#![feature(let_chains)]
#![cfg_attr(edition2024, feature(if_let_rescope))]
#![allow(irrefutable_let_patterns)]

use std::cell::RefCell;
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/nll/issue-54556-niconii.edition2021.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0597]: `counter` does not live long enough
--> $DIR/issue-54556-niconii.rs:30:20
--> $DIR/issue-54556-niconii.rs:28:20
|
LL | let counter = Mutex;
| ------- binding `counter` declared here
Expand Down
2 changes: 0 additions & 2 deletions tests/ui/nll/issue-54556-niconii.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@
//@ [edition2024] compile-flags: -Z unstable-options
//@ [edition2024] check-pass

#![cfg_attr(edition2024, feature(if_let_rescope))]

struct Mutex;
struct MutexGuard<'a>(&'a Mutex);

Expand Down

0 comments on commit 8daa523

Please sign in to comment.