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

Rollup of 4 pull requests #132116

Merged
merged 8 commits into from
Oct 24, 2024
5 changes: 1 addition & 4 deletions compiler/rustc_ast/src/visit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -173,9 +173,6 @@ pub trait Visitor<'ast>: Sized {
fn visit_method_receiver_expr(&mut self, ex: &'ast Expr) -> Self::Result {
self.visit_expr(ex)
}
fn visit_expr_post(&mut self, _ex: &'ast Expr) -> Self::Result {
Self::Result::output()
}
fn visit_ty(&mut self, t: &'ast Ty) -> Self::Result {
walk_ty(self, t)
}
Expand Down Expand Up @@ -1185,7 +1182,7 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) -> V
ExprKind::Dummy => {}
}

visitor.visit_expr_post(expression)
V::Result::output()
}

pub fn walk_param<'a, V: Visitor<'a>>(visitor: &mut V, param: &'a Param) -> V::Result {
Expand Down
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 @@ -577,8 +577,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
27 changes: 12 additions & 15 deletions compiler/rustc_lint/src/early.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,18 @@ impl<'a, T: EarlyLintPass> ast_visit::Visitor<'a> for EarlyContextAndPass<'a, T>
self.with_lint_attrs(e.id, &e.attrs, |cx| {
lint_callback!(cx, check_expr, e);
ast_visit::walk_expr(cx, e);
// Explicitly check for lints associated with 'closure_id', since
// it does not have a corresponding AST node
match e.kind {
ast::ExprKind::Closure(box ast::Closure {
coroutine_kind: Some(coroutine_kind),
..
}) => {
cx.check_id(coroutine_kind.closure_id());
}
_ => {}
}
lint_callback!(cx, check_expr_post, e);
})
}

Expand Down Expand Up @@ -214,21 +226,6 @@ impl<'a, T: EarlyLintPass> ast_visit::Visitor<'a> for EarlyContextAndPass<'a, T>
})
}

fn visit_expr_post(&mut self, e: &'a ast::Expr) {
// Explicitly check for lints associated with 'closure_id', since
// it does not have a corresponding AST node
match e.kind {
ast::ExprKind::Closure(box ast::Closure {
coroutine_kind: Some(coroutine_kind),
..
}) => {
self.check_id(coroutine_kind.closure_id());
}
_ => {}
}
lint_callback!(self, check_expr_post, e);
}

fn visit_generic_arg(&mut self, arg: &'a ast::GenericArg) {
lint_callback!(self, check_generic_arg, arg);
ast_visit::walk_generic_arg(self, arg);
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
/// #![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
39 changes: 39 additions & 0 deletions library/core/src/net/socket_addr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,15 @@ pub enum SocketAddr {
/// [IETF RFC 793]: https://tools.ietf.org/html/rfc793
/// [`IPv4` address]: Ipv4Addr
///
/// # Textual representation
///
/// `SocketAddrV4` provides a [`FromStr`](crate::str::FromStr) implementation.
/// It accepts an IPv4 address in its [textual representation], followed by a
/// single `:`, followed by the port encoded as a decimal integer. Other
/// formats are not accepted.
///
/// [textual representation]: Ipv4Addr#textual-representation
///
/// # Examples
///
/// ```
Expand Down Expand Up @@ -82,6 +91,32 @@ pub struct SocketAddrV4 {
/// [IETF RFC 2553, Section 3.3]: https://tools.ietf.org/html/rfc2553#section-3.3
/// [`IPv6` address]: Ipv6Addr
///
/// # Textual representation
///
/// `SocketAddrV6` provides a [`FromStr`](crate::str::FromStr) implementation,
/// based on the bracketed format recommended by [IETF RFC 5952],
/// with scope identifiers based on those specified in [IETF RFC 4007].
///
/// It accepts addresses consisting of the following elements, in order:
/// - A left square bracket (`[`)
/// - The [textual representation] of an IPv6 address
/// - _Optionally_, a percent sign (`%`) followed by the scope identifier
/// encoded as a decimal integer
/// - A right square bracket (`]`)
/// - A colon (`:`)
/// - The port, encoded as a decimal integer.
///
/// For example, the string `[2001:db8::413]:443` represents a `SocketAddrV6`
/// with the address `2001:db8::413` and port `443`. The string
/// `[2001:db8::413%612]:443` represents the same address and port, with a
/// scope identifier of `612`.
///
/// Other formats are not accepted.
///
/// [IETF RFC 5952]: https://tools.ietf.org/html/rfc5952#section-6
/// [IETF RFC 4007]: https://tools.ietf.org/html/rfc4007#section-11
/// [textual representation]: Ipv6Addr#textual-representation
///
/// # Examples
///
/// ```
Expand All @@ -92,6 +127,10 @@ pub struct SocketAddrV4 {
/// assert_eq!("[2001:db8::1]:8080".parse(), Ok(socket));
/// assert_eq!(socket.ip(), &Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 1));
/// assert_eq!(socket.port(), 8080);
///
/// let mut with_scope = socket.clone();
/// with_scope.set_scope_id(3);
/// assert_eq!("[2001:db8::1%3]:8080".parse(), Ok(with_scope));
/// ```
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[stable(feature = "rust1", since = "1.0.0")]
Expand Down
1 change: 0 additions & 1 deletion src/doc/unstable-book/src/compiler-flags/sanitizer.md
Original file line number Diff line number Diff line change
Expand Up @@ -690,7 +690,6 @@ LeakSanitizer is run-time memory leak detector.

LeakSanitizer is supported on the following targets:

* `aarch64-apple-darwin`
* `aarch64-unknown-linux-gnu`
* `x86_64-apple-darwin`
* `x86_64-unknown-linux-gnu`
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