|
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