summaryrefslogtreecommitdiff
path: root/compiler/rustc_ty_utils
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2023-03-30 05:48:59 +0000
committerbors <bors@rust-lang.org>2023-03-30 05:48:59 +0000
commitf2d9a3d0771504f1ae776226a5799dcb4408a91a (patch)
tree31f5ca937387f061a7139194f4693d8d7b33fb4a /compiler/rustc_ty_utils
parent82bfda848e28d7616c7045d7ced8cee88d2d1a8f (diff)
parent2ca350c776414fb09ca97311b5e0fee929c90902 (diff)
downloadrust-f2d9a3d0771504f1ae776226a5799dcb4408a91a.tar.gz
Auto merge of #109499 - spastorino:new-rpitit-19, r=compiler-errors
Give return-position impl traits in trait a (synthetic) name to avoid name collisions with new lowering strategy The only needed commit from this PR is the last one. r? `@compiler-errors` Needs #109455.
Diffstat (limited to 'compiler/rustc_ty_utils')
-rw-r--r--compiler/rustc_ty_utils/src/assoc.rs35
1 files changed, 19 insertions, 16 deletions
diff --git a/compiler/rustc_ty_utils/src/assoc.rs b/compiler/rustc_ty_utils/src/assoc.rs
index bf0bc202852..de1e1a527d5 100644
--- a/compiler/rustc_ty_utils/src/assoc.rs
+++ b/compiler/rustc_ty_utils/src/assoc.rs
@@ -1,3 +1,4 @@
+use rustc_data_structures::fx::FxIndexSet;
use rustc_hir as hir;
use rustc_hir::def::DefKind;
use rustc_hir::def_id::{DefId, DefIdMap, LocalDefId};
@@ -196,20 +197,26 @@ fn associated_types_for_impl_traits_in_associated_fn(
match tcx.def_kind(parent_def_id) {
DefKind::Trait => {
- struct RPITVisitor {
- rpits: Vec<LocalDefId>,
+ struct RPITVisitor<'tcx> {
+ rpits: FxIndexSet<LocalDefId>,
+ tcx: TyCtxt<'tcx>,
}
- impl<'v> Visitor<'v> for RPITVisitor {
- fn visit_ty(&mut self, ty: &'v hir::Ty<'v>) {
- if let hir::TyKind::OpaqueDef(item_id, _, _) = ty.kind {
- self.rpits.push(item_id.owner_id.def_id)
+ impl<'tcx> Visitor<'tcx> for RPITVisitor<'tcx> {
+ fn visit_ty(&mut self, ty: &'tcx hir::Ty<'tcx>) {
+ if let hir::TyKind::OpaqueDef(item_id, _, _) = ty.kind
+ && self.rpits.insert(item_id.owner_id.def_id)
+ {
+ let opaque_item = self.tcx.hir().expect_item(item_id.owner_id.def_id).expect_opaque_ty();
+ for bound in opaque_item.bounds {
+ intravisit::walk_param_bound(self, bound);
+ }
}
intravisit::walk_ty(self, ty)
}
}
- let mut visitor = RPITVisitor { rpits: Vec::new() };
+ let mut visitor = RPITVisitor { tcx, rpits: FxIndexSet::default() };
if let Some(output) = tcx.hir().get_fn_output(fn_def_id) {
visitor.visit_fn_ret_ty(output);
@@ -227,13 +234,9 @@ fn associated_types_for_impl_traits_in_associated_fn(
tcx.arena.alloc_from_iter(
tcx.associated_types_for_impl_traits_in_associated_fn(trait_fn_def_id).iter().map(
- move |trait_assoc_def_id| {
- associated_type_for_impl_trait_in_impl(
- tcx,
- trait_assoc_def_id.expect_local(),
- fn_def_id,
- )
- .to_def_id()
+ move |&trait_assoc_def_id| {
+ associated_type_for_impl_trait_in_impl(tcx, trait_assoc_def_id, fn_def_id)
+ .to_def_id()
},
),
)
@@ -355,7 +358,7 @@ fn associated_type_for_impl_trait_in_trait(
/// that inherits properties that we infer from the method and the associated type.
fn associated_type_for_impl_trait_in_impl(
tcx: TyCtxt<'_>,
- trait_assoc_def_id: LocalDefId,
+ trait_assoc_def_id: DefId,
impl_fn_def_id: LocalDefId,
) -> LocalDefId {
let impl_local_def_id = tcx.local_parent(impl_fn_def_id);
@@ -380,7 +383,7 @@ fn associated_type_for_impl_trait_in_impl(
name: kw::Empty,
kind: ty::AssocKind::Type,
def_id,
- trait_item_def_id: Some(trait_assoc_def_id.to_def_id()),
+ trait_item_def_id: Some(trait_assoc_def_id),
container: ty::ImplContainer,
fn_has_self_parameter: false,
opt_rpitit_info: Some(ImplTraitInTraitData::Impl { fn_def_id: impl_fn_def_id.to_def_id() }),