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 shorter-tail-lifetimes #131983

Merged
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 @@ -364,6 +364,8 @@ declare_features! (
(accepted, self_in_typedefs, "1.32.0", Some(49303)),
/// Allows `Self` struct constructor (RFC 2302).
(accepted, self_struct_ctor, "1.32.0", Some(51994)),
/// Shortern the tail expression lifetime
(accepted, shorter_tail_lifetimes, "CURRENT_RUSTC_VERSION", Some(123739)),
/// Allows using subslice patterns, `[a, .., b]` and `[a, xs @ .., b]`.
(accepted, slice_patterns, "1.42.0", Some(62254)),
/// Allows use of `&foo[a..b]` as a slicing syntax.
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 @@ -571,8 +571,6 @@ declare_features! (
(unstable, rust_cold_cc, "1.63.0", Some(97544)),
/// Allows use of x86 SHA512, SM3 and SM4 target-features and intrinsics
(unstable, sha512_sm_x86, "1.82.0", Some(126624)),
/// Shortern the tail expression lifetime
(unstable, shorter_tail_lifetimes, "1.79.0", Some(123739)),
/// Allows the use of SIMD types in functions declared in `extern` blocks.
(unstable, simd_ffi, "1.0.0", Some(27731)),
/// Allows specialization of implementations (RFC 1210).
Expand Down
4 changes: 1 addition & 3 deletions compiler/rustc_hir_analysis/src/check/region.rs
Original file line number Diff line number Diff line change
Expand Up @@ -167,9 +167,7 @@ fn resolve_block<'tcx>(visitor: &mut RegionResolutionVisitor<'tcx>, blk: &'tcx h
}
}
if let Some(tail_expr) = blk.expr {
if visitor.tcx.features().shorter_tail_lifetimes()
&& blk.span.edition().at_least_rust_2024()
{
if blk.span.edition().at_least_rust_2024() {
visitor.terminating_scopes.insert(tail_expr.hir_id.local_id);
}
visitor.visit_expr(tail_expr);
Expand Down
23 changes: 11 additions & 12 deletions compiler/rustc_lint/src/tail_expr_drop_order.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,14 @@ use rustc_span::edition::Edition;
use crate::{LateContext, LateLintPass};

declare_lint! {
/// The `tail_expr_drop_order` lint looks for those values generated at the tail expression location, that of type
/// with a significant `Drop` implementation, such as locks.
/// In case there are also local variables of type with significant `Drop` implementation as well,
/// this lint warns you of a potential transposition in the drop order.
/// Your discretion on the new drop order introduced by Edition 2024 is required.
/// The `tail_expr_drop_order` lint looks for those values generated at the tail expression location,
/// that runs a custom `Drop` destructor.
/// Some of them may be dropped earlier in Edition 2024 that they used to in Edition 2021 and prior.
/// This lint detects those cases and provides you information on those values and their custom destructor implementations.
/// Your discretion on this information is required.
///
/// ### Example
/// ```rust,edition2024
/// #![feature(shorter_tail_lifetimes)]
/// ```rust,edition2021
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

existing, but "The tail_expr_drop_order lint looks for those values generated at the tail expression location, that of type with a significant Drop implementation, such as locks." seems wrong to me.

    /// The `tail_expr_drop_order` lint looks for those values generated at the tail expression location,
    /// whose type has a significant `Drop` implementation, such as locks.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have tweaked the wording for clarity

/// #![warn(tail_expr_drop_order)]
/// struct Droppy(i32);
/// impl Droppy {
Expand All @@ -37,12 +36,12 @@ declare_lint! {
/// println!("loud drop {}", self.0);
/// }
/// }
/// fn edition_2024() -> i32 {
/// fn edition_2021() -> i32 {
/// let another_droppy = Droppy(0);
/// Droppy(1).get()
/// }
/// fn main() {
/// edition_2024();
/// edition_2021();
/// }
/// ```
///
Expand Down Expand Up @@ -137,7 +136,7 @@ impl<'tcx> LateLintPass<'tcx> for TailExprDropOrder {
_: Span,
def_id: rustc_span::def_id::LocalDefId,
) {
if cx.tcx.sess.at_least_rust_2024() && cx.tcx.features().shorter_tail_lifetimes() {
if !body.value.span.edition().at_least_rust_2024() {
Self::check_fn_or_closure(cx, fn_kind, body, def_id);
}
}
Expand Down Expand Up @@ -185,8 +184,8 @@ impl<'a, 'tcx> Visitor<'tcx> for LintVisitor<'a, 'tcx> {

impl<'a, 'tcx> LintVisitor<'a, 'tcx> {
fn check_block_inner(&mut self, block: &Block<'tcx>) {
if !block.span.at_least_rust_2024() {
// We only lint for Edition 2024 onwards
if block.span.at_least_rust_2024() {
// We only lint up to Edition 2021
return;
}
let Some(tail_expr) = block.expr else { return };
Expand Down
12 changes: 12 additions & 0 deletions tests/ui/drop/drop_order.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ impl DropOrderCollector {
() => self.print(10),
}

#[cfg(edition2021)]
match {
match self.option_loud_drop(14) {
_ => {
Expand All @@ -115,6 +116,17 @@ impl DropOrderCollector {
} {
_ => self.print(12),
}
#[cfg(edition2024)]
match {
match self.option_loud_drop(12) {
_ => {
self.print(11);
self.option_loud_drop(14)
}
}
} {
_ => self.print(13),
}

match {
loop {
Expand Down
12 changes: 4 additions & 8 deletions tests/ui/drop/lint-tail-expr-drop-order-gated.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
// This test ensures that `tail_expr_drop_order` does not activate in case Edition 2024 is not used
// or the feature gate `shorter_tail_lifetimes` is disabled.
// This test is to demonstrate that the lint is gated behind Edition and
// is triggered only for Edition 2021 and before.

//@ revisions: neither no_feature_gate edition_less_than_2024
//@ check-pass
//@ [neither] edition: 2021
//@ [no_feature_gate] compile-flags: -Z unstable-options
//@ [no_feature_gate] edition: 2024
//@ [edition_less_than_2024] edition: 2021
//@ edition: 2024
//@ compile-flags: -Z unstable-options

#![deny(tail_expr_drop_order)]
#![cfg_attr(edition_less_than_2024, feature(shorter_tail_lifetimes))]

struct LoudDropper;
impl Drop for LoudDropper {
Expand Down
4 changes: 1 addition & 3 deletions tests/ui/drop/lint-tail-expr-drop-order.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
//@ compile-flags: -Z unstable-options
//@ edition: 2024
//@ edition: 2021

// Edition 2024 lint for change in drop order at tail expression
// This lint is to capture potential change in program semantics
// due to implementation of RFC 3606 <https://github.com/rust-lang/rfcs/pull/3606>

#![deny(tail_expr_drop_order)]
#![feature(shorter_tail_lifetimes)]

struct LoudDropper;
impl Drop for LoudDropper {
Expand Down
8 changes: 4 additions & 4 deletions tests/ui/drop/lint-tail-expr-drop-order.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: these values and local bindings have significant drop implementation that will have a different drop order from that of Edition 2021
--> $DIR/lint-tail-expr-drop-order.rs:29:15
--> $DIR/lint-tail-expr-drop-order.rs:27:15
|
LL | let x = LoudDropper;
| - these values have significant drop implementation and will observe changes in drop order under Edition 2024
Expand All @@ -10,13 +10,13 @@ LL | x.get() + LoudDropper.get()
= warning: this changes meaning in Rust 2024
= note: for more information, see issue #123739 <https://github.com/rust-lang/rust/issues/123739>
note: the lint level is defined here
--> $DIR/lint-tail-expr-drop-order.rs:8:9
--> $DIR/lint-tail-expr-drop-order.rs:7:9
|
LL | #![deny(tail_expr_drop_order)]
| ^^^^^^^^^^^^^^^^^^^^

error: these values and local bindings have significant drop implementation that will have a different drop order from that of Edition 2021
--> $DIR/lint-tail-expr-drop-order.rs:36:23
--> $DIR/lint-tail-expr-drop-order.rs:34:23
|
LL | let x = LoudDropper;
| - these values have significant drop implementation and will observe changes in drop order under Edition 2024
Expand All @@ -27,7 +27,7 @@ LL | move || x.get() + LoudDropper.get()
= note: for more information, see issue #123739 <https://github.com/rust-lang/rust/issues/123739>

error: these values and local bindings have significant drop implementation that will have a different drop order from that of Edition 2021
--> $DIR/lint-tail-expr-drop-order.rs:65:19
--> $DIR/lint-tail-expr-drop-order.rs:63:19
|
LL | let x = LoudDropper;
| - these values have significant drop implementation and will observe changes in drop order under Edition 2024
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0716]: temporary value dropped while borrowed
--> $DIR/tail-expr-drop-order-negative.rs:11:15
--> $DIR/tail-expr-drop-order-negative.rs:9:15
|
LL | x.replace(std::cell::RefCell::new(123).borrow()).is_some()
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - temporary value is freed at the end of this statement
Expand Down
2 changes: 0 additions & 2 deletions tests/ui/drop/tail-expr-drop-order-negative.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
//@ [edition2024] edition: 2024
//@ [edition2021] check-pass

#![feature(shorter_tail_lifetimes)]

fn why_would_you_do_this() -> bool {
let mut x = None;
// Make a temporary `RefCell` and put a `Ref` that borrows it in `x`.
Expand Down
1 change: 0 additions & 1 deletion tests/ui/drop/tail-expr-drop-order.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
//@ edition: 2024
//@ run-pass

#![feature(shorter_tail_lifetimes)]
#![allow(unused_imports)]
#![allow(dead_code)]
#![allow(unused_variables)]
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/lifetimes/refcell-in-tail-expr.edition2021.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0597]: `cell` does not live long enough
--> $DIR/refcell-in-tail-expr.rs:12:27
--> $DIR/refcell-in-tail-expr.rs:10:27
|
LL | let cell = std::cell::RefCell::new(0u8);
| ---- binding `cell` declared here
Expand Down
2 changes: 0 additions & 2 deletions tests/ui/lifetimes/refcell-in-tail-expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
//@ [edition2024] compile-flags: -Zunstable-options
//@ [edition2024] check-pass

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

fn main() {
let cell = std::cell::RefCell::new(0u8);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0597]: `c` does not live long enough
--> $DIR/shorter-tail-expr-lifetime.rs:10:5
--> $DIR/shorter-tail-expr-lifetime.rs:8:5
|
LL | let c = std::cell::RefCell::new("..");
| - binding `c` declared here
Expand Down
2 changes: 0 additions & 2 deletions tests/ui/lifetimes/shorter-tail-expr-lifetime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
//@ [edition2024] edition: 2024
//@ [edition2024] run-pass

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

fn f() -> usize {
let c = std::cell::RefCell::new("..");
c.borrow().len() //[edition2021]~ ERROR: `c` does not live long enough
Expand Down
2 changes: 0 additions & 2 deletions tests/ui/lifetimes/tail-expr-in-nested-expr.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
//@ edition: 2024
//@ compile-flags: -Zunstable-options

#![feature(shorter_tail_lifetimes)]

fn main() {
let _ = { String::new().as_str() }.len();
//~^ ERROR temporary value dropped while borrowed
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/lifetimes/tail-expr-in-nested-expr.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0716]: temporary value dropped while borrowed
--> $DIR/tail-expr-in-nested-expr.rs:7:15
--> $DIR/tail-expr-in-nested-expr.rs:5:15
|
LL | let _ = { String::new().as_str() }.len();
| ^^^^^^^^^^^^^---------
Expand Down
1 change: 0 additions & 1 deletion tests/ui/lifetimes/tail-expr-lock-poisoning.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
//@ [edition2024] edition: 2024
//@ run-pass
//@ needs-unwind
#![cfg_attr(edition2024, feature(shorter_tail_lifetimes))]

use std::sync::Mutex;

Expand Down
Loading