|  | 
| 4 | 4 | use rustc_hir::def::Res; | 
| 5 | 5 | use rustc_hir::def_id::DefId; | 
| 6 | 6 | use rustc_hir::{Expr, ExprKind, HirId}; | 
| 7 |  | -use rustc_middle::ty::{self, ClauseKind, GenericArgsRef, PredicatePolarity, TraitPredicate, Ty}; | 
|  | 7 | +use rustc_middle::ty::{self, GenericArgsRef, PredicatePolarity, Ty}; | 
| 8 | 8 | use rustc_session::{declare_lint_pass, declare_tool_lint}; | 
| 9 | 9 | use rustc_span::hygiene::{ExpnKind, MacroKind}; | 
| 10 | 10 | use rustc_span::{Span, sym}; | 
| @@ -129,18 +129,23 @@ fn has_unstable_into_iter_predicate<'tcx>( | 
| 129 | 129 |     }; | 
| 130 | 130 |     let predicates = cx.tcx.predicates_of(callee_def_id).instantiate(cx.tcx, generic_args); | 
| 131 | 131 |     for (predicate, _) in predicates { | 
| 132 |  | -        let ClauseKind::Trait(TraitPredicate { trait_ref, polarity: PredicatePolarity::Positive }) = | 
| 133 |  | -            predicate.kind().skip_binder() | 
| 134 |  | -        else { | 
|  | 132 | +        let Some(trait_pred) = predicate.as_trait_clause() else { | 
| 135 | 133 |             continue; | 
| 136 | 134 |         }; | 
| 137 |  | -        // Does the function or method require any of its arguments to implement `IntoIterator`? | 
| 138 |  | -        if trait_ref.def_id != into_iterator_def_id { | 
|  | 135 | +        if trait_pred.def_id() != into_iterator_def_id | 
|  | 136 | +            || trait_pred.polarity() != PredicatePolarity::Positive | 
|  | 137 | +        { | 
| 139 | 138 |             continue; | 
| 140 | 139 |         } | 
| 141 |  | -        let Ok(Some(instance)) = | 
| 142 |  | -            ty::Instance::try_resolve(cx.tcx, cx.typing_env(), into_iter_fn_def_id, trait_ref.args) | 
| 143 |  | -        else { | 
|  | 140 | +        // `IntoIterator::into_iter` has no additional method args. | 
|  | 141 | +        let into_iter_fn_args = | 
|  | 142 | +            cx.tcx.instantiate_bound_regions_with_erased(trait_pred).trait_ref.args; | 
|  | 143 | +        let Ok(Some(instance)) = ty::Instance::try_resolve( | 
|  | 144 | +            cx.tcx, | 
|  | 145 | +            cx.typing_env(), | 
|  | 146 | +            into_iter_fn_def_id, | 
|  | 147 | +            into_iter_fn_args, | 
|  | 148 | +        ) else { | 
| 144 | 149 |             continue; | 
| 145 | 150 |         }; | 
| 146 | 151 |         // Does the input type's `IntoIterator` implementation have the | 
|  | 
0 commit comments