|
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