diff --git a/compiler/rustc_hir_analysis/src/collect/type_of.rs b/compiler/rustc_hir_analysis/src/collect/type_of.rs index 84161ec764831..f817da141a8c8 100644 --- a/compiler/rustc_hir_analysis/src/collect/type_of.rs +++ b/compiler/rustc_hir_analysis/src/collect/type_of.rs @@ -175,19 +175,31 @@ fn const_arg_anon_type_of<'tcx>(tcx: TyCtxt<'tcx>, arg_hir_id: HirId, span: Span // arm would handle this. // // I believe this match arm is only needed for GAT but I am not 100% sure - BoxyUwU - Node::Ty(hir_ty @ hir::Ty { kind: TyKind::Path(QPath::TypeRelative(_, segment)), .. }) => { + Node::Ty(hir_ty @ hir::Ty { kind: TyKind::Path(QPath::TypeRelative(ty, segment)), .. }) => { // Find the Item containing the associated type so we can create an ItemCtxt. // Using the ItemCtxt lower the HIR for the unresolved assoc type into a // ty which is a fully resolved projection. // For the code example above, this would mean lowering `Self::Assoc<3>` // to a ty::Alias(ty::Projection, `::Assoc<3>`). - let item_def_id = tcx - .hir() - .parent_owner_iter(arg_hir_id) - .find(|(_, node)| matches!(node, OwnerNode::Item(_))) - .unwrap() - .0 - .def_id; + let node = if let TyKind::Path(QPath::Resolved(_, path)) = ty.kind + && let def::Res::Def(def::DefKind::TyParam, did) = path.res + { + tcx.hir() + .parent_owner_iter(arg_hir_id) + .find(|(_, node)| { + tcx.generics_of(node.def_id()) + .own_params + .iter() + .any(|param| param.def_id == did) + }) + .unwrap() + } else { + tcx.hir() + .parent_owner_iter(arg_hir_id) + .find(|(_, node)| matches!(node, OwnerNode::Item(_))) + .unwrap() + }; + let item_def_id = node.0.def_id; let ty = ItemCtxt::new(tcx, item_def_id).lower_ty(hir_ty); // Iterate through the generics of the projection to find the one that corresponds to diff --git a/tests/ui/traits/bound/unknown-assoc-with-const-arg.rs b/tests/ui/traits/bound/unknown-assoc-with-const-arg.rs new file mode 100644 index 0000000000000..b2665dc499cc3 --- /dev/null +++ b/tests/ui/traits/bound/unknown-assoc-with-const-arg.rs @@ -0,0 +1,9 @@ +// issue#132534 + +trait X { + fn a() -> T::unknown<{}> {} + //~^ ERROR: associated type `unknown` not found for `T` + //~| ERROR: associated type `unknown` not found for `T` +} + +fn main() {} diff --git a/tests/ui/traits/bound/unknown-assoc-with-const-arg.stderr b/tests/ui/traits/bound/unknown-assoc-with-const-arg.stderr new file mode 100644 index 0000000000000..d77e3873743a2 --- /dev/null +++ b/tests/ui/traits/bound/unknown-assoc-with-const-arg.stderr @@ -0,0 +1,17 @@ +error[E0220]: associated type `unknown` not found for `T` + --> $DIR/unknown-assoc-with-const-arg.rs:4:21 + | +LL | fn a() -> T::unknown<{}> {} + | ^^^^^^^ associated type `unknown` not found + +error[E0220]: associated type `unknown` not found for `T` + --> $DIR/unknown-assoc-with-const-arg.rs:4:21 + | +LL | fn a() -> T::unknown<{}> {} + | ^^^^^^^ associated type `unknown` not found + | + = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0220`.