Rollup merge of #104363 - WaffleLapkin:bonk_box_new, r=Nilstrieb
Make `unused_allocation` lint against `Box::new` too
Previously it only linted against `box` syntax, which likely won't ever be stabilized, which is pretty useless. Even now I'm not sure if it's a meaningful lint, but it's at least something 🤷
This means that code like the following will be linted against:
```rust
Box::new([1, 2, 3]).len();
f(&Box::new(1)); // where f : &i32 -> ()
```
The lint works by checking if a `Box::new` (or `box`) expression has an a borrow adjustment, meaning that the code that first stores the box in a variable won't be linted against:
```rust
let boxed = Box::new([1, 2, 3]); // no lint
boxed.len();
```
This commit is contained in:
commit
fbc121fdfd
11 changed files with 59 additions and 39 deletions
|
|
@ -2,9 +2,7 @@
|
|||
// error-pattern:so long
|
||||
// ignore-emscripten no processes
|
||||
|
||||
#![allow(unused_allocation)]
|
||||
#![allow(unreachable_code)]
|
||||
#![allow(unused_variables)]
|
||||
|
||||
fn main() {
|
||||
let mut x = Vec::new();
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
// run-rustfix
|
||||
// rustfix-only-machine-applicable
|
||||
|
||||
#[allow(unused_must_use)]
|
||||
#[allow(unused_must_use, unused_allocation)]
|
||||
fn main() {
|
||||
let small = [1, 2];
|
||||
let big = [0u8; 33];
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
// run-rustfix
|
||||
// rustfix-only-machine-applicable
|
||||
|
||||
#[allow(unused_must_use)]
|
||||
#[allow(unused_must_use, unused_allocation)]
|
||||
fn main() {
|
||||
let small = [1, 2];
|
||||
let big = [0u8; 33];
|
||||
|
|
|
|||
7
tests/ui/lint/unused/unused-allocation.rs
Normal file
7
tests/ui/lint/unused/unused-allocation.rs
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
#![feature(rustc_attrs, stmt_expr_attributes)]
|
||||
#![deny(unused_allocation)]
|
||||
|
||||
fn main() {
|
||||
_ = (#[rustc_box] Box::new([1])).len(); //~ error: unnecessary allocation, use `&` instead
|
||||
_ = Box::new([1]).len(); //~ error: unnecessary allocation, use `&` instead
|
||||
}
|
||||
20
tests/ui/lint/unused/unused-allocation.stderr
Normal file
20
tests/ui/lint/unused/unused-allocation.stderr
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
error: unnecessary allocation, use `&` instead
|
||||
--> $DIR/unused-allocation.rs:5:9
|
||||
|
|
||||
LL | _ = (#[rustc_box] Box::new([1])).len();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/unused-allocation.rs:2:9
|
||||
|
|
||||
LL | #![deny(unused_allocation)]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: unnecessary allocation, use `&` instead
|
||||
--> $DIR/unused-allocation.rs:6:9
|
||||
|
|
||||
LL | _ = Box::new([1]).len();
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
// run-pass
|
||||
#![allow(unused_allocation)]
|
||||
|
||||
use std::rc::Rc;
|
||||
|
||||
|
|
@ -13,7 +14,7 @@ impl Trait for Vec<i32> {
|
|||
}
|
||||
|
||||
fn main() {
|
||||
let v = vec![1,2,3];
|
||||
let v = vec![1, 2, 3];
|
||||
|
||||
assert_eq!(&[1,2,3], Box::new(Rc::new(v)).trait_method());
|
||||
assert_eq!(&[1, 2, 3], Box::new(Rc::new(v)).trait_method());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
// run-pass
|
||||
#![allow(dead_code)]
|
||||
#![allow(dead_code, unused_allocation)]
|
||||
|
||||
use std::mem;
|
||||
|
||||
|
|
@ -20,7 +20,6 @@ struct AlignMany(i32);
|
|||
|
||||
// Raising alignment may not alter size.
|
||||
#[repr(align(8))]
|
||||
#[allow(dead_code)]
|
||||
struct Align8Many {
|
||||
a: i32,
|
||||
b: i32,
|
||||
|
|
@ -29,9 +28,8 @@ struct Align8Many {
|
|||
}
|
||||
|
||||
enum Enum {
|
||||
#[allow(dead_code)]
|
||||
A(i32),
|
||||
B(Align16)
|
||||
B(Align16),
|
||||
}
|
||||
|
||||
// Nested alignment - use `#[repr(C)]` to suppress field reordering for sizeof test
|
||||
|
|
@ -73,7 +71,7 @@ struct AlignLarge {
|
|||
|
||||
union UnionContainsAlign {
|
||||
a: Align16,
|
||||
b: f32
|
||||
b: f32,
|
||||
}
|
||||
|
||||
impl Align16 {
|
||||
|
|
@ -158,7 +156,7 @@ pub fn main() {
|
|||
// Note that the size of Nested may change if struct field re-ordering is enabled
|
||||
assert_eq!(mem::align_of::<Nested>(), 16);
|
||||
assert_eq!(mem::size_of::<Nested>(), 48);
|
||||
let a = Nested{ a: 1, b: 2, c: Align16(3), d: 4};
|
||||
let a = Nested { a: 1, b: 2, c: Align16(3), d: 4 };
|
||||
assert_eq!(mem::align_of_val(&a), 16);
|
||||
assert_eq!(mem::align_of_val(&a.b), 4);
|
||||
assert_eq!(mem::align_of_val(&a.c), 16);
|
||||
|
|
@ -179,8 +177,8 @@ pub fn main() {
|
|||
assert_eq!(a.0, 15);
|
||||
assert_eq!(mem::align_of_val(a), 16);
|
||||
assert_eq!(mem::size_of_val(a), 16);
|
||||
},
|
||||
_ => ()
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
assert!(is_aligned_to(&e, 16));
|
||||
|
||||
|
|
@ -197,8 +195,8 @@ pub fn main() {
|
|||
}
|
||||
|
||||
// arrays of aligned elements should also be aligned
|
||||
assert_eq!(mem::align_of::<[Align16;2]>(), 16);
|
||||
assert_eq!(mem::size_of::<[Align16;2]>(), 32);
|
||||
assert_eq!(mem::align_of::<[Align16; 2]>(), 16);
|
||||
assert_eq!(mem::size_of::<[Align16; 2]>(), 32);
|
||||
|
||||
let a = [Align16(0), Align16(1)];
|
||||
assert_eq!(mem::align_of_val(&a[0]), 16);
|
||||
|
|
@ -209,7 +207,7 @@ pub fn main() {
|
|||
assert_eq!(mem::align_of_val(Box::new(Align16(0)).as_ref()), 16);
|
||||
|
||||
// check heap array is aligned
|
||||
let a = vec!(Align16(0), Align16(1));
|
||||
let a = vec![Align16(0), Align16(1)];
|
||||
assert_eq!(mem::align_of_val(&a[0]), 16);
|
||||
assert_eq!(mem::align_of_val(&a[1]), 16);
|
||||
|
||||
|
|
@ -224,16 +222,14 @@ pub fn main() {
|
|||
|
||||
assert_eq!(mem::align_of::<AlignContainsPacked4C>(), 16);
|
||||
assert_eq!(mem::size_of::<AlignContainsPacked4C>(), 32);
|
||||
let a = AlignContainsPacked4C { a: Packed4C{ a: 1, b: 2 }, b: 3 };
|
||||
let a = AlignContainsPacked4C { a: Packed4C { a: 1, b: 2 }, b: 3 };
|
||||
assert_eq!(mem::align_of_val(&a), 16);
|
||||
assert_eq!(mem::align_of_val(&a.a), 4);
|
||||
assert_eq!(mem::align_of_val(&a.b), mem::align_of::<u64>());
|
||||
assert_eq!(mem::size_of_val(&a), 32);
|
||||
assert!(is_aligned_to(&a, 16));
|
||||
|
||||
let mut large = Box::new(AlignLarge {
|
||||
stuff: [0; 0x10000],
|
||||
});
|
||||
let mut large = Box::new(AlignLarge { stuff: [0; 0x10000] });
|
||||
large.stuff[0] = 132;
|
||||
*large.stuff.last_mut().unwrap() = 102;
|
||||
assert_eq!(large.stuff[0], 132);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue