catch pinned must_use types in unused_must_use

This commit is contained in:
Max Niederman 2023-11-18 20:04:50 -08:00
parent ea6b131132
commit 173b950311
No known key found for this signature in database
GPG Key ID: C2EB24390E0AC0FF

View File

@ -251,6 +251,7 @@ enum MustUsePath {
/// The root of the normal must_use lint with an optional message. /// The root of the normal must_use lint with an optional message.
Def(Span, DefId, Option<Symbol>), Def(Span, DefId, Option<Symbol>),
Boxed(Box<Self>), Boxed(Box<Self>),
Pinned(Box<Self>),
Opaque(Box<Self>), Opaque(Box<Self>),
TraitObject(Box<Self>), TraitObject(Box<Self>),
TupleElement(Vec<(usize, Self)>), TupleElement(Vec<(usize, Self)>),
@ -284,6 +285,11 @@ fn is_ty_must_use<'tcx>(
is_ty_must_use(cx, boxed_ty, expr, span) is_ty_must_use(cx, boxed_ty, expr, span)
.map(|inner| MustUsePath::Boxed(Box::new(inner))) .map(|inner| MustUsePath::Boxed(Box::new(inner)))
} }
ty::Adt(def, args) if cx.tcx.lang_items().pin_type() == Some(def.did()) => {
let pinned_ty = args.type_at(0);
is_ty_must_use(cx, pinned_ty, expr, span)
.map(|inner| MustUsePath::Pinned(Box::new(inner)))
}
ty::Adt(def, _) => is_def_must_use(cx, def.did(), span), ty::Adt(def, _) => is_def_must_use(cx, def.did(), span),
ty::Alias(ty::Opaque, ty::AliasTy { def_id: def, .. }) => { ty::Alias(ty::Opaque, ty::AliasTy { def_id: def, .. }) => {
elaborate( elaborate(
@ -425,6 +431,18 @@ fn emit_must_use_untranslated(
expr_is_from_block, expr_is_from_block,
); );
} }
MustUsePath::Pinned(path) => {
let descr_pre = &format!("{descr_pre}pinned ");
emit_must_use_untranslated(
cx,
path,
descr_pre,
descr_post,
plural_len,
true,
expr_is_from_block,
);
}
MustUsePath::Opaque(path) => { MustUsePath::Opaque(path) => {
let descr_pre = &format!("{descr_pre}implementer{plural_suffix} of "); let descr_pre = &format!("{descr_pre}implementer{plural_suffix} of ");
emit_must_use_untranslated( emit_must_use_untranslated(