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

Fix ICE in vec_box lint and add run-rustfix #3732

Merged
merged 2 commits into from Feb 2, 2019
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file or symbol
Failed to load files and symbols.
+96 −31
Diff settings

Always

Just for now

Copy path View file
@@ -275,26 +275,24 @@ fn check_ty(cx: &LateContext<'_, '_>, hir_ty: &hir::Ty, is_local: bool) {
if Some(def_id) == cx.tcx.lang_items().owned_box();
// At this point, we know ty is Box<T>, now get T
if let Some(ref last) = last_path_segment(ty_qpath).args;
if let Some(ty) = last.args.iter().find_map(|arg| match arg {
if let Some(boxed_ty) = last.args.iter().find_map(|arg| match arg {
GenericArg::Type(ty) => Some(ty),
GenericArg::Lifetime(_) => None,
});
if let TyKind::Path(ref ty_qpath) = ty.node;
let def = cx.tables.qpath_def(ty_qpath, ty.hir_id);
if let Some(def_id) = opt_def_id(def);
let boxed_type = cx.tcx.type_of(def_id);
if boxed_type.is_sized(cx.tcx.at(ty.span), cx.param_env);
then {
span_lint_and_sugg(
cx,
VEC_BOX,
hir_ty.span,
"`Vec<T>` is already on the heap, the boxing is unnecessary.",
"try",
format!("Vec<{}>", boxed_type),
Applicability::MaybeIncorrect,
);
return; // don't recurse into the type
let ty_ty = hir_ty_to_ty(cx.tcx, boxed_ty);
if ty_ty.is_sized(cx.tcx.at(ty.span), cx.param_env) {
span_lint_and_sugg(
cx,
VEC_BOX,
hir_ty.span,
"`Vec<T>` is already on the heap, the boxing is unnecessary.",
"try",
format!("Vec<{}>", ty_ty),
Applicability::MachineApplicable,
);
return; // don't recurse into the type
}
}
}
} else if match_def_path(cx.tcx, def_id, &paths::OPTION) {
Copy path View file
@@ -1,5 +1,5 @@
#![warn(clippy::all)]
#![allow(unused, clippy::needless_pass_by_value)]
#![allow(unused, clippy::needless_pass_by_value, clippy::vec_box)]
#![feature(associated_type_defaults)]

type Alias = Vec<Vec<Box<(u32, u32, u32, u32)>>>; // no warning here
Copy path View file
@@ -0,0 +1,36 @@
// run-rustfix

#![allow(dead_code)]

struct SizedStruct(i32);
struct UnsizedStruct([i32]);

/// The following should trigger the lint
mod should_trigger {
use super::SizedStruct;

struct StructWithVecBox {
sized_type: Vec<SizedStruct>,
}

struct A(Vec<SizedStruct>);
struct B(Vec<Vec<u32>>);
}

/// The following should not trigger the lint
mod should_not_trigger {
use super::UnsizedStruct;

struct C(Vec<Box<UnsizedStruct>>);

struct StructWithVecBoxButItsUnsized {
unsized_type: Vec<Box<UnsizedStruct>>,
}

struct TraitVec<T: ?Sized> {
// Regression test for #3720. This was causing an ICE.
inner: Vec<Box<T>>,
}
}

fn main() {}
Copy path View file
@@ -1,17 +1,36 @@
struct SizedStruct {
_a: i32,
}
// run-rustfix

struct UnsizedStruct {
_a: [i32],
}
#![allow(dead_code)]

struct SizedStruct(i32);
struct UnsizedStruct([i32]);

/// The following should trigger the lint
mod should_trigger {
use super::SizedStruct;

struct StructWithVecBox {
sized_type: Vec<Box<SizedStruct>>,
struct StructWithVecBox {
sized_type: Vec<Box<SizedStruct>>,
}

struct A(Vec<Box<SizedStruct>>);
struct B(Vec<Vec<Box<(u32)>>>);
}

struct StructWithVecBoxButItsUnsized {
unsized_type: Vec<Box<UnsizedStruct>>,
/// The following should not trigger the lint
mod should_not_trigger {
use super::UnsizedStruct;

struct C(Vec<Box<UnsizedStruct>>);

struct StructWithVecBoxButItsUnsized {
unsized_type: Vec<Box<UnsizedStruct>>,
}

struct TraitVec<T: ?Sized> {
// Regression test for #3720. This was causing an ICE.
inner: Vec<Box<T>>,
}
}

fn main() {}
Copy path View file
@@ -1,10 +1,22 @@
error: `Vec<T>` is already on the heap, the boxing is unnecessary.
--> $DIR/vec_box_sized.rs:10:17
--> $DIR/vec_box_sized.rs:13:21
|
LL | sized_type: Vec<Box<SizedStruct>>,
| ^^^^^^^^^^^^^^^^^^^^^ help: try: `Vec<SizedStruct>`
LL | sized_type: Vec<Box<SizedStruct>>,
| ^^^^^^^^^^^^^^^^^^^^^ help: try: `Vec<SizedStruct>`
|
= note: `-D clippy::vec-box` implied by `-D warnings`

error: aborting due to previous error
error: `Vec<T>` is already on the heap, the boxing is unnecessary.
--> $DIR/vec_box_sized.rs:16:14
|
LL | struct A(Vec<Box<SizedStruct>>);
| ^^^^^^^^^^^^^^^^^^^^^ help: try: `Vec<SizedStruct>`

error: `Vec<T>` is already on the heap, the boxing is unnecessary.
--> $DIR/vec_box_sized.rs:17:18
|
LL | struct B(Vec<Vec<Box<(u32)>>>);
| ^^^^^^^^^^^^^^^ help: try: `Vec<u32>`

error: aborting due to 3 previous errors

ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.