From 34cf0b32674da79403746716e5a7ed2072dfabe2 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Mon, 10 Feb 2020 23:35:49 -0500 Subject: [PATCH] Only use the parent if it's an opaque type --- src/librustc_typeck/collect.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index 49b1bfb72a3..242faebe53e 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -1057,11 +1057,19 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> &ty::Generics { ItemKind::OpaqueTy(hir::OpaqueTy { impl_trait_fn, .. }) => { impl_trait_fn.or_else(|| { let parent_id = tcx.hir().get_parent_item(hir_id); - // This opaque type might occur inside another opaque type - // (e.g. `impl Foo>`) if parent_id != hir_id && parent_id != CRATE_HIR_ID { debug!("generics_of: parent of opaque ty {:?} is {:?}", def_id, parent_id); - Some(tcx.hir().local_def_id(parent_id)) + // If this 'impl Trait' is nested inside another 'impl Trait' + // (e.g. `impl Foo>`), we need to use the 'parent' + // 'impl Trait' for its generic parameters, since we can reference them + // from the 'child' 'impl Trait' + if let Node::Item(hir::Item { kind: ItemKind::OpaqueTy(..), .. }) = + tcx.hir().get(parent_id) + { + Some(tcx.hir().local_def_id(parent_id)) + } else { + None + } } else { None }