about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCamille GILLOT <gillot.camille@gmail.com>2021-01-31 11:01:49 +0100
committerCamille GILLOT <gillot.camille@gmail.com>2021-02-15 19:32:29 +0100
commit7878fa70d6ddac3528d6523ac732fade6e5ae93b (patch)
tree40f9d68a0cbc7b940bc55fb14b2d9eb151b05dbb
parent996dc8d5c55a496bfbdc99a936fb6055bcbe2fcd (diff)
downloadrust-7878fa70d6ddac3528d6523ac732fade6e5ae93b.tar.gz
rust-7878fa70d6ddac3528d6523ac732fade6e5ae93b.zip
Fix E0657.
-rw-r--r--compiler/rustc_resolve/src/late/lifetimes.rs32
1 files changed, 20 insertions, 12 deletions
diff --git a/compiler/rustc_resolve/src/late/lifetimes.rs b/compiler/rustc_resolve/src/late/lifetimes.rs
index 56e60d73fa8..c0e4a1bdf07 100644
--- a/compiler/rustc_resolve/src/late/lifetimes.rs
+++ b/compiler/rustc_resolve/src/late/lifetimes.rs
@@ -632,24 +632,32 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
                                 let hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id);
                                 // Ensure that the parent of the def is an item, not HRTB
                                 let parent_id = self.tcx.hir().get_parent_node(hir_id);
-                                let parent_item_id =
-                                    hir::ItemId { def_id: parent_id.expect_owner() };
-                                let parent_impl_id =
-                                    hir::ImplItemId { def_id: parent_id.expect_owner() };
-                                let parent_trait_id =
-                                    hir::TraitItemId { def_id: parent_id.expect_owner() };
-                                let krate = self.tcx.hir().krate();
-
-                                if !(krate.items.contains_key(&parent_item_id)
-                                    || krate.impl_items.contains_key(&parent_impl_id)
-                                    || krate.trait_items.contains_key(&parent_trait_id))
+                                let parent_is_item = if let Some(parent_def_id) =
+                                    parent_id.as_owner()
                                 {
+                                    let parent_item_id = hir::ItemId { def_id: parent_def_id };
+                                    let parent_impl_id = hir::ImplItemId { def_id: parent_def_id };
+                                    let parent_trait_id =
+                                        hir::TraitItemId { def_id: parent_def_id };
+                                    let parent_foreign_id =
+                                        hir::ForeignItemId { def_id: parent_def_id };
+                                    let krate = self.tcx.hir().krate();
+
+                                    krate.items.contains_key(&parent_item_id)
+                                        || krate.impl_items.contains_key(&parent_impl_id)
+                                        || krate.trait_items.contains_key(&parent_trait_id)
+                                        || krate.foreign_items.contains_key(&parent_foreign_id)
+                                } else {
+                                    false
+                                };
+
+                                if !parent_is_item {
                                     struct_span_err!(
                                         self.tcx.sess,
                                         lifetime.span,
                                         E0657,
                                         "`impl Trait` can only capture lifetimes \
-                                         bound at the fn or impl level"
+                                             bound at the fn or impl level"
                                     )
                                     .emit();
                                     self.uninsert_lifetime_on_error(lifetime, def.unwrap());