Rollup merge of #141550 - Urgau:unused_braces-attrs, r=chenyukang
Fix `unused_braces` lint suggestion when encountering attributes This PR fixes the `unused_braces` lint suggestion when encountering attributes by not removing them in the suggestion. Fixes rust-lang/rust#141549
This commit is contained in:
@@ -1,8 +1,7 @@
|
|||||||
use std::iter;
|
use std::iter;
|
||||||
|
|
||||||
use rustc_ast as ast;
|
|
||||||
use rustc_ast::util::{classify, parser};
|
use rustc_ast::util::{classify, parser};
|
||||||
use rustc_ast::{ExprKind, StmtKind};
|
use rustc_ast::{self as ast, ExprKind, HasAttrs as _, StmtKind};
|
||||||
use rustc_errors::{MultiSpan, pluralize};
|
use rustc_errors::{MultiSpan, pluralize};
|
||||||
use rustc_hir::def::{DefKind, Res};
|
use rustc_hir::def::{DefKind, Res};
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
@@ -780,26 +779,30 @@ trait UnusedDelimLint {
|
|||||||
right_pos: Option<BytePos>,
|
right_pos: Option<BytePos>,
|
||||||
is_kw: bool,
|
is_kw: bool,
|
||||||
) {
|
) {
|
||||||
let spans = match value.kind {
|
let span_with_attrs = match value.kind {
|
||||||
ast::ExprKind::Block(ref block, None) if let [stmt] = block.stmts.as_slice() => stmt
|
ast::ExprKind::Block(ref block, None) if let [stmt] = block.stmts.as_slice() => {
|
||||||
.span
|
// For the statements with attributes, like `{ #[allow()] println!("Hello!") }`,
|
||||||
.find_ancestor_inside(value.span)
|
// the span should contains the attributes, or the suggestion will remove them.
|
||||||
.map(|span| (value.span.with_hi(span.lo()), value.span.with_lo(span.hi()))),
|
if let Some(attr_lo) = stmt.attrs().iter().map(|attr| attr.span.lo()).min() {
|
||||||
|
stmt.span.with_lo(attr_lo)
|
||||||
|
} else {
|
||||||
|
stmt.span
|
||||||
|
}
|
||||||
|
}
|
||||||
ast::ExprKind::Paren(ref expr) => {
|
ast::ExprKind::Paren(ref expr) => {
|
||||||
// For the expr with attributes, like `let _ = (#[inline] || println!("Hello!"));`,
|
// For the expr with attributes, like `let _ = (#[inline] || println!("Hello!"));`,
|
||||||
// the span should contains the attributes, or the suggestion will remove them.
|
// the span should contains the attributes, or the suggestion will remove them.
|
||||||
let expr_span_with_attrs =
|
|
||||||
if let Some(attr_lo) = expr.attrs.iter().map(|attr| attr.span.lo()).min() {
|
if let Some(attr_lo) = expr.attrs.iter().map(|attr| attr.span.lo()).min() {
|
||||||
expr.span.with_lo(attr_lo)
|
expr.span.with_lo(attr_lo)
|
||||||
} else {
|
} else {
|
||||||
expr.span
|
expr.span
|
||||||
};
|
}
|
||||||
expr_span_with_attrs.find_ancestor_inside(value.span).map(|expr_span| {
|
|
||||||
(value.span.with_hi(expr_span.lo()), value.span.with_lo(expr_span.hi()))
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
_ => return,
|
_ => return,
|
||||||
};
|
};
|
||||||
|
let spans = span_with_attrs
|
||||||
|
.find_ancestor_inside(value.span)
|
||||||
|
.map(|span| (value.span.with_hi(span.lo()), value.span.with_lo(span.hi())));
|
||||||
let keep_space = (
|
let keep_space = (
|
||||||
left_pos.is_some_and(|s| s >= value.span.lo()),
|
left_pos.is_some_and(|s| s >= value.span.lo()),
|
||||||
right_pos.is_some_and(|s| s <= value.span.hi()),
|
right_pos.is_some_and(|s| s <= value.span.hi()),
|
||||||
|
|||||||
15
tests/ui/lint/unused/unused-braces-attrs-issue-141549.fixed
Normal file
15
tests/ui/lint/unused/unused-braces-attrs-issue-141549.fixed
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
//@ check-pass
|
||||||
|
//@ run-rustfix
|
||||||
|
|
||||||
|
#![allow(dead_code)]
|
||||||
|
#![warn(unused_braces)]
|
||||||
|
|
||||||
|
use std::cmp::Ordering;
|
||||||
|
|
||||||
|
#[rustfmt::skip]
|
||||||
|
fn ptr_cmp<T: ?Sized>(p1: *const T, p2: *const T) -> Ordering {
|
||||||
|
#[expect(ambiguous_wide_pointer_comparisons)] p1.cmp(&p2)
|
||||||
|
//~^ WARN unnecessary braces around block return value
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
15
tests/ui/lint/unused/unused-braces-attrs-issue-141549.rs
Normal file
15
tests/ui/lint/unused/unused-braces-attrs-issue-141549.rs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
//@ check-pass
|
||||||
|
//@ run-rustfix
|
||||||
|
|
||||||
|
#![allow(dead_code)]
|
||||||
|
#![warn(unused_braces)]
|
||||||
|
|
||||||
|
use std::cmp::Ordering;
|
||||||
|
|
||||||
|
#[rustfmt::skip]
|
||||||
|
fn ptr_cmp<T: ?Sized>(p1: *const T, p2: *const T) -> Ordering {
|
||||||
|
{ #[expect(ambiguous_wide_pointer_comparisons)] p1.cmp(&p2) }
|
||||||
|
//~^ WARN unnecessary braces around block return value
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
19
tests/ui/lint/unused/unused-braces-attrs-issue-141549.stderr
Normal file
19
tests/ui/lint/unused/unused-braces-attrs-issue-141549.stderr
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
warning: unnecessary braces around block return value
|
||||||
|
--> $DIR/unused-braces-attrs-issue-141549.rs:11:5
|
||||||
|
|
|
||||||
|
LL | { #[expect(ambiguous_wide_pointer_comparisons)] p1.cmp(&p2) }
|
||||||
|
| ^^ ^^
|
||||||
|
|
|
||||||
|
note: the lint level is defined here
|
||||||
|
--> $DIR/unused-braces-attrs-issue-141549.rs:5:9
|
||||||
|
|
|
||||||
|
LL | #![warn(unused_braces)]
|
||||||
|
| ^^^^^^^^^^^^^
|
||||||
|
help: remove these braces
|
||||||
|
|
|
||||||
|
LL - { #[expect(ambiguous_wide_pointer_comparisons)] p1.cmp(&p2) }
|
||||||
|
LL + #[expect(ambiguous_wide_pointer_comparisons)] p1.cmp(&p2)
|
||||||
|
|
|
||||||
|
|
||||||
|
warning: 1 warning emitted
|
||||||
|
|
||||||
Reference in New Issue
Block a user