Merge pull request #303 from inrustwetrust/master

Don't show the explicit_iter_loop lint for arrays with more than 32 elements
This commit is contained in:
llogiq 2015-09-06 13:49:04 +02:00
commit dc32092ee4
2 changed files with 6 additions and 3 deletions

View File

@ -199,7 +199,7 @@ fn is_ref_iterable_type(cx: &Context, e: &Expr) -> bool {
// no walk_ptrs_ty: calling iter() on a reference can make sense because it
// will allow further borrows afterwards
let ty = cx.tcx.expr_ty(e);
is_array(ty) ||
is_iterable_array(ty) ||
match_type(cx, ty, &VEC_PATH) ||
match_type(cx, ty, &LL_PATH) ||
match_type(cx, ty, &["std", "collections", "hash", "map", "HashMap"]) ||
@ -210,9 +210,10 @@ fn is_ref_iterable_type(cx: &Context, e: &Expr) -> bool {
match_type(cx, ty, &["collections", "btree", "set", "BTreeSet"])
}
fn is_array(ty: ty::Ty) -> bool {
fn is_iterable_array(ty: ty::Ty) -> bool {
//IntoIterator is currently only implemented for array sizes <= 32 in rustc
match ty.sty {
ty::TyArray(..) => true,
ty::TyArray(_, 0...32) => true,
_ => false
}
}

View File

@ -42,6 +42,8 @@ fn main() {
for _v in [1, 2, 3].iter() { } //~ERROR it is more idiomatic to loop over `&[
for _v in (&mut [1, 2, 3]).iter() { } // no error
for _v in [0; 32].iter() {} //~ERROR it is more idiomatic to loop over `&[
for _v in [0; 33].iter() {} // no error
let ll: LinkedList<()> = LinkedList::new();
for _v in ll.iter() { } //~ERROR it is more idiomatic to loop over `&ll`
let vd: VecDeque<()> = VecDeque::new();