diff options
| author | Oli Scherer <git-spam-no-reply9815368754983@oli-obk.de> | 2024-02-10 22:27:03 +0000 | 
|---|---|---|
| committer | Oli Scherer <git-spam-no-reply9815368754983@oli-obk.de> | 2024-02-12 09:44:09 +0000 | 
| commit | b43fbe63e7675a3c8d762127f450a62def4f653e (patch) | |
| tree | f245877b2a6fb7550655164843a1b41991365c66 /compiler/rustc_hir_analysis/src/astconv/mod.rs | |
| parent | ab0e8b314507cdda07a54f8b8de6a7a6a68e6ce4 (diff) | |
| download | rust-b43fbe63e7675a3c8d762127f450a62def4f653e.tar.gz rust-b43fbe63e7675a3c8d762127f450a62def4f653e.zip | |
Stop calling `impl_polarity` when `impl_trait_ref` was also called
Diffstat (limited to 'compiler/rustc_hir_analysis/src/astconv/mod.rs')
| -rw-r--r-- | compiler/rustc_hir_analysis/src/astconv/mod.rs | 19 | 
1 files changed, 9 insertions, 10 deletions
| diff --git a/compiler/rustc_hir_analysis/src/astconv/mod.rs b/compiler/rustc_hir_analysis/src/astconv/mod.rs index 1ae3ebaebbb..657de8ae9ad 100644 --- a/compiler/rustc_hir_analysis/src/astconv/mod.rs +++ b/compiler/rustc_hir_analysis/src/astconv/mod.rs @@ -1671,9 +1671,9 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { .is_accessible_from(self.item_def_id(), tcx) && tcx.all_impls(*trait_def_id) .any(|impl_def_id| { - let trait_ref = tcx.impl_trait_ref(impl_def_id); - trait_ref.is_some_and(|trait_ref| { - let impl_ = trait_ref.instantiate( + let impl_header = tcx.impl_trait_header(impl_def_id); + impl_header.is_some_and(|header| { + let header = header.instantiate( tcx, infcx.fresh_args_for_item(DUMMY_SP, impl_def_id), ); @@ -1685,11 +1685,10 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { infcx .can_eq( ty::ParamEnv::empty(), - impl_.self_ty(), + header.trait_ref.self_ty(), value, - ) + ) && header.polarity != ty::ImplPolarity::Negative }) - && tcx.impl_polarity(impl_def_id) != ty::ImplPolarity::Negative }) }) .map(|trait_def_id| tcx.def_path_str(trait_def_id)) @@ -1735,13 +1734,13 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { } else { // Find all the types that have an `impl` for the trait. tcx.all_impls(trait_def_id) - .filter(|impl_def_id| { + .filter_map(|impl_def_id| tcx.impl_trait_header(impl_def_id)) + .filter(|header| { // Consider only accessible traits tcx.visibility(trait_def_id).is_accessible_from(self.item_def_id(), tcx) - && tcx.impl_polarity(impl_def_id) != ty::ImplPolarity::Negative + && header.skip_binder().polarity != ty::ImplPolarity::Negative }) - .filter_map(|impl_def_id| tcx.impl_trait_ref(impl_def_id)) - .map(|impl_| impl_.instantiate_identity().self_ty()) + .map(|header| header.instantiate_identity().trait_ref.self_ty()) // We don't care about blanket impls. .filter(|self_ty| !self_ty.has_non_region_param()) .map(|self_ty| tcx.erase_regions(self_ty).to_string()) | 
