diff options
| author | Camille GILLOT <gillot.camille@gmail.com> | 2021-01-31 11:01:49 +0100 |
|---|---|---|
| committer | Camille GILLOT <gillot.camille@gmail.com> | 2021-02-15 19:32:29 +0100 |
| commit | 7878fa70d6ddac3528d6523ac732fade6e5ae93b (patch) | |
| tree | 40f9d68a0cbc7b940bc55fb14b2d9eb151b05dbb | |
| parent | 996dc8d5c55a496bfbdc99a936fb6055bcbe2fcd (diff) | |
| download | rust-7878fa70d6ddac3528d6523ac732fade6e5ae93b.tar.gz rust-7878fa70d6ddac3528d6523ac732fade6e5ae93b.zip | |
Fix E0657.
| -rw-r--r-- | compiler/rustc_resolve/src/late/lifetimes.rs | 32 |
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()); |
