@@ -632,24 +632,32 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
632632 let hir_id = self . tcx . hir ( ) . local_def_id_to_hir_id ( def_id) ;
633633 // Ensure that the parent of the def is an item, not HRTB
634634 let parent_id = self . tcx . hir ( ) . get_parent_node ( hir_id) ;
635- let parent_item_id =
636- hir:: ItemId { def_id : parent_id. expect_owner ( ) } ;
637- let parent_impl_id =
638- hir:: ImplItemId { def_id : parent_id. expect_owner ( ) } ;
639- let parent_trait_id =
640- hir:: TraitItemId { def_id : parent_id. expect_owner ( ) } ;
641- let krate = self . tcx . hir ( ) . krate ( ) ;
642-
643- if !( krate. items . contains_key ( & parent_item_id)
644- || krate. impl_items . contains_key ( & parent_impl_id)
645- || krate. trait_items . contains_key ( & parent_trait_id) )
635+ let parent_is_item = if let Some ( parent_def_id) =
636+ parent_id. as_owner ( )
646637 {
638+ let parent_item_id = hir:: ItemId { def_id : parent_def_id } ;
639+ let parent_impl_id = hir:: ImplItemId { def_id : parent_def_id } ;
640+ let parent_trait_id =
641+ hir:: TraitItemId { def_id : parent_def_id } ;
642+ let parent_foreign_id =
643+ hir:: ForeignItemId { def_id : parent_def_id } ;
644+ let krate = self . tcx . hir ( ) . krate ( ) ;
645+
646+ krate. items . contains_key ( & parent_item_id)
647+ || krate. impl_items . contains_key ( & parent_impl_id)
648+ || krate. trait_items . contains_key ( & parent_trait_id)
649+ || krate. foreign_items . contains_key ( & parent_foreign_id)
650+ } else {
651+ false
652+ } ;
653+
654+ if !parent_is_item {
647655 struct_span_err ! (
648656 self . tcx. sess,
649657 lifetime. span,
650658 E0657 ,
651659 "`impl Trait` can only capture lifetimes \
652- bound at the fn or impl level"
660+ bound at the fn or impl level"
653661 )
654662 . emit ( ) ;
655663 self . uninsert_lifetime_on_error ( lifetime, def. unwrap ( ) ) ;
0 commit comments