mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-12 15:04:03 +00:00
Auto merge of #132116 - matthiaskrgr:rollup-3a0ia4r, r=matthiaskrgr
Rollup of 4 pull requests Successful merges: - #131790 (Document textual format of SocketAddrV{4,6}) - #131983 (Stabilize shorter-tail-lifetimes) - #132097 (sanitizer.md: LeakSanitizer is not supported on aarch64 macOS) - #132107 (Remove visit_expr_post from ast Visitor) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
a93c1718c8
@ -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)
|
||||
}
|
||||
@ -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 {
|
||||
|
@ -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.
|
||||
|
@ -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).
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
})
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
@ -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 {
|
||||
@ -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();
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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 };
|
||||
|
@ -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
|
||||
///
|
||||
/// ```
|
||||
@ -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
|
||||
///
|
||||
/// ```
|
||||
@ -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")]
|
||||
|
@ -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`
|
||||
|
@ -105,6 +105,7 @@ impl DropOrderCollector {
|
||||
() => self.print(10),
|
||||
}
|
||||
|
||||
#[cfg(edition2021)]
|
||||
match {
|
||||
match self.option_loud_drop(14) {
|
||||
_ => {
|
||||
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
|
@ -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
|
||||
|
@ -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`.
|
||||
|
@ -4,7 +4,6 @@
|
||||
//@ edition: 2024
|
||||
//@ run-pass
|
||||
|
||||
#![feature(shorter_tail_lifetimes)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(dead_code)]
|
||||
#![allow(unused_variables)]
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
| ^^^^^^^^^^^^^---------
|
||||
|
@ -4,7 +4,6 @@
|
||||
//@ [edition2024] edition: 2024
|
||||
//@ run-pass
|
||||
//@ needs-unwind
|
||||
#![cfg_attr(edition2024, feature(shorter_tail_lifetimes))]
|
||||
|
||||
use std::sync::Mutex;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user