Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stabilize if_let_rescope #131984

Merged
merged 1 commit into from
Oct 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions compiler/rustc_feature/src/accepted.rs
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,8 @@ declare_features! (
(accepted, i128_type, "1.26.0", Some(35118)),
/// Allows the use of `if let` expressions.
(accepted, if_let, "1.0.0", None),
/// Rescoping temporaries in `if let` to align with Rust 2024.
(accepted, if_let_rescope, "CURRENT_RUSTC_VERSION", Some(124085)),
/// Allows top level or-patterns (`p | q`) in `if let` and `while let`.
(accepted, if_while_or_patterns, "1.33.0", Some(48215)),
/// Allows lifetime elision in `impl` headers. For example:
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 @@ -482,8 +482,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
6 changes: 2 additions & 4 deletions compiler/rustc_hir_analysis/src/check/region.rs
Original file line number Diff line number Diff line change
Expand Up @@ -466,8 +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 @@ -482,8 +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
22 changes: 11 additions & 11 deletions tests/ui/drop/lint-if-let-rescope-gated.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
// This test checks that the lint `if_let_rescope` only actions
// when the feature gate is enabled.
// Edition 2021 is used here because the lint should work especially
// when edition migration towards 2024 is run.
// when Edition 2021 or prior is targeted here because the lint should work especially
// when edition migration towards 2024 is executed.

//@ revisions: with_feature_gate without_feature_gate
//@ [without_feature_gate] check-pass
//@ edition: 2021
//@ revisions: edition2021 edition2024
//@ [edition2021] edition: 2021
//@ [edition2024] edition: 2024
//@ [edition2024] compile-flags: -Zunstable-options
//@ [edition2024] check-pass

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

Expand All @@ -25,10 +25,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
//[edition2021]~^ ERROR: `if let` assigns a shorter lifetime since Edition 2024
//[edition2021]~| HELP: a `match` with a single arm can preserve the drop order up to Edition 2021
//[edition2021]~| WARN: this changes meaning in Rust 2024
} else {
//[with_feature_gate]~^ HELP: the value is now dropped here in Edition 2024
//[edition2021]~^ HELP: the value is now dropped here in Edition 2024
}
}
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
Loading