diff --git a/clippy_lints/src/ptr.rs b/clippy_lints/src/ptr.rs index a6a3690202fa..139b5883fb0d 100644 --- a/clippy_lints/src/ptr.rs +++ b/clippy_lints/src/ptr.rs @@ -3,6 +3,7 @@ use std::borrow::Cow; use rustc::hir::*; use rustc::hir::map::NodeItem; +use rustc::hir::QPath; use rustc::lint::*; use rustc::ty; use syntax::ast::NodeId; @@ -213,6 +214,33 @@ fn check_fn(cx: &LateContext, decl: &FnDecl, fn_id: NodeId, opt_body_id: Option< }, ); } + } else if match_type(cx, ty, &paths::COW) { + if_chain! { + if let TyRptr(_, MutTy { ref ty, ..} ) = arg.node; + if let TyPath(ref path) = ty.node; + if let QPath::Resolved(None, ref pp) = *path; + if let [ref bx] = *pp.segments; + if let Some(ref params) = bx.parameters; + if !params.parenthesized; + if let [ref inner] = *params.types; + then { + let replacement = snippet_opt(cx, inner.span); + match replacement { + Some(r) => { + span_lint_and_then( + cx, + PTR_ARG, + arg.span, + "using a reference to `Cow` is not recommended.", + |db| { + db.span_suggestion(arg.span, "change this to", "&".to_owned() + &r); + }, + ); + }, + None => (), + } + } + } } } } diff --git a/tests/ui/needless_borrow.rs b/tests/ui/needless_borrow.rs index 78c1a125c94f..088d33b875f9 100644 --- a/tests/ui/needless_borrow.rs +++ b/tests/ui/needless_borrow.rs @@ -1,4 +1,4 @@ - +use std::borrow::Cow; fn x(y: &i32) -> i32 { @@ -51,3 +51,12 @@ fn issue_1432() { let _ = v.iter().filter(|&a| a.is_empty()); } + +#[allow(dead_code)] +fn test_cow_with_ref(c: &Cow<[i32]>) { +} + +#[allow(dead_code)] +fn test_cow(c: Cow<[i32]>) { + let _c = c; +} diff --git a/tests/ui/needless_borrow.stderr b/tests/ui/needless_borrow.stderr index fde38508b323..e319efa939cc 100644 --- a/tests/ui/needless_borrow.stderr +++ b/tests/ui/needless_borrow.stderr @@ -38,5 +38,13 @@ error: this pattern creates a reference to a reference 50 | let _ = v.iter().filter(|&ref a| a.is_empty()); | ^^^^^ help: change this to: `a` -error: aborting due to 6 previous errors +error: using a reference to `Cow` is not recommended. + --> $DIR/needless_borrow.rs:56:25 + | +56 | fn test_cow_with_ref(c: &Cow<[i32]>) { + | ^^^^^^^^^^^ help: change this to: `&[i32]` + | + = note: `-D ptr-arg` implied by `-D warnings` + +error: aborting due to 7 previous errors