Auto merge of #10864 - y21:issue10437, r=blyxyas,xFrednet
[`unnecessary_lazy_eval`]: don't lint on types with deref impl Fixes #10437. This PR changes clippy's util module `eager_or_lazy` to also consider deref expressions whose type has a non-builtin deref impl and not suggest replacing it as that might have observable side effects. A prominent example might be the `lazy_static` macro, which creates a newtype with a `Deref` impl that you need to go through to get access to the inner value. Going from lazy to eager can make a difference there. changelog: [`unnecessary_lazy_eval`]: don't lint on types with non-builtin deref impl
This commit is contained in:
commit
b033883e2b
4 changed files with 97 additions and 37 deletions
|
|
@ -173,11 +173,15 @@ fn expr_eagerness<'tcx>(cx: &LateContext<'tcx>, e: &'tcx Expr<'_>) -> EagernessS
|
|||
self.eagerness = Lazy;
|
||||
}
|
||||
},
|
||||
|
||||
// Custom `Deref` impl might have side effects
|
||||
ExprKind::Unary(UnOp::Deref, e)
|
||||
if self.cx.typeck_results().expr_ty(e).builtin_deref(true).is_none() =>
|
||||
{
|
||||
self.eagerness |= NoChange;
|
||||
},
|
||||
// Dereferences should be cheap, but dereferencing a raw pointer earlier may not be safe.
|
||||
ExprKind::Unary(UnOp::Deref, e) if !self.cx.typeck_results().expr_ty(e).is_unsafe_ptr() => (),
|
||||
ExprKind::Unary(UnOp::Deref, _) => self.eagerness |= NoChange,
|
||||
|
||||
ExprKind::Unary(_, e)
|
||||
if matches!(
|
||||
self.cx.typeck_results().expr_ty(e).kind(),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue