Elaborate supertrait bounds when triggering unused_must_use on impl Trait
This commit is contained in:
parent
542febd2d3
commit
8509819aef
@ -7,6 +7,7 @@
|
|||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{DefKind, Res};
|
use rustc_hir::def::{DefKind, Res};
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
|
use rustc_infer::traits::util::elaborate_predicates_with_span;
|
||||||
use rustc_middle::ty::adjustment;
|
use rustc_middle::ty::adjustment;
|
||||||
use rustc_middle::ty::{self, Ty};
|
use rustc_middle::ty::{self, Ty};
|
||||||
use rustc_span::symbol::Symbol;
|
use rustc_span::symbol::Symbol;
|
||||||
@ -204,10 +205,13 @@ fn check_must_use_ty<'tcx>(
|
|||||||
ty::Adt(def, _) => check_must_use_def(cx, def.did(), span, descr_pre, descr_post),
|
ty::Adt(def, _) => check_must_use_def(cx, def.did(), span, descr_pre, descr_post),
|
||||||
ty::Opaque(def, _) => {
|
ty::Opaque(def, _) => {
|
||||||
let mut has_emitted = false;
|
let mut has_emitted = false;
|
||||||
for &(predicate, _) in cx.tcx.explicit_item_bounds(def) {
|
for obligation in elaborate_predicates_with_span(
|
||||||
|
cx.tcx,
|
||||||
|
cx.tcx.explicit_item_bounds(def).iter().cloned(),
|
||||||
|
) {
|
||||||
// We only look at the `DefId`, so it is safe to skip the binder here.
|
// We only look at the `DefId`, so it is safe to skip the binder here.
|
||||||
if let ty::PredicateKind::Trait(ref poly_trait_predicate) =
|
if let ty::PredicateKind::Trait(ref poly_trait_predicate) =
|
||||||
predicate.kind().skip_binder()
|
obligation.predicate.kind().skip_binder()
|
||||||
{
|
{
|
||||||
let def_id = poly_trait_predicate.trait_ref.def_id;
|
let def_id = poly_trait_predicate.trait_ref.def_id;
|
||||||
let descr_pre =
|
let descr_pre =
|
||||||
|
11
src/test/ui/lint/unused/unused-supertrait.rs
Normal file
11
src/test/ui/lint/unused/unused-supertrait.rs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#![deny(unused_must_use)]
|
||||||
|
|
||||||
|
fn it() -> impl ExactSizeIterator<Item = ()> {
|
||||||
|
let x: Box<dyn ExactSizeIterator<Item = ()>> = todo!();
|
||||||
|
x
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
it();
|
||||||
|
//~^ ERROR unused implementer of `Iterator` that must be used
|
||||||
|
}
|
15
src/test/ui/lint/unused/unused-supertrait.stderr
Normal file
15
src/test/ui/lint/unused/unused-supertrait.stderr
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
error: unused implementer of `Iterator` that must be used
|
||||||
|
--> $DIR/unused-supertrait.rs:9:5
|
||||||
|
|
|
||||||
|
LL | it();
|
||||||
|
| ^^^^^
|
||||||
|
|
|
||||||
|
= note: iterators are lazy and do nothing unless consumed
|
||||||
|
note: the lint level is defined here
|
||||||
|
--> $DIR/unused-supertrait.rs:1:9
|
||||||
|
|
|
||||||
|
LL | #![deny(unused_must_use)]
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
Loading…
Reference in New Issue
Block a user