Avoid lint to unsized mutable reference

This commit is contained in:
koka 2022-11-12 20:31:25 +09:00
parent cad0d3d6da
commit 93edc127a0
No known key found for this signature in database
GPG Key ID: A5917A40697774CD
2 changed files with 26 additions and 7 deletions

View File

@ -68,7 +68,8 @@ fn visit_expr(&mut self, expr: &'tcx hir::Expr<'_>) {
expr.span,
"generally you want to avoid `&mut &mut _` if possible",
);
} else if let ty::Ref(_, _, hir::Mutability::Mut) = self.cx.typeck_results().expr_ty(e).kind() {
} else if let ty::Ref(_, ty, hir::Mutability::Mut) = self.cx.typeck_results().expr_ty(e).kind() {
if ty.peel_refs().is_sized(self.cx.tcx.at(expr.span), self.cx.param_env) {
span_lint(
self.cx,
MUT_MUT,
@ -78,6 +79,7 @@ fn visit_expr(&mut self, expr: &'tcx hir::Expr<'_>) {
}
}
}
}
fn visit_ty(&mut self, ty: &'tcx hir::Ty<'_>) {
if in_external_macro(self.cx.sess(), ty.span) {

View File

@ -57,3 +57,20 @@ fn issue6922() {
// do not lint from an external macro
mut_mut!();
}
mod issue9035 {
use std::fmt::Display;
struct Foo<'a> {
inner: &'a mut dyn Display,
}
impl Foo<'_> {
fn foo(&mut self) {
let hlp = &mut self.inner;
bar(hlp);
}
}
fn bar(_: &mut impl Display) {}
}