Fix incorrect suggestion when clone_on_ref_ptr
is triggered in macros
This commit is contained in:
parent
27ae4d303c
commit
3d820f71fe
3 changed files with 32 additions and 7 deletions
|
@ -2150,18 +2150,19 @@ fn lint_clone_on_ref_ptr(cx: &LateContext<'_>, expr: &hir::Expr<'_>, arg: &hir::
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let snippet = if in_macro(arg.span) {
|
||||||
|
snippet_with_macro_callsite(cx, arg.span, "_")
|
||||||
|
} else {
|
||||||
|
snippet(cx, arg.span, "_")
|
||||||
|
};
|
||||||
|
|
||||||
span_lint_and_sugg(
|
span_lint_and_sugg(
|
||||||
cx,
|
cx,
|
||||||
CLONE_ON_REF_PTR,
|
CLONE_ON_REF_PTR,
|
||||||
expr.span,
|
expr.span,
|
||||||
"using `.clone()` on a ref-counted pointer",
|
"using `.clone()` on a ref-counted pointer",
|
||||||
"try this",
|
"try this",
|
||||||
format!(
|
format!("{}::<{}>::clone(&{})", caller_type, subst.type_at(0), snippet),
|
||||||
"{}::<{}>::clone(&{})",
|
|
||||||
caller_type,
|
|
||||||
subst.type_at(0),
|
|
||||||
snippet(cx, arg.span, "_")
|
|
||||||
),
|
|
||||||
Applicability::Unspecified, // Sometimes unnecessary ::<_> after Rc/Arc/Weak
|
Applicability::Unspecified, // Sometimes unnecessary ::<_> after Rc/Arc/Weak
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,3 +90,21 @@ mod many_derefs {
|
||||||
let _ = &encoded.clone();
|
let _ = &encoded.clone();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod issue2076 {
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
macro_rules! try_opt {
|
||||||
|
($expr: expr) => {
|
||||||
|
match $expr {
|
||||||
|
Some(value) => value,
|
||||||
|
None => return None,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn func() -> Option<Rc<u8>> {
|
||||||
|
let rc = Rc::new(42);
|
||||||
|
Some(try_opt!(Some(rc)).clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -96,5 +96,11 @@ help: or try being explicit if you are sure, that you want to clone a reference
|
||||||
LL | let _ = &<&[u8]>::clone(encoded);
|
LL | let _ = &<&[u8]>::clone(encoded);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: aborting due to 11 previous errors
|
error: using `.clone()` on a ref-counted pointer
|
||||||
|
--> $DIR/unnecessary_clone.rs:108:14
|
||||||
|
|
|
||||||
|
LL | Some(try_opt!(Some(rc)).clone())
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `Rc::<u8>::clone(&try_opt!(Some(rc)))`
|
||||||
|
|
||||||
|
error: aborting due to 12 previous errors
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue